当前位置: 首页 > 知识库问答 >
问题:

使用log4j编程API设置根记录器appender模式

纪枫
2023-03-14

我试图配置使用log4j编程api之一的根记录器的模式。这就是我所拥有的,它正在删除默认记录器,我知道重新配置,setLevel和setRootLevel正在工作,但是新的ConsoleAppender实际上没有记录任何内容

private static void configureLog4j(Level rootLevel, Map<String, Level> levelMap) {
    var pattern = PatternLayout.newBuilder().withPattern( "%highlight{[%t] %-5level: %msg%n%throwable}\n" ).build();
    var console = ConsoleAppender.createDefaultAppenderForLayout( pattern );
    var config = LoggerContext.getContext().getConfiguration();
    config.addAppender( console );

    var root = config.getRootLogger();
    for ( var appenderRef : root.getAppenderRefs() ) {
      root.removeAppender( appenderRef.getRef() );
    }
    root.addAppender( console, rootLevel, null );
    Configurator.setRootLevel( rootLevel );
    Configurator.setLevel( levelMap );
    Configurator.reconfigure(config);
  }

我也尝试了其他API,同样的运气。如何修复我的代码?

这里有一个完整的链接到我的来源,对不起,我一直在努力,所以行号可能会改变。

https://github.com/xenoterracide/brix/blob/master/src/main/java/com/xenoterracide/brix/Application.java#L108

共有1个答案

鲜于凯康
2023-03-14

使现代化

以编程方式配置log4j2的唯一方法似乎是使用配置生成器创建新的配置。这样它将停止默认配置并使用新配置初始化。

ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
AppenderComponentBuilder appenderBuilder = builder.newAppender("console", "CONSOLE").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%highlight{[%t] %-5level: %msg%n%throwable}\n"));
builder.add(appenderBuilder);
builder.add(builder.newRootLogger(rootLevel).add(builder.newAppenderRef("console")));
levelMap.forEach((s, level) -> builder.add(builder.newLogger(s, level)));
Configurator.initialize(builder.build());

起初的

也许您的意思是在重新配置记录器后设置级别和rootLevel。您使用的方式应用于现有的记录器。

Configurator.reconfigure(config);
Configurator.setRootLevel( rootLevel );
Configurator.setLevel( levelMap );
 类似资料:
  • 我的记录器只记录根记录器ServerAppenderV2上的消息,日志文件是正确生成的,当我在root中使用change the level to debug时,我可以在root中定义的两个appender中看到日志,但在文件appenders FileAppender和perfappender中仍然没有日志。 对于以下代码: 下面是我的Logger类和标记: 下面是我的配置log4j2.xml:

  • 问题内容: 我正在尝试第一次使用SLF4J(带绑定)。 我想配置3个不同的命名,它们可以由返回,将记录不同的级别并将消息推送到不同的附加程序: 记录器1记录调试并附加到 记录器2记录TRACE +并追加到 记录器3记录ERROR +并追加到其他记录器 此外,我希望以编程方式配置它们(使用Java,而不是XML或log4j.properties文件)。 我想通常,我会在一些自举代码中的某处(如ini

  • 我有一个maven项目,它使用log4j2进行日志记录。我想覆盖RootLogger的模式。 这是我的log4j2。属性文件: 这是我的pom。log4j的xml文件: 我这样叫我的记录仪: 我的配置有两个问题。第一个是根记录器不使用我的ConsolePender(警告等以默认格式显示),在记录错误时,我只得到第一行,而不是整个堆栈跟踪)。

  • 我使用JBoss 6,在这个JBoss上部署了两个项目,它们有不同的网络上下文。他们都在后台使用Hibernate和相同的核心包,但我想根据网络上下文区分日志文件。因为核心包是相同的java包为两个项目。 我在互联网上也搜索了log4j手册,但找不到任何方法?

  • 问题内容: 我正在尝试以编程方式设置Logback追加程序路径。(确切地说,带有FixedWindowRollingPolicy的RollingFileAppender) 之所以这样做,是因为我想让我的用户在首选项对话框(Eclipse RCP)中设置日志路径。 我已经尝试过类似的方法,但是我不会更改配置文件中定义的日志路径: 问题答案: 使用系统属性并重新加载配置文件看起来更干净: 更改logb

  • 我计划用log4j one替换旧的记录器。我需要创建继承Logger的新类LocalLogger,而不是直接使用Logger。这样做的原因-我需要旧记录器中可用的新日志方法名称。 我有log4j记录器: 如何以与Logger相同的方式实现LocalLogger的功能? 如何将c类传递给超级本地记录器? LocalLogger的草稿: