在客户程序中读取 SLG1 日志

Reading SLG1 logs in a customer program

我正在开发用于改变 SAP 设备数据的网关和代理接口。为了了解传入的数据发生了什么,我一直在使用 BAL_* 功能模块记录数据。它工作正常,到目前为止很有帮助。

尽管最终我们将拥有专门通过 Web 前端工作并且无法访问 SAP GUI 的最终用户。他们不能使用交易 SLG1。因此,我被要求创建一个网关实体,以便我们的前端开发人员可以为日志中的消息创建一个漂亮的视图。我已经注意到为每个日志创建了一个句柄,例如看起来像 051MjXRE7jMmdAR2X6GWoW 的句柄。我在每个 'run' 和每个 'handle' 之间建立了关联。

我在谷歌上搜索了很多,找到了函数组 BAL_DSP_LOG_DISPLAY,以及其他 BAL_* 函数,例如 BAL_LOG_EXIST 等等。不管我用这几个函数中的哪一个,都一直报日志不存在(然后括号里,内存中找不到)。除了首先创建它然后立即显示它之外,我还没有真正找到使用这些功能的示例。我假设因为日志刚刚创建,数据已经在内存中并且可以显示。

但是,我做不到。大多数对该接口的调用都是异步的,我无法将消息发送回客户端,也没有 SAP GUI。同样,在深入研究函数并返回一个检查内存的宏时,我发现它显然可以,但什么也没有。

有使用此日志经验的人知道如何正确准备功能组以供使用吗?我假设我必须在调用它之前将它加载到内存中,但我自己还没有找到一个可以做这样的事情。

I've made an association between each 'run' and each 'handle'.

这应该不是必需的,因为您可以将 "run ID" 作为外部密钥 (BAL_S_LOG-EXTNUMBER) 存储在协议 header 数据中 - 但没关系。

您假设协议需要首先加载到内存中是正确的——这就是 BAL_DB_SEARCHBAL_DB_LOAD 的目的。软件包 SZAL 中提供了大量的演示程序和文档。对于这种情况,您可能需要检查 SBAL_DEMO_05


上面技术的技术解释: FORM load用于确保函数组SBAL的加载(字节码)被加载,否则ASSIGN语句如果不是这样的话就会失败。它只是防止错误调用的保护措施,而不是 on-demand 加载工具。

您可以直接从加入 BALHDRBALDAT table 的数据库中读取日志。 BALHDR table 包含 LOG_HANDLE 字段,您可以使用收集的句柄轻松查询。
但是,最方便的方法是使用 APPL_LOG_READ_DB FM。该模块包含大量搜索参数,可以检索您想要的任何日志。