1. 程式人生 > >SAP ABAP RFC介面通用日誌工具:abap fm logger

SAP ABAP RFC介面通用日誌工具:abap fm logger

很早之前就想寫個能記錄函式模組日誌的通用工具,最早嘗試時,沒有想清楚插入程式碼的體積過大問題的解決方案。在一些群友的提醒下,瞭解到可以用巨集來處理這一問題。不過當時比較忙,沒有動筆,後來也漸漸忘記。最近又想起這件事,花了2天完成了一個初步的實現。介紹給大家,希望能有參考價值。

 

本文連結:https://www.cnblogs.com/hhelibeb/p/13560754.html

簡介

目標

本工具有幾個目標:

  1. 把日誌資料儲存到一個統一日誌表中,避免為每個介面建立日誌表,從而減少重複工作量。
  2. 用一段通用程式碼實現日誌儲存,可以通過配置表來開關功能。
  3. 以JSON格式儲存日誌,並提供一定的索引查詢功能。
  4. 允許根據日誌的唯一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引數的記錄。


另外還可以指定3個索引欄位的顯示名(CUST_NAME),它們會影響的ZAFL_VIEWER中的顯示效果。
可以使用事務SM30維護配置。

待改進

目前發現有2個問題需要改進,

  • 如果介面包含CURR型別欄位,雖然可以正常記錄日誌,但重處理時會無法讀取日誌中的CURR型別欄位值。
  • 沒有按欄位值搜尋日誌的功能(類似WE10)。

希望近期可以改進。

 

(注:嚴格來說它應該叫做函式模組介面通用日誌工具,標題中的RFC是為了搜尋關鍵字考慮的,因此這個工具的正式名稱也叫做abap fm logger)               &nbs