Logback应用及自定义节点

作者: 清风_gary_明月 | 来源:发表于2019-08-19 20:56 被阅读1次

  说明:Logback是由log4j创始人设计的另一个开源日志组件,拥有更优越的性能,Springboot默认的集成日志,它有一个核心模块logback-core和两个基本模块logback-classic、logback-access更多可以上官方网站:http://logback.qos.ch了解一下,这些暂不是我们的重点。
  本节的主要介绍:1、了解logback.xml的常用配置 2、自定义自己的日志输出节点 3、了解常用的属性(可参考配置中注释)。


1、工程描述


  说明:日志测试比较简单,引入一个logback.xml文件,如果logback.xml位置比较特殊可以在application.propertis中指定引入,另外一个对外测试接口Log.java。


2、代码步骤


  第一:定义logback.xml(太长,只显示error节点和自定义的节点),我在error节点中写了很详细的注释,感觉这样比拿出来说明更易理解 。

<configuration>
    <!-- 输出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 输出格式 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
                %msg%n</pattern>
        </encoder>
    </appender>

    <!-- error级别单独记录 -->
    <appender name="errorAppender"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/test-error-today.log</file>
        <!-- 以day为单位自动回滚 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
            <fileNamePattern>logs/test-error/test-error-%d{yyyy-MM-dd}.%i.log.gz
            </fileNamePattern>
            <!-- 日志最大的历史30天 删除策略https://www.jianshu.com/p/d9c08785430a-->
            <maxHistory>30</maxHistory>
            <!-- 日志文件最大的大小,若当天日志达到最大maxFileSixe时,%i会自动加1 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度
             %logger{35} 表示logger名字最长35个字符,否则按照句点分割。 %msg:日志消息,%n是换行符
        -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-4relative [%thread] 
                %-5level%logger{35} - %msg%n</pattern><!-- https://blog.csdn.net/sinat_25076521/article/details/80513543 -->
        </encoder>
        <!-- error级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <!-- 只显示ERROR级别 -->
            <level>ERROR</level>
            <!--匹配到就允许-->
            <onMatch>ACCEPT</onMatch>
            <!--没匹配到就禁止-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <property name="log.path" value="logs/captcha-info" />
    <property name="serverNode" value="node236" />
    <!-- collect info级别单独记录 -->
    <appender name="logCollect"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/test-collect-today.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log.path}/collect.%d{yyyy-MM-dd}.%i.log
            </FileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5kb</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
             <pattern>%msg%n</pattern><!-- 日志格式使用类似csv的格式,所以不要其他信息了 -->
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 自定义异步-->
    <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <appender-ref ref="logCollect" />
    </appender>
    <!-- additivity为false表示只在自已定义的级别输出,不会继承root(否则也会在root里输出,输出两次) -->
    <logger name="logCollect" additivity="false" level="INFO"><!-- INFO级别 -->
        <appender-ref ref="async"></appender-ref>
    </logger>

    <!-- 根,所有logger的祖先 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="errorAppender" />
        <appender-ref ref="warnAppender" />
        <appender-ref ref="infoAppender" />
    </root>
</configuration>

第二:application.properties中引入logback.xml,初始级别为INFO,默认级别为DEBUG。

logging.config: file:./logback.xml
logging.level.JaninoLogger: INFO

第三:对外提供的接口代码。

@RestController
public class Log {
    Logger logger = LoggerFactory.getLogger("logCollect");
    Logger log = LoggerFactory.getLogger(this.getClass());
    @RequestMapping("/log")
    public String logTest1() {
        for (int i = 0; i < 10000; i++) {
            logger.info("参数{},参数{},参数{},参数{},参数{},参数{},参数{}", i, i + 1, i + 2, i + 3, i + 4, i + 5, i + 6);
        }
        return "hello log";
    }
    @RequestMapping("/log1")
    public String logTest2() {
        for (int i = 0; i < 10000; i++) {
            log.info("参数{},参数{},参数{},参数{},参数{},参数{},参数{}", i, i + 1, i + 2, i + 3, i + 4, i + 5, i + 6);
            log.warn("参数{},参数{},参数{},参数{},参数{},参数{},参数{}", i, i + 1, i + 2, i + 3, i + 4, i + 5, i + 6);
            log.error("参数{},参数{},参数{},参数{},参数{},参数{},参数{}", i, i + 1, i + 2, i + 3, i + 4, i + 5, i + 6);
        }
        return "hello log1";
    }
}

3、自定义节点解析


  在logback.xml中logCollect为自定义节点,大多数属性说明可以参考上面error节点注释,这里几个上面没有出现的说明一下。
 property:定义属性变量,可以在下面直接引用 ;
 pattern:%msg%n表示只输出内容CVS格式内容,不定义头,方便解析 ;
 filter:只定义了INFO级别,说明logCollect节点只能用到INFO上;
 additivity="false":表示不从root根上继承,只输出自定义的INFO级别,否则会被输出两次 ;


4、测试说明


日志输出.png

  可以看出图中自定义的日志进行了切分,而且输出内容只是简单的逗号分隔,cvs可以直接打开,其它日志可以自行运行代码打开查看(会有定义的头信息)。


5、打包下载


链接:https://pan.baidu.com/s/1Yr8pXlkpqzkzqioMj7onSg 
提取码:upl3 

若链接莫名失效,可以留言联系,也可以按照上述的方式自行配置。


更多可关注

相关文章

网友评论

    本文标题:Logback应用及自定义节点

    本文链接:https://www.haomeiwen.com/subject/fvaesctx.html