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/