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

log4j2:日志不发送到控制台,在控制台中作为日志文件运行良好

仲孙思源
2023-03-14
package parallel;
public class ClassA {
private final   Logger log = LogManager.getLogger(ClassA.class);
@Test 
public void testLogs() {
    log.info("info");
    log.debug("debug");
    log.warn("warn");
    log.error("error");
    log.fatal("fatal");
    log.trace("trace");
}

}

<Configuration status="INFO">
<Properties>
   <Property name="basePath" value="./logs" />
</Properties>
<Appenders>
  <Console name="console" target="SYSTEM_OUT">
    <PatternLayout>
     <Pattern>
     [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
     </Pattern>
    </PatternLayout>
  </Console>
  <File name="fileLogger" fileName="${basePath}/error.log">
    <PatternLayout>
    <Pattern>
     [%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n
    </Pattern>
    </PatternLayout>
  </File>
</Appenders>
<Loggers>
   <Root name="parallel">
     <AppenderRef ref="console" level="trace" />
   </Root>
   <Logger name="parallel" level="warn" additivity="false">
      <AppenderRef ref="fileLogger" />
   </Logger>
</Loggers>

共有1个答案

易京
2023-03-14

按照我的理解,你的目标是完成以下几项:

我打算将错误和致命写入文件,因此使用level=ERROR。我打算将所有日志写入控制台,因此对控制台使用level=trace。

请先阅读整个答案,然后再对您将在代码中实现的内容做出最终选择。

<Loggers>
    <Root>
        <AppenderRef ref="console"/>
    </Root>
    <Logger name="parallel" level="ALL" additivity="true">
        <AppenderRef ref="fileLogger" level="ERROR"/>
    </Logger>
</Loggers>

一旦标识了记录器,log4j必须确定该事件是否被该记录器接收。这基于记录器的级别设置。由于“并行”记录器被设置为all级别,它将接受任何级别的事件。

记录器接受事件后,其附加器也必须接受该事件。与“并行”记录器的文件附加器关联的级别是error,因此该附加器将只接受errorfatal级别的事件。

由于“并行”记录器的可加性为true,因此每当它接受一个事件时,它也会将该事件传递给其父记录器的附加器(除非其中一个记录器通过指定可加性false来破坏链-详情请参见log4j2体系结构页面)。因此“parallel”接受的任何事件都将转到与根记录器相关联的控制台附加器。

下面是一些示例代码来说明这个问题:

package parallel;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ClassA {
    private static final Logger log = LogManager.getLogger(ClassA.class);

    public static void main(String[] args) {
        log.info("info");
        log.debug("debug");
        log.warn("warn");
        log.error("error");
        log.fatal("fatal");
        log.trace("trace");

        // See the mistake here? 
        // The wrong logger name was used in the code, 
        // now the error event goes to the root logger!
        final Logger log2 = LogManager.getLogger("foo");
        log2.error("Woops an error!");
    }
}

以上使用答案开头的配置的控制台输出为:

[INFO ] 2019-05-05 12:48:31.410 [main] ClassA - info
[DEBUG] 2019-05-05 12:48:31.411 [main] ClassA - debug
[WARN ] 2019-05-05 12:48:31.411 [main] ClassA - warn
[ERROR] 2019-05-05 12:48:31.411 [main] ClassA - error
[FATAL] 2019-05-05 12:48:31.412 [main] ClassA - fatal
[TRACE] 2019-05-05 12:48:31.412 [main] ClassA - trace
[ERROR] 2019-05-05 12:48:31.413 [main] foo - Woops an error!

错误日志文件仅显示:

[ERROR] 2019-05-05 12:48:31 [main] ClassA - error
[FATAL] 2019-05-05 12:48:31 [main] ClassA - fatal
<Loggers>
    <Root level="ALL">
        <AppenderRef ref="console"/>
        <AppenderRef ref="fileLogger" level="ERROR"/>
    </Root>
</Loggers>
[INFO ] 2019-05-05 12:59:32.419 [main] ClassA - info
[DEBUG] 2019-05-05 12:59:32.421 [main] ClassA - debug
[WARN ] 2019-05-05 12:59:32.421 [main] ClassA - warn
[ERROR] 2019-05-05 12:59:32.421 [main] ClassA - error
[FATAL] 2019-05-05 12:59:32.421 [main] ClassA - fatal
[TRACE] 2019-05-05 12:59:32.421 [main] ClassA - trace
[ERROR] 2019-05-05 12:59:32.422 [main] foo - Woops an error!
[ERROR] 2019-05-05 12:59:32 [main] ClassA - error
[FATAL] 2019-05-05 12:59:32 [main] ClassA - fatal
[ERROR] 2019-05-05 12:59:32 [main] foo - Woops an error!

其他可能有用的链接:

https://stackoverflow.com/A/51567436/3284624

希望这对你有帮助!

 类似资料:
  • 嘿,我想知道控制台中的输出是否可能与文件输出中的输出相同。 这是我的XML配置。 滚动文件中的输出 在控制台中为空。但是现在如果我改变 到"追踪" 将是2,4,6。。。。在控制台和我的文件中,它将是1,3,5,7。。。这很容易理解。 但是我的问题是,我们如何在控制台和文件中同时拥有相同的日志级(跟踪)输出?(添加包名称和级别的标签不起作用) 与此问题相关: log4j2 xml配置-登录到文件和控

  • 问题内容: 有没有一种方法可以在Eclipse控制台中为部分日志着色。我知道我可以发送到错误流和标准流并以不同的方式给它们上色,但是我更希望在ANSI转义码(或其他HTML格式)行中查找,可以在其中将颜色嵌入字符串中以对其进行着色日志。 它肯定会有助于使重要的部分脱颖而出,而无需诉诸怪异的布局,而是将布局保持在log4j设置中 这是我正在寻找的示例: [INFO]网格已完成....... 否 如果

  • 问题内容: 我想在量角器测试中输出div的文本,到目前为止,我有: 但这输出 我尝试了“ toString()”,结果相同。 有没有办法将文本输出到控制台? 问题答案: 和其他大多数量角器方法都返回承诺。您想将您的陈述放入承诺解决方案中: 使用新的量角器语法:

  • Laravel中是否有类似的东西允许您查看正在执行的实际SQL?例如,在Rails中,您可以在控制台中看到SQL。在Django中,您有一个工具栏。 在《拉威尔4》中有类似的东西吗? 澄清一下:我的问题是如何在没有代码的情况下做到这一点。Laravel中是否有内置的东西不需要我在应用程序中编写代码? 更新:最好我也希望看到CLI查询(例如)

  • 我曾试图使用log4j2在一个Spring Boot应用程序中进行日志记录,它工作正常,但问题是,并非所有日志记录都按照log4j2中的配置进入日志文件。xml很少有日志被引导到控制台,后面是我的pom片段,后面是log4j2。xml和控制台的输出,以及日志文件的输出 波姆。xml log4j2。xml 控制台输出 日志文件输出

  • 问题内容: 我想建立一个自动化测试,所以我必须知道chrome控制台中出现的错误。 是否有一个选项来获取出现在控制台中的错误行? 为了查看控制台:右键单击页面中的某处,单击“检查元素”,然后转到“控制台”。 问题答案: 我不知道C#,但这是可以完成此工作的Java代码,希望您可以将其转换为C# 注意上面代码中的setUp方法。我们使用LoggingPreferences对象来启用日志记录。日志有几