按天输出日志文件,当天的日志在固定文件名输出,备份文件才按配置文件名保存;
异步打印日志
分环境输出日志,阿里云日志服务
<?xml version="1.0" encoding="UTF-8" ?>
<!-- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<property name="logBasePath" value="/data"/>
<!-- 应用名称 -->
<springProperty scope="context" name="applicationName" source="spring.application.name"/>
<!-- 应用环境 -->
<springProperty scope="context" name="profilesActive" source="spring.profiles.active"/>
<!--
c{length}、lo{length}、logger{length}: 输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。
C{length}、class {length}: 输出执行记录请求的调用者的全限定名。参数与上面的一样。尽量避免使用,除非执行速度不造成任何问题。
contextName、cn: 输出上下文名称。
d{pattern}、date{pattern}: 输出日志的打印日志,模式语法与java.text.SimpleDateFormat 兼容。
%d / %date / %date{ISO8601} / %date{yyyy-MM-dd HH:mm:ss,SSS}: 2021-09-07 10:00:00,233
F/file: 输出执行记录请求的java源文件名。尽量避免使用,除非执行速度不造成任何问题。
caller{depth}、caller{depth, evaluator-1, ... evaluator-n}: 输出生成日志的调用者的位置信息,整数选项表示输出信息深度。
L/line: 输出执行日志请求的行号。尽量避免使用,除非执行速度不造成任何问题。
m / msg / message: 输出应用程序提供的信息。
M/method: 输出执行日志请求的方法名。尽量避免使用,除非执行速度不造成任何问题。
n: 输出平台先关的分行符“\n”或者“\r\n”。
p / le / level: 输出日志级别。
r / relative: 输出从程序启动到创建日志记录的时间,单位是毫秒。
t / thread: 输出产生日志的线程名。
replace(p){r, t}: p为日志内容,r是正则表达式,将p中符合r的内容替换为t。
格式修饰符: 与转换符共同使用,可选的格式修饰符位于“%”和转换符之间。
https://www.cnblogs.com/chrischennx/p/6781574.html
左对齐修饰符: 符号是减号“-”,接着是可选的最小宽度修饰符,用十进制数表示。
如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。如果字符大于最小宽度,字符永远不会被截断。
最大宽度修饰符: 符号是点号"."后面加十进制数。如果字符大于最大宽度,则从前面截断。点符号“.”后面加减号“-”在加数字,表示从尾部截断。
Format modifier Logger name Result
[%20.20logger] main.Name [ main.Name]
[%-20.20logger] main.Name [main.Name ]
[%10.10logger] main.foo.foo.bar.Name [o.bar.Name]
[%10.-10logger] main.foo.foo.bar.Name [main.foo.f]
%X用于输出和当前线程相关联的NDC(嵌套诊断环境),在代码中给org.slf4j.MDC添加key/value即可增加新值
%X 输出所有值
%X{testKey} 输出testKey所对应的value,且无默认值
%X{testKey:-} 输出testKey所对应的value,默认为空
%X{testKey:-aaa} 输出testKey所对应的value,默认为aaa
————————————————
版权声明:本文为CSDN博主「snail_bi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/snail_bi/article/details/103496697
-->
<property name="pattern" value="%d %-5level [%thread] %logger{0}: [%X{trace:-}] %msg%n"/>
<!-- 控制台输出 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${pattern}</pattern>
</layout>
</appender>
<!-- 按天输出日志文件 -->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- file 当天的日志打印在${applicationName}.log,当天之前的才备份为${applicationName}-%d{yyyy-MM-dd}.log -->
<file>${logBasePath}/${applicationName}/${applicationName}.log</file>
<encoder>
<charset>utf-8</charset>
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logBasePath}/${applicationName}/${applicationName}-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 异步输出 -->
<appender name="asyncInfoAppender" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 异步输出需要设置为true才能输出行号等信息 -->
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="infoAppender"/>
</appender>
<!-- 阿里云日志服务 开始 -->
<springProfile name="uat,prod">
<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
<appender name="aliyun" class="com.aliyun.openservices.log.logback.LoghubAppender">
<!-- Required parameters -->
<!-- Configure account and network -->
<endpoint>cn-***.log.aliyuncs.com</endpoint>
<accessKeyId>*********</accessKeyId>
<accessKeySecret>*********</accessKeySecret>
<!-- Configure sls -->
<springProfile name="uat">
<project>app-uat</project>
<logStore>app-uat-logstore</logStore>
</springProfile>
<springProfile name="prod">
<project>app</project>
<logStore>app_log_store</logStore>
</springProfile>
<!-- Required parameters(end) -->
<!-- Optional parameters -->
<topic>${applicationName}-${profilesActive}</topic>
<source></source>
<!-- Optional parameters -->
<totalSizeInBytes>104857600</totalSizeInBytes>
<maxBlockMs>60000</maxBlockMs>
<ioThreadCount>8</ioThreadCount>
<batchSizeThresholdInBytes>524288</batchSizeThresholdInBytes>
<batchCountThreshold>4096</batchCountThreshold>
<lingerMs>2000</lingerMs>
<retries>10</retries>
<baseRetryBackoffMs>100</baseRetryBackoffMs>
<maxRetryBackoffMs>100</maxRetryBackoffMs>
<!-- Optional parameters -->
<encoder>
<pattern>${pattern}</pattern>
</encoder>
<!-- Optional parameters -->
<timeFormat>yyyy-MM-dd'T'HH:mmZ</timeFormat>
<!-- Optional parameters -->
<timeZone>UTC</timeZone>
</appender>
</springProfile>
<!-- 阿里云日志服务 结束 -->
<!-- 分环境输出日志 -->
<springProfile name="uat,prod">
<root level="info">
<appender-ref ref="aliyun"/>
</root>
</springProfile>
<springProfile name="dev,test">
<root level="info">
<appender-ref ref="asyncInfoAppender"/>
</root>
</springProfile>
<springProfile name="local">
<root level="info">
<appender-ref ref="consoleAppender"/>
<appender-ref ref="asyncInfoAppender"/>
</root>
</springProfile>
</configuration>