修改日志规范遇到的坑

近期公司组织日志规范整改,这个光荣的任务落到了我的头上,由于以前开发从来没碰过日志配置这块,中间踩了无数的坑,厚着脸皮让组长更新了好多次才完全修改完成。

先说下要求:

1、 用log4j2

2、 打印的目录为/data/logs

3、 命名规范为 /data/logs/$appname.log

4、 Rotate后为 /data/logs/$appname-2018-08-08.log

5、 使用异步打印

看似很简单是不是,可是实际做起来不是这么回事……

首先,由于我们是spring-boot项目,默认的是logback,所以要禁用logback,启用log4j2,需要在pom文件中添加如下依赖

<!--去除默认的logback-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>

<version>${spring.boot.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <version>1.5.9.RELEASE</version>
</dependency>

上面的配置文件,其实有个坑,至于为什么我也不太了解,就是在spring-boot-starter下面需要加个版本号,如果不加,在我电脑上可以正常运行,但是有些人的电脑就不行,如果有哪位大佬知道为什么的话可以告诉我。

然后需要在资源文件里面创建个log4j2.xml,按照要求填入,填的过程一路百度,中间有些问题就百度解决,填好能用的第一个版本如下(有些字段不方便透露就隐去了)

 

<?xml version="1.0" encoding="UTF-8" ?>
<configuration status="WARN">
    <!--全局参数-->
    <Properties>
        <Property name="pattern">%d{yyyy-MM-dd}T%d{HH:mm:ss.SSSZ} %-5level %logger [${application} @project.version@] [%t] : %m%n%wEx</Property>
        <property name="path">/data/logs</property>
        <property name="application">XXX</property>
    </Properties>
    <Loggers>
        <Root level="DEBUG">
            <AppenderRef ref="rolling_file"></AppenderRef>
            <AppenderRef ref="console"></AppenderRef>
        </Root>
    </Loggers>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT" follow="true">
            <!--控制台只输出level及以上级别的信息-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>${pattern}</Pattern>
            </PatternLayout>
        </Console>
        <!-- 同一来源的Appender可以定义多个RollingFile,定义按天存储日志 -->
        <RollingFile name="rolling_file"
                     fileName="${path}/${application}.log"
                     filePattern="${path}/${application}_%d{yyyy-MM-dd}.log">
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>${pattern}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
</configuration>

 

嗯,很好,现在可以用了,再对照下要求,看看哪里还需要修改的。

控制台输出不需要?好的,删除Console标签,删除了之后怎么启动有问题??之后发现还要把<AppenderRef ref="console"></AppenderRef>删除。

前面几条都满足了,看到了异步打印,于是百度一下,要求使用AsyncRoot和 AsyncLogger代替root标签,说干就干,那就代替把,于是把Loggers标签改造成了下面这样

<Loggers>
    <asyncRoot level="trace" includeLocation="true">
        <AppenderRef ref="rolling_file" />
    </asyncRoot>
    <AsyncLogger name="AsyncLogger"  level="DEBUG" includeLocation="true">
        <AppenderRef ref="rolling_file"></AppenderRef>
    </AsyncLogger>
</Loggers>

改造好了之后,发现能用,于是提交给老大看,老大说还有个地方要改,把RollingFile修改为RollingRandomAccessFile,这两个标签的区别大概就是RollingRandomAccessFile会有个缓冲区,满了之后才刷到日志文件中,算是一种优化把。说干就干,替换个标签还不简单?替换完了后傻眼了,只有启动日志打印了,其他日志不打印了。完了,还不如之前呢。

这个时候,老大耐心的帮我看了看,说,你的AsyncLogger名字不对。名字不对?名字不是随便起的么?老大说不,应该起成包名。我心里一阵嘀咕,这有点不讲道理啊。不过也没有别的什么好法子,就先试试把,于是把name换成了包名,还真的好了。

最后还要个点,就是AsyncRoot是不需要的,添加后日志会打印两遍,后来就删掉了。

这个修改,除掉中间出差和别的事,前前后后花了有一天的时间,还浪费了测试有三四个小时的精力,算是效率比较低了,特此记录一下,以示警醒。

PS:关于RollingFile和RollingRandomAccessFile两个标签的区别,我搜了很多,没发现有人提到说使用包名来命名RollingRandomAccessFile,不清楚是公司内部做了修改还是什么别的原因,如果有大神知道的话,请务必告诉我原因,谢谢。

posted @ 2018-10-13 11:08  a654123555  阅读(267)  评论(0编辑  收藏  举报