java - Log4j2 初始化后配置 FileAppender

标签 java logging log4j2

我在为我的 log4j2 记录器配置新的 FileAppender 时遇到问题。问题是我只知道应用程序启动后应该附加日志的文件的路径,所以我尝试按照这些说明 here 进行操作。用于在log4j2初始化后修改原始配置。

我已经阅读了很多有关堆栈溢出的类似问题的答案,但其中大多数都是针对早期 log4j 版本的,并且无法工作,因为他们现在已将面向配置的插件实现到 log4j 中本身。

应用成功创建日志文件,但不会向其中写入任何内容。我故意将该测试日志消息置于 ERROR 级别,以便我可以验证它不是与日志级别阈值或其他相关的任何问题。

我对 log4j2 配置有点陌生,此时感觉有点迷失。

我的 log4j2.xml 文件(非常基本)如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Properties>
        <Property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
             <PatternLayout pattern="${PATTERN}"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

此外,这是应该添加新 FileAppender 的方法:

public static void initLogFile(String path, Level level) {
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    final Configuration config = ctx.getConfiguration();
    Layout layout = PatternLayout.createDefaultLayout(config);
    Appender appender = FileAppender.createAppender(path, "false", "true",
            "RollingFile", "true", "false", "false", "8000", null, null,
            "false", null, config);
    appender.start();
    config.addAppender(appender);
    AppenderRef ref = AppenderRef.createAppenderRef("RollingFile", null,
            null);
    AppenderRef[] refs = new AppenderRef[] { ref };
    LoggerConfig loggerConfig = LoggerConfig.createLogger("false", level,
            "org.apache.logging.log4j", "true", refs, null, config, null);
    loggerConfig.addAppender(appender, null, null);
    config.addLogger("org.apache.logging.log4j", loggerConfig);
    ctx.updateLoggers();
    System.out.println("Logger initialized");
}

还有我的 Main 方法,它所做的第一件事就是尝试更改记录器配置以写入我想要的文件:

static final Logger log = LogManager.getLogger(Main.class.getName());
  public static void main( String[] args )
    {
        // Init
        System.out.println("Initializing logger");
        Utils.initLogFile("C:/Users/Jorge/Desktop/logtest/test.log", Level.DEBUG);

        log.error("test error message");

        ...
 }

最佳答案

只有应用程序启动后才知道路径是什么意思?无论如何,您应该始终能够使用查找来确定文件路径。如果路径被指定为应用程序的参数之一,您应该能够使用主参数查找。

需要明确的是,您的配置应该类似于:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Properties>
    <Property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Property>
</Properties>
<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
         <PatternLayout pattern="${PATTERN}"/>
    </Console>
    <File name="file" fileName="${main:--logFile}">
         <PatternLayout pattern="${PATTERN}"/>
    </File> 
</Appenders>
<Loggers>
    <Logger name="org.apache.logging.log4j" level="${main:--level}">
       <AppenderRef ref="file"/>
    </Logger>
    <Root level="debug">
        <AppenderRef ref="Console" />
    </Root>
</Loggers>

请注意,我已经配置了文件附加程序。您的示例代码正在创建一个文件附加程序,但由于某种原因将其命名为“RollingFile”。

关于java - Log4j2 初始化后配置 FileAppender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36891383/

相关文章:

java - 如何使用我的日志格式简单地创建我自己的自定义控制台记录器?

java - log4j2 中的空 Threadcontext 大括号场景处理

java - 在 JBoss 中使用代理服务器配置 Websphere MQConnectionFactory

java - 尽管场景中不存在该对象,为什么我仍能获得匹配项

Java Swing Die绘图

java - 如何在jsp JSTL中缓存显示标签的对象

function - 有关如何连接持久函数依赖注入(inject)的示例

c - 使用 syslog 时禁用/启用日志记录

java - CXF LoggingFeature 不记录入站请求

Spring Boot父log4j2更新-漏洞修复