拦截Log4J条目

时间:2015-09-30 07:06:18

标签: java logging log4j

我们的一个系统是作为第三方定制工作流产品的包装而构建的,我们无法改变这些产品。

最近我们收到了捕获一些用户活动数据的请求,这些数据在应用程序日志中没有其他地方存在。这些日志文件分布在多台计算机上,因此分析这些日志以提取所需信息将是一项相对复杂的任务。

考虑创建一些方面来审核这些用户操作,但很快就用完了,提供了反编译和查看所需的第三方代码。在生产应用程序服务器上激活加载时编织也存在安全限制。

我最初的想法是将我们感兴趣的日志输出重定向到不同的文件(实际上是文件),然后分析这些文件来处理这些数据。这似乎可行,但是当你开始考虑事情时,你很快就会发现在处理文件时要处理的很多问题:日志翻转,没有交易,跟踪处理的内容和不处理的内容等等。

我的第二个想法是实现自定义模式布局并将其配置为用于我感兴趣的日志。易于编写,除了将消息发送到日志文件之外,还要远离第三方代码将日志条目保存到表中。一旦进入表格,我可以从那里开始做我想做的一切。代码片段如下:

public class CustomPatternLayout extends Layout {
    private final PatternLayout patternLayout;
    private SimpleJdbcTemplate simpleJdbcTemplate;

    public CustomPatternLayout() {
        System.out.println("Creating CustomPatternLayout instance");
        patternLayout = new PatternLayout("%m%n");
        simpleJdbcTemplate = new SimpleJdbcTemplate(...);
    }
    ...
    protected PatternParser createPatternParser(String pattern) {
        System.out.println("CustomPatternLayout: returning pattern parser");
        return new PatternParser(pattern);
    }

    public String format(LoggingEvent event) {
        String log = patternLayout.format(event);
        System.out.println("CustomPatternLayout: about to write log entry to the database: " + log);
        simpleJdbcTemplate.update("INSERT INTO my_login_tracker (log_entry) values (?)", log);
        return log;
    }

完成后我将其添加到我的log4j.properties

log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.layout=my.org.utils.logging.CustomPatternLayout

我可以在日志中看到我的系统输入条目表明我的自定义模式布局已创建和配置。但是实际的format方法永远不会被调用,因此我的表中没有保存任何内容。日志中仍有大量日志条目,看起来我的自定义模式布局似乎没有使用。

之前我使用过这个策略,可以在日志中输出线程ID,并且完美运行。我承认这是一个独立的Java应用程序,而不是在webshere应用程序服务器上运行的那个。

有关导致此问题以及如何解决问题的任何想法?在不涉及大量技术的情况下完成工作的替代方法?

提前感谢您的意见。

0 个答案:

没有答案