以编程方式创建 log4j 异步记录器

5 java logging asynchronous log4j

我正在使用 Log4J 2.10。

我正在尝试以编程方式创建异步记录器\附加程序。我需要有两件事:

  1. 我应该能够在运行时为日志文件指定文件路径。
  2. 我需要在运行时指定模式。

我可以想出下面的代码。但我无法将 RollingFileAppender 添加到 AsyncAppender。网上有使用 AsyncAppender.wrap 的例子。但是该 API 似乎不适用于 Log4J 2.10。

你知道我怎么能做到这一点吗?

void createLog4JLogger(final String logFilePath) {
    
    LoggerContext context = (LoggerContext) LogManager.getContext();
    final Configuration config = context.getConfiguration();

    final PatternLayout patternLayout = PatternLayout.newBuilder().withPattern(CONVERSION_PATTERN).withCharset(Charset.defaultCharset()).build();

    final RollingFileAppender fileAppender = 
            RollingFileAppender.newBuilder().withName(APPENDER_NAME).withLayout(patternLayout).withFileName(logFilePath).build();
    
    AppenderRef ref = AppenderRef.createAppenderRef(APPENDER_NAME, null, null);
    AppenderRef[] refs = new AppenderRef[] {ref};
    
    final AsyncAppender asyncAppender = AsyncAppender.newBuilder().setAppenderRefs(refs).setName(APPENDER_NAME).setConfiguration(config).build();
    
    LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.INFO, LOGGER_NAME, LOGGER_NAME, refs, null, null, null);
    loggerConfig.addAppender(asyncAppender, null, null);
    
    
    config.addAppender(asyncAppender);
    config.addLogger(LOGGER_NAME, loggerConfig);
    
    
    context.updateLoggers(config);
    
    final Logger logger = LogManager.getContext().getLogger(LOGGER_NAME);
    
    
    logger.info("HELLO_WORLD");
    
}
Run Code Online (Sandbox Code Playgroud)

小智 0

您可以使用下面的代码在 log4j 2 中创建异步记录器。

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
Layout layout = PatternLayout.newBuilder().withConfiguration(ctx.getConfiguration()).withPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - test %msg%n").build();
Appender appender = FileAppender.newBuilder().withFileName("logs/test.log").setLayout(layout)
                    .setConfiguration(config).setName("TestApp").build();
AppenderRef ref = AppenderRef.createAppenderRef("TestApp",Level.INFO, null);

config.addAppender(appender);
appender.start();
AppenderRef[] refs = new AppenderRef[] {ref};
LoggerConfig loggerConfig= AsyncLoggerConfig.createLogger(true, Level.INFO, "test","test", refs, null, config, null);
loggerConfig.addAppender(appender, Level.INFO, null);
config.addLogger("test", loggerConfig);
loggerConfig.start();
Run Code Online (Sandbox Code Playgroud)