很早之前就想写个能记录函数模块日志的通用工具,最早尝试时,没有想清楚插入代码的体积问题。在一些群友的提醒下,了解到可以用宏来处理这一问题。不过当时比较忙,就没有动笔。最近又想起这件事,花了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)
 
 
 
 
 
 

最新文章

  1. android listview item取消按点击效果
  2. 2015.4.20 Canvas Jquery 移动端 JavaScript
  3. Acadia Lab 203 + Lab 231
  4. java之StringBuffer类详解
  5. eclipse中tomcat能正常启动,但是浏览器访问不了tomcat首页
  6. linux下的基本网络配置
  7. Java中HashMap,LinkedHashMap,TreeMap的区别[转]
  8. 程序语言的奥妙:算法解读 ——读书笔记
  9. Template_17_metaprogram
  10. VBS基础篇 - 条件语句
  11. css盒子模型,定位,浮动
  12. tangible T4 Editor 2.2.3 for VS2010 / VS2012 / VS2013 Preview
  13. java设计模式之——代理模式
  14. js实现双击后网页自己主动跑-------Day55
  15. addEventListener
  16. oracle批量插入测试数据
  17. border-radius 圆角
  18. C# out ref 用法总结
  19. vue 统一处理token失效问题
  20. pycharm License server激活

热门文章

  1. Canal工作原理
  2. MyBatis-Plus使用(1)-概述+代码生成器
  3. 7月13日考试 题解(DFS序+期望+线段树优化建图)
  4. 网络安全传输系统-sprint2线程池技术优化
  5. 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!
  6. python获取系统内存占用信息的实例方法
  7. 90行代码让微信地球转起来,太酷了!(python实现)
  8. 云原生数据库mysql对共享存储分布式文件系统的接口需求分析
  9. Vue老项目支持Webpack打包
  10. Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?