java - 从自定义监听器捕获 log4j2 LogEvents

标签 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...");
    }
  }

谢谢!

最佳答案

我这样做的方法是编写自定义 log4j2 appender。这实际上使用 Log4j 2 很容易做到。下面是一个帮助您入门的示例:https://stackoverflow.com/a/24220688/1446916

该示例打印到控制台,但在您的情况下,您将追加到文本区域。 (实际上,您想向 SwingUtils.invokeLater() 提交一个 Runnable,它将文本附加到文本区域。Swing 要求所有交互都发生在 AWT 事件线程中。)

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

关于java - 从自定义监听器捕获 log4j2 LogEvents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213707/

相关文章:

ios - 在 iOS 中,哪里是存储配置值的正确位置?

java - 如何使用 google gson 库解析下面给出的 json

Java 日历不改变值

java - Java Getter Setter,传递私有(private)变量

amazon-web-services - AWS 托管 Airflow 不获取日志

visual-studio-2015 - 如何从.NET Core中的appsettings.json配置嵌套对象?

java - 在http get方法中传递复杂的参数

asp.net-core - 带有 json 格式化程序的控制台记录器不会序列化对象

.net - 日志框架与 System.Diagnostics 跟踪

symfony2 如何创建自己的自定义 yml 文件以在全局共享?