Add File Appender using log4j2 programmatically at runtime

Viewed 23

Now we migrating from log4j to log4j2. Configuration file is not changed (is includes only Console appender). We want to add File Appender at runtime, so log files are created but logs are not appeared. When we used log4j, we made this way:

    PatternLayout layout = new PatternLayout("%d - " + DEFAULT_CONVERSION_PATTERN);
    FileAppender fileAppender = new FileAppender(layout, file.getPath());
    fileAppender.setName("fileAppender");
    logger.removeAllAppenders();
    logger.addAppender(fileAppender);
    logger.addAppender(new ConsoleAppender(layout));

And it worked fine. But when we moved to log4j2, we started using this code:

    PatternLayout layout = PatternLayout.newBuilder().withPattern("%d - " + DEFAULT_CONVERSION_PATTERN).build();
    FileAppender fileAppender = FileAppender.newBuilder().setLayout(layout).withFileName(file.getPath())
                    .setName("fileAppender").build();
    LoggerContext.getContext().getLogger(name).getAppenders().clear();
    LoggerContext.getContext().getLogger(name).addAppender(fileAppender);
    LoggerContext.getContext().getLogger(name).addAppender(ConsoleAppender.newBuilder().setLayout(layout).build());

File is created but logs appear only in Console... Can someone help please with valid creating FileAppender?

1 Answers

From what you describe, it seems you successfully instantiated a FileAppender that is ready to log messages it receives, but somehow no message is passed to this Appender.

Somehow your code example calls a nonexisting method LoggerContext.getContext() - I believe this should be LoggerContextFactory.getContext() or LogManager.getContext(). And in total, you may want to check the example from the documentation.

Related