从自定义侦听器捕获log4j2 LogEvents

时间:2016-07-05 22:14:37

标签: java logging configuration log4j2

有人知道是否可以在log4j上创建一个监听器来捕获来自命名方法/类的每个日志?最终目的是将检索到的日志添加到JPanel中。

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" name="config">
    <Properties>
        <Property name="LOG_DIR">logs</Property>
        <Property name="ARCHIVE">logs/archive</Property>
        <Property name="PATTERN">%-5level %d [%t] %c:%M(%L): %m%n</Property>
    </Properties>
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN}"/>
        </Console>

        <RollingFile name="fileWriter"
                     fileName="${LOG_DIR}/logs.log"
                     filePattern="${ARCHIVE}/logs.log.%d{yyyy-MM-dd-hh-mm}.gz">
            <PatternLayout pattern="${PATTERN}"/>
            <TimeBasedTriggeringPolicy/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="fileWriter"/>
        </Root>
    </Loggers>
</Configuration>

日志示例

  public class MyClass() {
    private final static Logger logger = LogManager.getLogger();

    public void method() {
      logger.info("Some text...");
      logger.info("More text...");
    }
  }

谢谢!

1 个答案:

答案 0 :(得分:1)

我这样做的方法是编写一个自定义的log4j2 appender。这实际上很容易用Log4j 2.这是一个让你入门的例子:https://stackoverflow.com/a/24220688/1446916

示例打印到控制台,但在您的情况下,您将附加到文本区域。 (实际上,您希望将Runnable提交到SwingUtils.invokeLater(),将文本附加到文本区域.Swing要求所有交互都在AWT事件线程中进行。)

唯一剩下的就是将这两者连接在一起。您可以通过一些静态查找使文本区域可用。如果在接收日志事件时尚未初始化文本区域,您可能需要考虑如何操作。删除事件,或将它们排队并稍后追加它们?