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

logback到log4j2异步日志迁移

魏煜祺
2023-03-14

我需要选择一个日志框架来替换log4j。我最初选择slf4j logback作为日志记录,并编写了以下配置,将应用程序日志和apache cxf的日志输出到单独的文件中,并在控制台上输出Spring/hibernate日志:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <Pattern>.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n
        </Pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>TRACE</level>
    </filter>
</appender>

<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>D:\\MYDIR\\logs\\app_logback.%d{yyyy-MM-dd}.log</FileNamePattern>
        <maxHistory>30</maxHistory>         
    </rollingPolicy>

    <encoder>
        <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
    </encoder>      
</appender>

<appender name="minuteRollingFileAppenderCxf" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>D:\\MYDIR\\logs\\app_logback_cxf.%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>
        <maxHistory>30</maxHistory>         
    </rollingPolicy>

    <encoder>
        <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
    </encoder>      
</appender>

<logger name="com.mycustomcode" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="dailyRollingFileAppender"/>
</logger>

<logger name="org.apache" additivity="false">
    <level value="INFO" />
    <appender-ref ref="minuteRollingFileAppenderCxf"/>
</logger>

<root>
    <level value="INFO" />
    <appender-ref ref="consoleAppender" />
</root>
</configuration>

然而,我开始了解log4j2中的异步日志记录,我想在我的设置中使用log4j2实现异步日志记录,为此我编写了以下配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console">
  <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>

<RandomAccessFile name="RandomAccessFile" fileName="D:\\MYDIR\\logs\\app_log4j2.log" immediateFlush="false" append="false">
  <PatternLayout>
    <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
  </PatternLayout>
</RandomAccessFile>

<RandomAccessFile name="RandomAccessFile2" fileName="D:\\MYDIR\\logs\\app_log4j2_cxf.log" immediateFlush="false" append="false">
  <PatternLayout>
    <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
  </PatternLayout>
</RandomAccessFile>
</Appenders>

<Loggers>
<AsyncLogger name="com.mycustomcode" level="debug" includeLocation="true" additivity="false">
  <AppenderRef ref="RandomAccessFile"/>
</AsyncLogger>

<AsyncLogger name="org.apache" level="debug" includeLocation="true" additivity="false">
  <AppenderRef ref="RandomAccessFile2"/>
</AsyncLogger>

<Root level="debug" includeLocation="false">
  <AppenderRef ref="Console"/>
</Root>
</Loggers>

</Configuration>

log4j2配置可以工作,但它只在文件(app_log4j2.log)中正确打印“com.mycustomcode”的日志。对于app_log4j2_cxf文件中的“org.apache”,不会打印任何内容。日志-事实上,它是空的,它的日志会打印到服务器控制台。

有人能指出我做错了什么吗?谢谢

共有2个答案

颜志业
2023-03-14

使用此配置的代码是否使用名称以“org.apache”开头的记录器?否则,您将看不到此记录器的任何输出。

要验证这一点,请使用上面的配置和以下代码:

Logger logger = LogManager.getLogger("org.apache.anything");
logger.debug("test");
子车才捷
2023-03-14

Logback还支持异步。检查AsyncAppender

http://logback.qos.ch/manual/appenders.html

 类似资料:
  • 正如logback的文档所说,大多数appender本质上是同步的,但是如果我们将appender包装在异步appender中,那么线程将把数据推送到BlockingQueue中,如果有,比如说X-logback线程将从BlockingQueue获取数据并将其追加。这就是我对它的基本理解。 尝试使用JstackThread转储来测试这个。但是空手返回,没有回退线程的线索。 作为参考,请检查下面lo

  • 本文向大家介绍Spring Boot异步输出Logback日志方法详解,包括了Spring Boot异步输出Logback日志方法详解的使用技巧和注意事项,需要的朋友参考一下 一、介绍 1.1 Logback Logback是由log4j创始人设计的另一个开源日志组件,它分为下面下个模块: logback-core:其它两个模块的基础模块 logback-classic:它是log4j的一个改良版

  • 我的springboot项目中想要异步打印日志到文件,对 logback 做了如下配置 java的controller中使用下面代码打印日志 在日志文件中打印出线程名称,同时在IDEA控制台中也打印线程名称,照理说如果是异步写入的日志这两处的线程名称应该不一样,结果日志文件中输出的结果是 控制台中输出的是 线程ID和名称分别是:86 / http-nio-7076-exec-2 两处的线程名称一样

  • 异步Log日志 use AsyncLog; yield AsyncLog::info('hello world'); yield AsyncLog::debug('test debug', ['foo' => 'bar']); yield AsyncLog::notice('hello world',[], 'group.com'); yield Async

  • 我正在运行一个POC来查看将我们的j2ee应用程序迁移到Logback的影响。我花了一些时间在官方网站上,显然,除了新的JAR之外,唯一的变化就是logback.xml文件。不幸的是,这似乎还不够,部署工作了,日志文件也创建了,但没有记录任何内容(空)。 我的代码有以下语句 pom.xml现在具有以下内容 xml(使用官方网站上的web实用程序创建) 这让我想到了weblogic中的log4j。