修改日志规范遇到的坑

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

先说下要求:

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文件中添加如下依赖


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starterartifactId>

<version>${spring.boot.version}version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-loggingartifactId>
        exclusion>
    exclusions>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-log4j2artifactId>
    <version>1.5.9.RELEASEversion>
dependency>

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

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

 



   
   
        %d{yyyy-MM-dd}T%d{HH:mm:ss.SSSZ} %-5level %logger [${application} @project.version@] [%t] : %m%n%wEx
        /data/logs
        XXX
   

   
       
           
           
       

   

   
       
           
           
           
                ${pattern}
           

       

       
                             fileName="${path}/${application}.log"
                     filePattern="${path}/${application}_%d{yyyy-MM-dd}.log">
           
           
                ${pattern}
           

           
               
               
           

           
       

   

 

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

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

前面几条都满足了,看到了异步打印,于是百度一下,要求使用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,不清楚是公司内部做了修改还是什么别的原因,如果有大神知道的话,请务必告诉我原因,谢谢。

转载于:https://www.cnblogs.com/winds/p/9782216.html

你可能感兴趣的:(修改日志规范遇到的坑)