很早之前就想寫個能記錄函數模塊日志的通用工具,最早嘗試時,沒有想清楚插入代碼的體積過大問題的解決方案。在一些群友的提醒下,了解到可以用特殊辦法來處理這一問題。不過當時比較忙,沒有動筆,后來也漸漸忘記。最近又想起這件事,花了2天完成了一個初步的實現。介紹給大家,希望能有參考價值。
本文鏈接:https://www.cnblogs.com/hhelibeb/p/13560754.html
原創內容,轉載請注明
2020.10.20 前些天發現了一些bug,之前下載過的話請更新到最新版。
簡介
目標
本工具有幾個目標:
- 把日志數據存儲到一個統一日志表中,避免為每個接口創建日志表,從而減少重復工作量。
- 用一段通用代碼實現日志存儲,可以通過配置表來開關功能。
- 以JSON格式存儲日志,並提供一定的索引查詢功能。
- 允許根據日志的唯一ID來重處理數據(類似事務代碼WE19)。
目前目標1, 2已經實現,3, 4部分實現,還在完善中。
原理
基本原理是使用一些動態編程技術,在函數運行時獲取參數值,轉換為JSON數據存儲到表中。
日志使用唯一ID作為主鍵。
重處理時,根據日志記錄,動態生成ABAP變量,並從JSON中獲取值,賦值給變量,再動態地調用日志中記錄的FM。
代碼量目前還很比較少,只有幾百行,可以閱讀包含文件ZAFL_MACROS和類ZCL_AFL_UTILITIES以了解更多細節。
關於ABAP動態編程,如果有不懂的地方,可以參考:這一系列文章:Dynamic Programming in ABAP
項目地址
項目名:abap fm logger
Github地址:https://github.com/hhelibeb/abap-fm-logger
請使用ABAPGIT安裝,如果你覺得有幫助的話,歡迎Star.
使用
介紹abap fm logger的用法,包含代碼、配置、報表等。
報表
日志存儲在表ZAFL_LOG中,報表程序ZAFL_VIEWER可以用於查詢/重處理日志
點擊JSON字段可以查看參數詳情。
選中日志行,點擊工具欄的“Process Selected Item”,則程序會嘗試使用選中的日志的參數記錄重新調用相應接口。
日志存儲
只需要2個復制粘貼就能完成代碼部分,非常簡單:
1, 添加包含文件ZAFL_MACROS到需要記錄日志的FM的函數組中,
FUNCTION-POOL zzxxxx. INCLUDE zafl_macros.
2, 在函數中調用相應的宏,
FUNCTION z_fm. **初始化logger,需要在FM的開頭部分調用 /afl/log_init. **可選,最多指定3個用於搜索的字段(比如公司代碼、物料號等) /afl/set_custom_fields 'cust field1' 'cust field2' 'cust field3'. **可選,記錄狀態碼,如S/E等,最多2位 /afl/set_status 'S' 'message'. **保存日志,必須在FM的結尾處 /afl/save. ENDFUNCTION.
這里, /afl/log_init 和 /afl/save 是必選的,而 /afl/set_custom_fields 和 /afl/set_status 提供了一些靈活功能,可以按需選擇是否調用。
配置
表ZAFL_CONFIG用於配置abap fm logger的功能,選項包括,
- FNAME: 函數模塊名。
- ENABLED: 如勾選,啟用日志記錄功能。
- EXPORT: 如勾選,啟用Export參數的記錄。
- IMPORT: 如勾選,啟用IMPORT參數的記錄。
- TABLE_IN: 如勾選,啟用TABLES參數的記錄(在函數開始時)。
- TABLE_OUT: 如勾選,啟用TABLES參數的記錄(在函數結束時)。
另外還可以指定3個索引字段的顯示名(CUST_NAME),它們會影響的ZAFL_VIEWER中的顯示效果。
可以使用事務SM30維護配置。
待改進
目前發現有2個問題需要改進,
- 如果接口包含CURR類型字段,雖然可以正常記錄日志,但重處理時會無法讀取日志中的CURR類型字段值。2020.10.21已經在最近的更新中解決了這個問題。
- 沒有按字段值搜索日志的功能(類似事務代碼WE10)。
- 不支持tables參數。 2020.10.02 已經增加tables參數支持。
希望近期可以改進。
兼容性
評論區有小伙伴指出目前ZAFL_VIEWER程序對/UI2/CL_JSON有版本要求。如果你運行程序時發現類似問題,可以嘗試安裝JSON2ABAPType,用里面的ZUI2_JSON代替系統標准類,作為ZAFL_JSON的父類。或者可以自行尋找較高版本的/UI2/CL_JSON安裝。