logback详细全配置记录

logback是spring默认的日志框架,所以不需要额外引入依赖,只需要在Java项目中的resource目录下新建一个logback-spring.xml文件即可。
logback由以下几个部分组成,如图所示:


image.png
  • root
    是所有logger 的根节点,本质也是一个logger,但只有level属性,可以包含一个或多个appender
  • logger
    logger可以自定义包的日志配置,因为所有logger 都有root根节点,所以当文件中配置了root时,注意logger的activity属性,为true时 会继承root节点的配置,如下所示
//配置mapper包下的日志记录配置
<logger name="com.zkj.ds.mapper" level="DEBUG" additivity="false">
        <appender-ref ref="infoAppender" />
        <appender-ref ref="errorAppender"/>
        <appender-ref ref="CONSOLE" />
</logger>
  • appender
    appender用于定义日志输出的具体配置,比如以何种方式记录日志(控制台、文件)属性有 name 该appender名字以及class表示该appender的实现类,常用实现类为:
    • ch.qos.logback.core.ConsoleAppender 输出至控制台
    • ch.qos.logback.core.FileAppender 输出至文件
    • ch.qos.logback.core.rolling.RollingFileAppender 滚动记录文件(按时间、文件大小滚动)
      另外appender里面还可以包含以下常用标签:
      1.<encoder/>
      指定日志的输出格式<pattern/>和编码方式<charset/>
      2.<file/>
      当该appender作用于输出为日志文件时,则需要定义文件路径及名字,如:
//通过${}获取定义的<property>参数获取<springProperty>参数
<file>${log.path}/logs.log</file>

3.<rollingPolicy/>
当appender的class为滚动文件记录时,会包含该文件回滚日志策略标签,常见的策略有:
- TimeBasedRollingPolicy 基于时间滚动
- SizeAndTimeBasedRollingPolicy 基于大小和时间
- FixedWindowRollingPolicy 固定窗口滚动
- SizeBasedTriggeringPolicy 大小触发
例如:按天为单位、大小限制为10mb的日志文件滚动记录策略:

<appender name="rollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/path/to/logfile.log</file>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/path/to/logfile.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <maxHistory>30</maxHistory>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
</appender>

其中maxHistory代表保存最近多少天的日志,maxFileSize代表文件最大大小,fileNamePattern最后的%i代表增量索引,用于在同一天内区分滚动的日志文件
4.<filter>
appender可以包含多个filter元素,l例如用来过滤低于临界值的日志,如:

<!-- 过滤器,只记录debug级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>DEBUG</level>
    <OnMismatch>DENY</OnMismatch>
    <OnMatch>ACCEPT</OnMatch>
</filter>
  • property和springProperty
    property元素用于定义变量,包含name和value两个属性,可以通过${name}获取变量的值,springProperty用于获取spring或者springboot配置文件的值,属性有scope、name、source,其中name表示变量值 ,source表示变量在配置文件中的配置路径。
    如:
    <property name = "code" value = "hello"/>
    <springProperty scope = "context" name = "path" source = 
    

