在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