logback按等级输出到不同日志文件


最近开发了不少项目,因为想把错误日志单独输出到另一个文件中,所以好好研究了下logback日志,在此记录下。

本文主要解决两个问题

  1. springboot使用使用不同日志配置文件
  2. 不同级别日志多文件输出
  3. 某个模块的日志单独输出到一个日志文件

springboot使用使用不同日志配置文件

  1. 在springboot的application.properties配置文件(application.yml同理)添加logging.config=classpath:logback-debug.xml
  2. 在src/java/resources下创建logback-debug.xml

不同级别日志多文件输出及某个模块的日志单独输出到一个日志文件

日志多文件输出场景

  • 先说一个需求,然后根据需求引出配置,讲解配置。
  • 需求:info及以上级别的日志输出到一个文件,warn及以上级别的日志输出到另外一个文件。

XML配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

	<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
	<property name="LOG_HOME" value="/home/logs" />
	<property name="AppName" value="demo" />
	<!-- 日志输出格式 -->
	<!--格式化输出:%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,[%method,%line]:方法名及行号,%msg:日志消息,%n:换行符 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
	<!-- 控制台输出 -->
	<appender name="STDOUT"
		class="ch.qos.logback.core.ConsoleAppender">
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>${log.pattern}</pattern>
		</encoder>
	</appender>
	<!-- 按照每天生成日志文件 -->
	<appender name="INFO_FILE"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_HOME}/${AppName}.info.log</file>
		<rollingPolicy
			class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<!--日志文件输出的文件名 -->
			<FileNamePattern>${LOG_HOME}/${AppName}.info.%d{yyyy-MM-dd}.%i.log
			</FileNamePattern>
			<!--日志文件保留天数 -->
			<MaxHistory>30</MaxHistory>
			<maxFileSize>100MB</maxFileSize>
		</rollingPolicy>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>${log.pattern}</pattern>
		</encoder>
	</appender>
	<!-- 按照每天生成日志文件 -->
	<appender name="ERROR_FILE"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_HOME}/${AppName}.error.log</file>
		<rollingPolicy
			class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<!--日志文件输出的文件名 -->
			<FileNamePattern>${LOG_HOME}/${AppName}.error.%d{yyyy-MM-dd}.%i.log
			</FileNamePattern>
			<!--日志文件保留天数 -->
			<MaxHistory>30</MaxHistory>
			<maxFileSize>100MB</maxFileSize>
		</rollingPolicy>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>${log.pattern}</pattern>
		</encoder>
		<!-- 允许打印警告日志到文件的过滤器 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>WARN</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>NEUTRAL</onMismatch>
		</filter>
		<!-- 允许打印错误日志到文件的过滤器 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<!-- onMatch,onMismatch取值及含义 -->
			<!-- DENY:日志将立即被抛弃不再经过其他过滤器,最后一个filter的onMismatch使用 -->
			<!-- NEUTRAL:有序列表里的下个过滤器过接着处理日志,非最后一个filter的onMismatch使用 -->
			<!-- ACCEPT:日志会被立即处理,不再经过剩余过滤器,所有filter的onMatch使用 -->
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<!-- 单独输出到一个日志文件 -->
	<appender name="SINGLE_FILE"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_HOME}/${AppName}.info.log</file>
		<rollingPolicy
			class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<!--日志文件输出的文件名 -->
			<FileNamePattern>${LOG_HOME}/${AppName}.info.%d{yyyy-MM-dd}.%i.log
			</FileNamePattern>
			<!--日志文件保留天数 -->
			<MaxHistory>30</MaxHistory>
			<maxFileSize>100MB</maxFileSize>
		</rollingPolicy>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>${log.pattern}</pattern>
		</encoder>
	</appender>

	<!--myibatis log configure -->
	<logger name="com.apache.ibatis" level="TRACE" />
	<logger name="java.sql.Connection" level="DEBUG" />
	<logger name="java.sql.Statement" level="DEBUG" />
	<logger name="java.sql.PreparedStatement" level="DEBUG" />
	<!--该路径的日志文件单独按SINGLE_FILE的设置输出到另外的文件中-->
	<logger name="c.o.m.n" level="INFO" additivity="false">
        <appender-ref ref="SINGLE_FILE"/>
    </logger>
	<logger name="c.o.m" level="INFO" />

	<!-- 日志输出级别 -->
	<root level="INFO">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="INFO_FILE" />
		<appender-ref ref="ERROR_FILE" />
	</root>
</configuration>

标签组件

  • 定义打印组件
<appender>
...
</appender>
  • 定义指定包路径日志级别
<logger name="c.o.m" level="INFO" />
  • 日志关联打印组件
<root><appender-ref ref="STDOUT" /></root>

控制日志输出到不同文件的关键标签filter讲解

<filter class="ch.qos.logback.classic.filter.LevelFilter">
	<level>WARN</level>
	<onMatch>ACCEPT</onMatch>
	<onMismatch>NEUTRAL</onMismatch>
</filter>
  1. level:拦截的日志级别
  2. onMatch:匹配level后的处理方式
  3. onMismatch:未匹配level后的处理方式
  4. onMatch和onMismatch取值说明
    DENY:日志将立即被抛弃不再经过其他过滤器,最后一个filter的onMismatch使用
    NEUTRAL:有序列表里的下个过滤器过接着处理日志,非最后一个filter的onMismatch使用
    ACCEPT:日志会被立即处理,不再经过剩余过滤器,所有filter的onMatch使用

推荐一个详细讲解logback.xml标签的网址

### 如何在 `logback.xml` 中配置日志等级 #### 日志等级概述 Logback 支持多种日志等级,这些等级按照严重程度从低到高排列:TRACE、DEBUG、INFO、WARN 和 ERROR。每种日志等级表示不同的消息重要性[^1]。 #### 配置日志等级的语法 在 `logback.xml` 文件中,可以通过 `<logger>` 或 `<root>` 节点来设置日志等级。以下是具体的配置方法: - 使用 `<level>` 子节点指定日志等级。 - 可以为特定包或类单独设定日志等级,也可以为整个应用(根记录器)统一设定日志等级。 #### 示例代码 以下是一个完整的 `logback.xml` 配置示例,展示了如何设置不同级别日志输出: ```xml <configuration> <!-- 定义控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 设置全局默认日志级别 --> <root level="INFO"> <appender-ref ref="STDOUT"/> </root> <!-- 为某个具体包设置更详细的日志级别 --> <logger name="com.example.myproject" level="DEBUG"/> <!-- 为另一个包禁用日志 (相当于ERROR以上才输出) --> <logger name="org.hibernate.SQL" level="OFF"/> </configuration> ``` 在这个例子中: - 根记录器的日志等级被设为 INFO,这意味着只有 INFO、WARN 和 ERROR 级别日志会被输出。 - 对于 `com.example.myproject` 包下的类,默认日志等级改为 DEBUG,这使得该包内的 TRACE 和 DEBUG 级别日志也会被打印出来。 - 关闭了 `org.hibernate.SQL` 的所有日志输出,即其日志等级被设为 OFF。 #### 动态调整日志文件名模式 如果希望按时间分割日志文件并保留一定历史长度,则可以结合 `<fileNamePattern>` 和 `<maxHistory>` 进行配置[^4]。例如: ```xml <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/application.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/archive/application-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>7</maxHistory> </rollingPolicy> <encoder> <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> </encoder> </appender> ``` 上述配置实现了每日生成一个新的日志文件,并最多保存最近七天的历史日志文件。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那你为何对我三笑留情

感谢支持,沉淀自己,帮助他人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值