logback同步和异步混合输出配置
文件名logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>${app_name}</contextName>
<!-- 读取application.properties中定义的配置项 -->
<springProperty name="app_name" scope="context" source="spring.application.name"/>
<!-- 日志级别 -->
<!-- <springProperty scope="context" name="logLevel" source="logging.level"/>-->
<springProperty scope="context" name="logPath" source="logging.path"
defaultValue="../logs"/>
<!-- 日志最大的历史 7天 -->
<springProperty scope="context" name="log.maxHistory" source="logging.maxHistory"/>
<!-- 日志打输出规范 -->
<springProperty scope="context" name="log.pattern" source="logging.pattern"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- INFO 级别的日志-->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${logPath}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件名称-->
<fileNamePattern>${logPath}/info.%d{yyyy-MM-dd}.log.%i</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
<maxFileSize>300MB</maxFileSize>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- WARN 级别的日志-->
<appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${logPath}/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${logPath}/warn.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
<maxFileSize>300MB</maxFileSize>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- ERROR 级别的日志-->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${logPath}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${logPath}/error.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
<maxFileSize>300MB</maxFileSize>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- vip 日志-->
<appender name="vipAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${logPath}/vip.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${logPath}/vip.%d{yyyy-MM-dd}.log.%i</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
<maxFileSize>200MB</maxFileSize>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="vip" level="${logLevel}" additivity="false">
<appender-ref ref="vipAppender"/>
</logger>
<!-- 推送埋点日志,最终用于对外查询的数据源-->
<appender name="point" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${logPath}/point.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${logPath}/point.%d{yyyy-MM-dd}.log.%i</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
<maxFileSize>200MB</maxFileSize>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 异步输出 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- 默认如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志,若要保留全部日志,设置为0 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 往队列添加时,是否block,默认false[blockingQueue.put],当队列满了后需要等待;如果设为true[blockingQueue.offer],不等待,直接丢弃数据 -->
<neverBlock>false</neverBlock>
<!--是否打印调用方信息-->
<includeCallerData>false</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="point"/>
</appender>
<logger name="point_log" level="INFO" additivity="false">
<appender-ref ref="ASYNC"/>
</logger>
<logger name="com.apache.ibatis" level="WARN"/>
<logger name="java.sql.Connection" level="WARN"/>
<logger name="java.sql.Statement" level="WARN"/>
<logger name="java.sql.PreparedStatement" level="WARN"/>
<logger name="org.springframework" level="INFO"/>
<logger name="org.apache.zookeeper" level="WARN"/>
<logger name="com.lambdaworks.redis" level="INFO"/>
<logger name="org.apache.kafka" level="INFO"/>
<!-- root级别 INFO -->
<root level="INFO">
<!-- 控制台输出 -->
<appender-ref ref="STDOUT"/>
<appender-ref ref="errorAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="warnAppender"/>
</root>
</configuration>
maven依赖
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-access -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.11</version>
</dependency>
系统关闭的回调钩子
@Component
public class LogPointHelper implements ServletContextListener {
/**
*关闭logger
*/
public void contextDestroyed(ServletContextEvent sce) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.stop();
}
}
中文文档:https://logbackcn.gitbook.io/logback/

浙公网安备 33010602011771号