"log.path"/>
```

根据项目环境配置logback

例如springboot项目中,针对不同的启动环境配置不同的日志输出,;如开发环境只配置控制台输出,生产环境配置文件日志,示例如下:

<!-- 开发环境 -->
<springProfile name="dev">
    <logger name="com" level="debug" />
    <root level="info">
        <appender-ref ref="CONSOLE" />
    </root>
</springProfile>
<!-- 测试环境+生产环境 -->
<springProfile name="test,prod">
    <logger name="com" level="info" />
    <root level="info">
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</springProfile>

示例配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置文件每隔1分钟,就检查更新 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定义参数常量,便于后面直接用${name}来获取value值 -->
    <property name="log.pattern" value="%highlight(%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n){TRACE=CYAN, DEBUG=GREEN, INFO=BLUE, WARN=YELLOW, ERROR=RED}"/>
    <!--<property name="log.filePath" value="${catalina.base}/logs/webapps"/>-->
    <property name="log.filePath" value="logs/"/>
    <property name="log.maxHistory" value="30"/>
    
    <!-- ch.qos.logback.core.ConsoleAppender 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 过去使用layout,现在都推荐使用encoder
             作用一:将日志信息转换(格式化)为字符串
             作用二:然后写入到文件中-->
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>
    
    <!-- ch.qos.logback.core.rolling.RollingFileAppender 文件日志输出到文件 -->
    <!-- 1.打印debug级别日志的设置 -->
    <appender name="debugAppender"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 例如当天,也就是今天是2020-2-10,那么在这天生成的日志文件路径为${log.filePath}/debug.log
             接着到了明天,也就是2019-2-11,这天生成的日志文件路径为${log.filePath}/debug.log,
             但昨天2020-2-10,生成的日志文件路径就变为${log.filePath}/debug/debug-2020-2-10.log.gz(压缩文件) -->
        
        <!-- 当天生成的日志文件的路径 -->
        <file>${log.filePath}/debug.log</file>
        <!-- 设置基于时间(每天)的滚动策略,也就是将日志内容按照日期来写入到相应的文件中-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 当天之前的每天生成的日志文件的路径 -->
            <fileNamePattern>${log.filePath}/debug/debug-%d{yyyy-MM-dd}.log.gz
            </fileNamePattern>
            <!-- 最大历史保存文件的数量,只保存最近30天的日志文件,超出的会被删除-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <!-- 过去使用layout,现在都推荐使用encoder
             作用一:将日志信息转换(格式化)为字符串
             作用二:然后写入到文件中-->
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <!-- 过滤掉非debug级别的信息 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <!-- 作用是拒绝写入所有与<level>不匹配的日志信息,
            也就是非debug级别的日志信息都不会被写入到日志文件中 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 2.打印info级别日志的设置 -->
    <appender name="infoAppender"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <!-- 当天生成的日志文件的路径 -->
        <file>${log.filePath}/info.log</file>
        <!-- 设置基于时间(每天)的滚动策略,也就是将日志内容按照日期来写入到相应的文件中-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 当天之前的每天生成的日志文件的路径 -->
            <fileNamePattern>${log.filePath}/info/info-%d{yyyy-MM-dd}.log.gz
            </fileNamePattern>
            <!-- 最大历史保存文件的数量,只保存最近30天的日志文件,超出的会被删除-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <!-- 过去使用layout,现在都推荐使用encoder
             作用一:将日志信息转换(格式化)为字符串
             作用二:然后写入到文件中-->
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <!-- 过滤掉非info级别的信息 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <!-- 作用是拒绝写入所有与<level>不匹配的日志信息,
            也就是非info级别的日志信息都不会被写入到日志文件中 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 3.打印error级别日志的设置 -->
    <appender name="errorAppender"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <!-- 当天生成的日志文件的路径 -->
        <file>${log.filePath}/error.log</file>
        <!-- 设置基于时间(每天)的滚动策略,也就是将日志内容按照日期来写入到相应的文件中-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 当天之前的每天生成的日志文件的路径 -->
            <fileNamePattern>${log.filePath}/error/error-%d{yyyy-MM-dd}.log.gz
            </fileNamePattern>
            <!-- 最大历史保存文件的数量,只保存最近30天的日志文件,超出的会被删除-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <!-- 过去使用layout,现在都推荐使用encoder
             作用一:将日志信息转换(格式化)为字符串
             作用二:然后写入到文件中-->
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <!-- 过滤掉非error级别的信息 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <!-- 作用是拒绝写入所有与<level>不匹配的日志信息,
            也就是非error级别的日志信息都不会被写入到日志文件中 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 开发环境 -->
    <springProfile name="dev">
        <!-- 也是一种<logger>,是所有<logger>的父级 -->
        <!-- 不设置additivity属性,或者设置additivity = true的<logger>,会继承root的子标签<appender-ref ref="console" />的设置,
            将它自己设置的level属性级别及以上的日志打印到控制台 -->
        <root level="info">
            <!-- 表示按照console的设置去输出日志到控制台 -->
            <appender-ref ref="console" />
        </root>
    </springProfile>
    <!-- 测试环境+生产环境 -->
    <springProfile name="test,prod">
        <!-- 监听com.wj.log包下所有类产生的日志信息
        不设置additivity属性,那么默认additivity = true,表示会继承父级(在这里它的父级只有root一个),
        也就是会将日志信息也输出在控制台,但级别会覆盖父级的级别,也就是在控制台会输出debug级别及以上的日志信息 -->
        <logger name="com.wj.log" level="debug">
            <!-- 表示按照debugAppender的设置去打印日志 -->
            <appender-ref ref="debugAppender"/>
            <!-- 表示按照infoAppender的设置去打印日志 -->
            <appender-ref ref="infoAppender"/>
            <!-- 表示按照errorAppender的设置去打印日志 -->
            <appender-ref ref="errorAppender"/>
        </logger>
        <root level="info">
            <appender-ref ref="console" />
        </root>
    </springProfile>
</configuration>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容