logback 日志归档与切割

在spring boot项目中创建文件:logback-nacos.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    <springProperty scope="context" name="TEST_LOG_SERVER" source="es.logstash.test"/>
    <springProperty scope="context" name="PROD_LOG_SERVER" source="es.logstash.prod"/>
    <springProperty scope="context" name="logDir" source="logback.logDir"/>

    <springProperty scope="context" name="info_maxFileSize" source="logback.info.maxFileSize"/>
    <springProperty scope="context" name="info_maxHistory" source="logback.info.maxHistory"/>
    <springProperty scope="context" name="info_totalSizeCap" source="logback.info.totalSizeCap"/>
    <springProperty scope="context" name="error_maxFileSize" source="logback.error.maxFileSize"/>
    <springProperty scope="context" name="error_maxHistory" source="logback.error.maxHistory"/>
    <springProperty scope="context" name="error_totalSizeCap" source="logback.error.totalSizeCap"/>
    <!--开发环境-->
    <springProfile name="dev">
        <!-- 将日志打印到控制台 -->
        <appender name="STDU" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level |%X{traceId:-}| %logger{35}  - %msg %n</Pattern>
            </encoder>
        </appender>


        <appender name="LOG" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>${TEST_LOG_SERVER}</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
                <customFields>{"appname":"${APP_NAME}"}</customFields>
            </encoder>
        </appender>

        <logger name="org.springframework" level="WARN"/>
        <logger name="org.thymeleaf" level="WARN"/>
        <root level="INFO">
            <appender-ref ref="LOG"/>
            <appender-ref ref="STDU"/>

        </root>

    </springProfile>

    <!--测试环境-->
    <springProfile name="test">
        <!-- 将日志打印到控制台 -->
        <appender name="STDU" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level |%X{traceId:-}| %logger{35}  - %msg %n</Pattern>
            </encoder>
        </appender>

        <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
                所以我们使用下面的策略,可以避免输出 Error 的日志-->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!--过滤 Error-->
                <level>ERROR</level>
                <!--匹配到就禁止-->
                <onMatch>DENY</onMatch>
                <!--没有匹配到就允许-->
                <onMismatch>ACCEPT</onMismatch>
            </filter>
            <File>${logDir}/${APP_NAME}/info.log</File>
            <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
                <FileNamePattern>${logDir}/${APP_NAME}/info.%d{yyyy-MM-dd-HH-mm}.%i.log.gz</FileNamePattern>
                <!-- 单个日志文件最多 100MB -->
                <maxFileSize>${info_maxFileSize}</maxFileSize>
                <!--只保留最近30天的日志-->
                <maxHistory>${info_maxHistory}</maxHistory>
                <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
                <totalSizeCap>${info_totalSizeCap}</totalSizeCap>
            </rollingPolicy>
            <!--日志输出编码格式化-->
            <encoder>
                <charset>UTF-8</charset>
                <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
            </encoder>
        </appender>

        <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
                如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
                的日志改名为今天的日期。即,<File> 的日志都是当天的。
            -->
            <File>${logDir}/${APP_NAME}/error.log</File>
            <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
                <FileNamePattern>${logDir}/${APP_NAME}/error.%d{yyyy-MM-dd-HH-mm}.%i.log.gz</FileNamePattern>
                <!-- 单个日志文件最多 100MB -->
                <maxFileSize>${error_maxFileSize}</maxFileSize>
                <!--只保留最近30天的日志-->
                <maxHistory>${error_maxHistory}</maxHistory>
                <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
                <totalSizeCap>${error_totalSizeCap}</totalSizeCap>
            </rollingPolicy>
            <!--日志输出编码格式化-->
            <encoder>
                <charset>UTF-8</charset>
                <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
            </encoder>
        </appender>

        <appender name="LOG" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>${TEST_LOG_SERVER}</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
                <customFields>{"appname":"${APP_NAME}"}</customFields>
            </encoder>
        </appender>
        <logger name="org.springframework" level="WARN"/>
        <logger name="org.thymeleaf" level="WARN"/>
        <root level="INFO">

            <appender-ref ref="LOG"/>
            <appender-ref ref="STDU"/>
            <appender-ref ref="infoLog"/>
            <appender-ref ref="errorLog"/>
        </root>


    </springProfile>
    <!--开发环境-->
    <springProfile name="prod">
        <!-- 将日志打印到控制台 -->
        <appender name="STDU" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level |%X{traceId:-}| %logger{35}  - %msg %n</Pattern>
            </encoder>
        </appender>

        <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
                所以我们使用下面的策略,可以避免输出 Error 的日志-->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!--过滤 Error-->
                <level>ERROR</level>
                <!--匹配到就禁止-->
                <onMatch>DENY</onMatch>
                <!--没有匹配到就允许-->
                <onMismatch>ACCEPT</onMismatch>
            </filter>
            <File>${logDir}/${APP_NAME}/info.log</File>
            <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
                <FileNamePattern>${logDir}/${APP_NAME}/info.%d{yyyy-MM-dd-HH-mm}.%i.log.gz</FileNamePattern>
                <!-- 单个日志文件最多 100MB -->
                <maxFileSize>${info_maxFileSize}</maxFileSize>
                <!--只保留最近30天的日志-->
                <maxHistory>${info_maxHistory}</maxHistory>
                <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
                <totalSizeCap>${info_totalSizeCap}</totalSizeCap>
            </rollingPolicy>
            <!--日志输出编码格式化-->
            <encoder>
                <charset>UTF-8</charset>
                <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
            </encoder>
        </appender>

        <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
                如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
                的日志改名为今天的日期。即,<File> 的日志都是当天的。
            -->
            <File>${logDir}/${APP_NAME}/error.log</File>
            <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
                <FileNamePattern>${logDir}/${APP_NAME}/error.%d{yyyy-MM-dd-HH-mm}.%i.log.gz</FileNamePattern>
                <!-- 单个日志文件最多 100MB -->
                <maxFileSize>${error_maxFileSize}</maxFileSize>
                <!--只保留最近30天的日志-->
                <maxHistory>${error_maxHistory}</maxHistory>
                <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
                <totalSizeCap>${error_totalSizeCap}</totalSizeCap>
            </rollingPolicy>
            <!--日志输出编码格式化-->
            <encoder>
                <charset>UTF-8</charset>
                <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
            </encoder>
        </appender>

        <appender name="LOG" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>${PROD_LOG_SERVER}</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
                <customFields>{"appname":"${APP_NAME}"}</customFields>
            </encoder>
        </appender>
        <logger name="org.springframework" level="WARN"/>
        <logger name="org.thymeleaf" level="WARN"/>
        <root level="INFO">

            <appender-ref ref="LOG"/>
            <appender-ref ref="STDU"/>
            <appender-ref ref="infoLog"/>
            <appender-ref ref="errorLog"/>
        </root>


    </springProfile>


</configuration>

2:在nacos 加入配置:
特别注意:
totalSizeCap 为所有归档日志加起来的磁盘容量总和,当大于设定值时,就会删除 旧的归档日志。
FileNamePattern 的格式最好不要发生变化,因为归档日志只会统计当前指定格式的日志文件,将相同格式的文件占用磁盘相加得出总占用量与totalSizeCap 的值进行比较

logback:
 #日志路径,以win为例
  logDir: D:/logs/
  info:
    #单个非归档日志文件最多 100MB
    maxFileSize: 4KB
    #只保留最近120天的日志
    maxHistory: 3
    #用来指定所有归档日志文件的总磁盘占用上限大小,那么到了这个值,就会删除旧的日志
    totalSizeCap: 10KB
  error:
    #单个日志文件最多 100MB
    maxFileSize: 4KB
    #只保留最近120天的日志
    maxHistory: 3
    #用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志
    totalSizeCap: 10KB
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容