有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Lombok以编程方式设置Log4j属性

Log4j允许我轻松设置每个类的日志记录。我想在初始化时更改JavaFX应用程序的属性。我想做的是在用户的%appdata%/<app>/<version>目录下创建日志文件(为了举例)。我发现一个documentation关于以编程方式设置记录器的属性

我有一个非常相似的Log4jConfigurationFactory,如下所示

public class Log4jConfigurationFactory extends ConfigurationFactory {
    @Override
    protected String[] getSupportedTypes() {
        return new String[] {"*"};
    }

    private static Configuration createConfiguration(final String name, ConfigurationBuilder<BuiltConfiguration> builder) {
        builder.setConfigurationName(name);
        builder.setStatusLevel(Level.DEBUG);

        builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL).
                addAttribute("level", Level.DEBUG));
        AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").
                addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
        appenderBuilder.add(builder.newLayout("PatternLayout").
                addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
        appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
                Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));

        builder.add(appenderBuilder);
        builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG).
                add(builder.newAppenderRef("Stdout")).
                addAttribute("additivity", false));
        builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
        return builder.build();
    }

    @Override
    public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
        return getConfiguration(loggerContext, source.toString(), null);
    }

    @Override
    public Configuration getConfiguration(final LoggerContext loggerContext, final String name, final URI configLocation) {
        ConfigurationBuilder<BuiltConfiguration> builder = newConfigurationBuilder();
        return createConfiguration(name, builder);
    }
}

我的主要课程如下:

@Log4j2
public class App extends GenericApplication { // this GenericApplication extends Application, it is from a library I use, no worries.
    @Override
    public void init() throws Exception {
        super.init();
        log.debug("Hey."); // for testing purposes
    }

    @Override
    public void start(Stage primaryStage) {
        super.start(primaryStage);
    }

    @Override
    public void stop() throws Exception {
        log.error("Hey."); // for testing purposes
    }

    public static void main(String[] args ) {
        GenericApplication.launch(args);
    }
}

问题是Log4j自然地找不到我的定制Log4jConfigurationFactory。Lombok似乎没有Log4j注释来提供一个定制的ConfigurationFactory(根据它的documentation,唯一的参数Log注释可能是topic,其目的是提供一个人类可读的(?)Logger标题。)

那么,如何将自定义ConfigurationFactory与Lombok一起使用呢

提前谢谢


环境

Group ID: org.projectlombok
Artifact ID: lombok
Version: 1.16.20

Group ID: org.apache.logging.log4j
Artifact ID: log4j-core
Version: 2.11.0

共 (0) 个答案