logback日志工具--定制打印

前提背景

昨天奇安信公司发现Apache下log4j开源工具出现了bug,具体描述如下图:
在这里插入图片描述
该bug存在于log4j版本2.14.1以下及包含该版本的工具包中。
目前建议的临时解决方案如下:

(1) 修改jvm参数 -Dlog4j2.formatMsgNoLookups=true
(2) 修改配置log4j2.formatMsgNoLookups=True
(3) 将系统环境变量FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true

同类工具

个人选择直接替换日志工具,目前打印工具不限于log4j,还有其他成熟的工具如·slf4j-simple·、·logback·等 【注意·slf4j·不是日志打印工具,它是一款日志打印接口,需要对接市面上的日志打印工具如上工具等,才可以具体实现打印】
在这里插入图片描述

选择logback

个人认为logback和log4j2使用起来较为接近,且功能类似,于是将之前使用log4j2打印日志的功能迁移到了logback中。

log4j2:log4j2.xml

<dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.13.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.13.1</version>
    </dependency>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="300"> <!-- 这里是log4j本身打印的日志等级,和下面配置无关,这里打印的是组件启动日志等-->
    <properties>
        <property name="LOG_HOME">/CallHolo/logs</property>
        <property name="FILE_NAME">CallHolo</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg - %l %n" />
        </Console>
        <RollingRandomAccessFile name = "RollFile"
                                 fileName = "${LOG_HOME}/${FILE_NAME}.log"
                                 filePattern = "${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log"
                                 append = "true">
<!--            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg - %l %n" />-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] - %msg"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="5" />
                <SizeBasedTriggeringPolicy size="10 KB" />
            </Policies>
            <DefaultRolloverStrategy max="100" />
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Logger name = "com.hologres.QuartzScheduler.jobs.CallHoloLiveJob" level = "trace" additivity="false">
            <AppenderRef ref = "RollFile" />
        </Logger>
        <Logger name = "com.hologres.QuartzScheduler.jobs.CallHoloVodJob" level = "trace" additivity="false">
            <AppenderRef ref = "RollFile" />
        </Logger>
        <Logger name = "console_test" level="trace" additivity="false">
            <AppenderRef ref = "Console" />
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

logback:logback.xml

<dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
<!--scan:-->
<!--当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。-->
<!--scanPeriod:-->
<!--设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
<!--debug:-->
<!--当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<configuration scan="true" scanPeriod="60 seconds" debug="true">
    <!-- 其他配置省略-->
<!--    2.1设置上下文名称:<contextName>-->
<!--    每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。可以通过%contextName来打印日志上下文名称,一般来说我们不用这个属性,可有可无-->
<!--    <contextName>myAppName</contextName>-->
<!--    用来定义变量值的标签,<property> 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 例如使用<property>定义上下文名称,然后在<contentName>设置logger上下文时使用-->
    <property name="APP_NAME" value="holo_schedule_logs" />


    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder 默认配置为PatternLayoutEncoder -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>


    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${APP_NAME}/schedule</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
<!--            <fileNamePattern>${APP_NAME}/schedule.%d{yyyy-MM-dd}.log</fileNamePattern>-->
<!--            按分钟回滚-->
            <fileNamePattern>${APP_NAME}/schedule.%d{yyyy-MM-dd-HH-mm}.log</fileNamePattern>
            <!-- 日志最大的历史 30天 -->
            <maxHistory>1440</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
<!--            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>-->
            <pattern>%d{HH:mm:ss.SSS} %-5level - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- logback为java中的包 -->
    <logger name="logback" />
<!--    将控制logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级<root>的日志级别“DEBUG”;-->
<!--    没有设置addtivity,默认为true,会打印两遍 将此loger的打印信息向上级传递;-->
<!--    没有设置appender,此loger本身不打印任何信息。-->
<!--    当执行logback.LogbackDemo类的main方法时,因为LogbackDemo 在包logback中,所以首先执行<logger name="logback" />,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印;-->
<!--    root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;-->
    <!--logback.LogbackDemo:类的全路径 -->
    <logger name="com.hologres.QuartzScheduler.jobs.CallHoloLiveJob" level="INFO" additivity="false">
        <appender-ref ref="file"/>
    </logger>
    <logger name="com.hologres.QuartzScheduler.jobs.CallHoloVodJob" level="INFO" additivity="false">
        <appender-ref ref="file"/>
    </logger>

    <root level="ERROR">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

猜你喜欢

转载自blog.csdn.net/weixin_41998764/article/details/121855267
今日推荐