以编程方式从log4j获取日志事件

时间:2015-11-24 10:00:58

标签: java logging log4j2

我正在编写一个Web应用程序,用户(以及许多其他东西)可以构建和运行自己的脚本。脚本在后端运行,它们可能会或可能不会生成错误 - 此类错误会立即写入系统日志。

用户通过Web应用程序本身查看这些日志事件将是有益的,所以我想管道和管道。以某种方式从log4j过滤它们(在事件到达磁盘之前),以便我可以以编程方式访问它们。 Elasticsearch有类似于此的东西 - 当没有找到结果时,它会显示在给定时间范围内发生的错误。

我想我可以抽象掉日志,并确保所有事件都发送到log4j和客户端,但我希望有更好的方法,而不必触摸记录器调用(或从日志文件中读取。)

看了一下log4j2网站,但没有找到任何有用的东西 - 有什么想法可以达到这样的目的吗?

3 个答案:

答案 0 :(得分:2)

要拦截记录事件,您可以将您的部分插入三个点:

    log4j之后的
  • :让Log4j登录到你可以轻松找到的东西"查询"在你的申请中。有各种Appender可用于此。登录到数据库是一种选择,您可以登录标准输出并将其重定向到您的应用程序中,这样您就可以获得某种流

  • 使用appender:您可以实现自己的appender,使用log4j进行配置,并在那里做任何你想做的事。

  • 在log4j之前
  • :将对Log4j Logger的每次调用包装到您自己的实现中,并在实际记录事件之前或之后在那里执行您的逻辑。

appender方法似乎是最优雅的:它允许使用log4j配置选项来控制在前端显示的内容,以及什么不是,并且由于appender在同一个文件中配置,因此不太可能有人禁用记录由于没有意识到它对用户很重要。但它需要最多关于log4j内部的知识。

答案 1 :(得分:1)

一种可能的解决方案可能是使用管道输入流。

// pipes output in the output stream to the input stream
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);

// create custom l4j appender
Appender customAppender = new WriterAppender(
                                  new PatternLayout("%-5p %d [%t][%F:%L] : %m%n"), out);

//use any logger:
logger.addAppender(customAppender);
//or the root logger: Logger.getRootLogger().addAppender(customAppender);

// write a test message to log
logger.error("test");

// printing entries in piped input stream
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
String line;
while (bufferedReader.ready() && (line = bufferedReader.readLine()) != null) {
    System.out.println("log entry: " + line);
}

结果输出:

log entry: ERROR 2015-11-24 11:58:18,366 [main][Main.java:52] : test

原因是您可以为appender使用过滤器(或定义自己的过滤器)。 例如,要过滤日志级别范围:

LevelRangeFilter levelRangeFilter = new LevelRangeFilter();
levelRangeFilter.setLevelMin(Level.INFO);
levelRangeFilter.setLevelMax(Level.ERROR);
customAppender.addFilter(levelRangeFilter);

答案 2 :(得分:0)

由于您不想解析日志,我会选择登录数据库。一个建议可能是log4j_logging_database。

这当然意味着您编写查询并格式化日志记录以使其可以从sql解析,并构建一种方法将这些呈现给客户端。

您可以找到教程here。有一个日志记录级别,因此您可以根据您的配置筛选出错误和重要人员。不要忘记将索引添加到感兴趣的表列中,因为日志记录在一段时间后会变得很大。

最诚挚的问候,

萨诺斯