zoukankan      html  css  js  c++  java
  • (网页)Java日志记录框架Logback配置详解(企业级应用解决方案)(转)

    转自CSDN:

    前言

    Logback是现在比较流行的一个日志记录框架,它的配置比较简单学习成本相对较低,所以刚刚接触该框架的朋友不要畏惧,多花点耐心很快就能灵活应用了。本篇博文不会具体介绍Logback搭建过程,如果你是Logback初学者,强烈建议阅读Logback常用配置详解,它对Logback的配置介绍的非常的详细,相信你看完这篇博客后会对Logback有一定的了解,然后再回头看下面的内容收获会更大

    企业级应用常用Logback配置

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- 
        scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
        scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位默认单位是毫秒,当scan为true时此属性生效,默认时间间隔为1分钟
        debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值为false
     -->
    <configuration scan="true" scanPeriod="3 seconds" debug="false">
        <!-- 这一句的意思是打印所有进入的信息 -->
        <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
        <!-- 
            appender是<configuration>的子节点,是负责写日志的组件
            两个必要属性name和class:name指定appender名称,class指定appender的全限定名
            定义控制台appender 作用:把日志输出到控制台 class="ch.qos.logback.core.ConsoleAppender" 
        -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <!-- 对日志进行格式化 -->
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>
                    {"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS}","thread":"%t","line":"%line","log_level":"%p","class_name":"%C;","msg":"%m"}
    
                </pattern>
            </layout>
        </appender>
    
        <!--
            定义滚动记录文件appender 作用:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 
            RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"
            参数: 
                <append>:如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true
                <file>:被写入的文件名,可以是相对目录也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值
                <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名
                <triggeringPolicy>:告知RollingFileAppender合适激活滚动
                <prudent>:当为true时不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有两个限制:1不支持也不允许文件压缩,2不能设置file属性必须留空
         -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true -->
            <append>true</append>
            <File>logs/logback-test.log</File>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 每天滚动一次的日志 只保留30天内的日志文件 -->
                <FileNamePattern>
                    logs/logback-test.%d{yyyy-MM-dd}.log.zip
                    <maxHistory>30</maxHistory> 
                </FileNamePattern>
    
                <!-- 每分钟滚动一次日志 -->
                <!-- <FileNamePattern>
                    logs/logback-test.%d{yyyy-MM-dd_HH-mm}.log.zip
                </FileNamePattern> -->
            </rollingPolicy>
            <!-- 对日志进行格式化 -->
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>
                    {"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS}","thread":"%t","line":"%line","log_level":"%p","class_name":"%C;","msg":"%m"}
    
                </Pattern>
            </layout>
        </appender>
    
        <!--
            定义滚动记录文件appender 作用:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 
            RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"
            参数: 
                <append>:如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true
                <file>:被写入的文件名,可以是相对目录也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值
                <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名
                <triggeringPolicy>:告知RollingFileAppender合适激活滚动
                <prudent>:当为true时不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有两个限制:1不支持也不允许文件压缩,2不能设置file属性必须留空
         -->
        <appender name="LOGBACK_ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <append>true</append>
            <file>logs/logback-test-error.log</file>
    
            <!--
                定义滚动策略 作用:根据固定窗口算法重命名文件的滚动策略 class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy
                <fileNamePattern>:表示当触发了回滚策略后,按这个文件命名规则生成归档文件,命名规则中的%i表示在maxIndex和minIndex之间的一个整数值
                <minIndex>:最小索引值
                <maxIndex>:最大索引值
             -->
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>logs/logback-test-error.log.%i</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>20</maxIndex>
            </rollingPolicy>
    
            <!-- 
                定义按文件大小触发滚动策略triggeringPolicy 作用:查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender触发当前活动文件滚动
                只有一个参数 maxSize 这是活动文件的大小,默认值是10MB
            -->
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>50MB</maxFileSize>
            </triggeringPolicy>
    
            <!-- 
                配置日志级别过滤器 作用:根据日志级别进行过滤,如果日志级别等于配置级别过滤器会根据onMath和onMismatch接收或拒绝日志
                参数:
                    <level>:设置过滤级别
                    <onMatch>:用于配置符合过滤条件的操作
                    <onMismatch>:用于配置不符合过滤条件的操作
                    此处配置为只接收ERROR日志级别信息
            -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
    
            <encoder>
                <pattern>
                    {"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS}","thread":"%t","line":"%line","log_level":"%p","class_name":"%C;","msg":"%m%n", "caller":"%caller{1}"}
                </pattern>
            </encoder>
        </appender>
    
        <!--
            定义滚动记录文件appender 作用:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 
            RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"
            参数: 
                <append>:如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true
                <file>:被写入的文件名,可以是相对目录也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值
                <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名
                <triggeringPolicy>:告知RollingFileAppender合适激活滚动
                <prudent>:当为true时不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有两个限制:1不支持也不允许文件压缩,2不能设置file属性必须留空
        -->
        <appender name="LOGBACK_ALL_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <append>true</append>
            <file>logs/logback-test-all.log</file>
    
            <!--
                定义滚动策略 作用:根据固定窗口算法重命名文件的滚动策略 class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy
                <fileNamePattern>:表示当触发了回滚策略后,按这个文件命名规则生成归档文件,命名规则中的%i表示在maxIndex和minIndex之间的一个整数值
                <minIndex>:最小索引值
                <maxIndex>:最大索引值
             -->
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>logs/logback-test-all.log.%i</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>20</maxIndex>
            </rollingPolicy>
    
            <!-- 
                定义按文件大小触发滚动策略triggeringPolicy 作用:查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender触发当前活动文件滚动
                只有一个参数 maxSize 这是活动文件的大小,默认值是10MB
            -->
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>50MB</maxFileSize>
            </triggeringPolicy>
    
            <!-- 
                配置临界值过滤器 作用:过滤掉低于指定临界值的日志,当日志级别等于或高于临界值时过滤器返回NEUTRAL,当日志级别低于临界值时,日志会被拒绝
                此处配置为INFO 即过滤掉日志级别小于INFO的日志信息
            -->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
    
            <encoder>
                <pattern>
                    {"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS}","thread":"%t","line":"%line","log_level":"%p","class_name":"%C;","msg":"%m%n", "caller":"%caller{1}"}
                </pattern>
            </encoder>
        </appender>
    
        <!--                    
            logger用来设置某一个包的日志打印级别,以及指定<appender>
            <loger> 仅有一个name属性,一个可选的level和一个可选的addtivity属性
                    name:用来指定受此loger约束的某一个包或者具体的某一个类
                    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
                    addtivity:是否向上级loger传递打印信息。默认是true,会将信息输入到root配置指定的地方,可以包含多个appender-ref,标识这个appender会添加到这个logger
        -->
        <logger name="com.roberto" level="DEBUG" additivity="false">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="LOGBACK_ALL_LOG" />
            <appender-ref ref="LOGBACK_ERROR_LOG" />
        </logger>
    
        <!-- 将root的打印级别设置为"INFO",指定了名字为"FILE","STDOUT"的appender -->
        <root>
            <level value="INFO" />
            <appender-ref red="STDOUT" />
            <appender-ref ref="FILE" />
        </root>
    </configuration>

    以上配置部分涵盖了大部分日志记录的需求,如控制台输出日志,文件记录日志,日志输出格式化,按文件大小滚动日志,按日期滚动日志,日志级别过滤等等,在实际应用中只需对配置进行适当的修改即可。以上配置注释部分可以帮助你解决百分90的疑惑,接下来我以上诉配置为基准,运行程序进行简单解释说明

    实例讲解

    在com.roberto包下测试

    package com.roberto;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class LogbackTest {
        private static Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);
    
        public static void main(String[] args) {
            LOGGER.debug("=======DEBUG=======");
            LOGGER.info("========INFO=======");
            LOGGER.warn("========WARN=======");
            LOGGER.error("=======ERROR=======");
        }
    }

    以上诉配置为基准 新建Logback测试类 观察日志输出情况 切记包名为com.roberto

    1.控制台输出

    {"timestamp":"2017-07-19T22:11:40.248","thread":"main","line":"27","log_level":"DEBUG","class_name":"com.roberto.LogbackTest;","msg":"=======DEBUG======="}
    {"timestamp":"2017-07-19T22:11:40.252","thread":"main","line":"28","log_level":"INFO","class_name":"com.roberto.LogbackTest;","msg":"========INFO======="}
    {"timestamp":"2017-07-19T22:11:40.253","thread":"main","line":"29","log_level":"WARN","class_name":"com.roberto.LogbackTest;","msg":"========WARN======="}
    {"timestamp":"2017-07-19T22:11:40.253","thread":"main","line":"30","log_level":"ERROR","class_name":"com.roberto.LogbackTest;","msg":"=======ERROR======="}
    <logger name="com.roberto" level="DEBUG" additivity="false">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="LOGBACK_ALL_LOG" />
            <appender-ref ref="LOGBACK_ERROR_LOG" />
      </logger>

    控制台打印以上内容是因为这里配置了包名为com.roberto的DEBUG信息输出到控制台

    2.logback-test-all.log内容

    {"timestamp":"2017-07-19T22:11:40.252","thread":"main","line":"28","log_level":"INFO","class_name":"com.roberto.LogbackTest;","msg":"========INFO=======
    ", "caller":"Caller+0    at com.roberto.LogbackTest.main(LogbackTest.java:28)
    "}{"timestamp":"2017-07-19T22:11:40.253","thread":"main","line":"29","log_level":"WARN","class_name":"com.roberto.LogbackTest;","msg":"========WARN=======
    ", "caller":"Caller+0    at com.roberto.LogbackTest.main(LogbackTest.java:29)
    "}{"timestamp":"2017-07-19T22:11:40.253","thread":"main","line":"30","log_level":"ERROR","class_name":"com.roberto.LogbackTest;","msg":"=======ERROR=======
    ", "caller":"Caller+0    at com.roberto.LogbackTest.main(LogbackTest.java:30)
    "}
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
         <level>INFO</level>
    </filter>

    虽然配置是com.roberto的DEBUG级别信息输出到logback-test-all.log,但是由于在LOGBACK_ALL_LOG appender中配置了过滤器,过滤掉了INFO级别以下的信息,所以logback-test-all.log信息如上

    3.logback-test-error.log内容

    {"timestamp":"2017-07-19T22:11:40.253","thread":"main","line":"30","log_level":"ERROR","class_name":"com.roberto.LogbackTest;","msg":"=======ERROR=======
    ", "caller":"Caller+0    at com.roberto.LogbackTest.main(LogbackTest.java:30)
    "}
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

    虽然配置是com.roberto的DEBUG级别信息输出到logback-test-error.log,但是由于在LOGBACK_ERROR_LOG appender中配置了过滤器,只输出ERROR级别信息,所以logback-test-error.log打印信息如上

    4.logback-test.log内容 
    logback-test.log内容是空的,什么也没接收到,是因为已经为com.roberto包设置了日志打印机制,并且配置了additivity为false,日志信息不传递到上级,所以logback-test.log接收不到任何日志请求

    在非com.roberto包下测试

    package com.dreamt;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class LogbackTest {
        private static Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);
    
        public static void main(String[] args) {
            LOGGER.debug("=======DEBUG=======");
            LOGGER.info("========INFO=======");
            LOGGER.warn("========WARN=======");
            LOGGER.error("=======ERROR=======");
        }
    }

    注意此处包名不为com.roberto,观察日志输出发现logback-test-all.log,logback-test-error.log的输出为空,只有logback-test.log和控制台的输出如下:

    {"timestamp":"2017-07-19T22:23:15.666","thread":"main","line":"28","log_level":"INFO","class_name":"com.dreamt.LogbackTest;","msg":"========INFO======="}
    {"timestamp":"2017-07-19T22:23:15.670","thread":"main","line":"29","log_level":"WARN","class_name":"com.dreamt.LogbackTest;","msg":"========WARN======="}
    {"timestamp":"2017-07-19T22:23:15.670","thread":"main","line":"30","log_level":"ERROR","class_name":"com.dreamt.LogbackTest;","msg":"=======ERROR======="}
    <root>
        <level value="INFO" />
        <appender-ref red="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

    此次日志打印请求只命中了STDOUT和FILE,并且设置了日志输出级别为INFO,所以logback-test.log和控制台输出如上

    关于滚动日志这里就不做测试,你们可以自己写个循环输出日志进行测试,上面配置注释的非常清楚,只要你们肯动手肯定能实验成功的,以上部分纯属个人拙见,如有误解欢迎大家指正,谢谢~

    原文:http://blog.csdn.net/RobertoHuang/article/details/75452508

  • 相关阅读:
    atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
    atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
    Atitit.执行cmd 命令行 php
    Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
    atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结
    atitit. 管理哲学 大毁灭 如何防止企业的自我毁灭
    Atitit.java的浏览器插件技术 Applet japplet attilax总结
    Atitit.jquery 版本新特性attilax总结
    Atitit. 软件开发中的管理哲学一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
    (转)获取手机的IMEI号
  • 原文地址:https://www.cnblogs.com/historylyt/p/7994749.html
Copyright © 2011-2022 走看看