logback 配置 不同level日志输出到不同文件 按天 大小拆分

本文介绍了如何使用logback配置,将不同级别的日志(如ERROR, WARN, INFO)输出到不同的文件,并按天和大小进行拆分,实现高效日志管理和存储。" 129548744,10971543,2023中职网络安全竞赛:attack.pcapng数字取证分析详解,"['网络安全', '网络取证', '数据包分析', 'TCP/IP', '服务器安全']

logback.xml

<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
<configuration scan="true" scanPeriod="10 seconds">

	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
	
		 <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
		<!-- encoders are assigned by default the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
		<encoder>
			<pattern>
				%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
			</pattern>
		</encoder>
	</appender>
	
	<appender name="debug"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.dir}/logs/debug.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- daily rollover -->
			<fileNamePattern>${log.dir}/logs/debug.%d{yyyy-MM-dd}.log.%i</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>200MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
		</rollingPolicy>
		<filter class="ch.qos.logback
<think> 我们有一个需求:将指定的日志级别(level)和内容输出不同日志文件中。在Logback中,我们可以通过配置多个Appender和Logger来实现。 根据引用[1]和引用[2],我们可以通过定义不同的logger,每个logger关联一个appender,而每个appender可以指定输出不同文件,并且可以设置日志级别。同时,引用[2]中展示了在代码中通过LoggerFactory.getLogger(name)获取指定名称的logger,然后使用这个logger进行日志记录,这样日志就会输出配置文件中为该logger指定的appender中。 另外,引用[4]提到了按日志级别和日期拆分日志,但这里我们更关注按级别和内容(实际上内容可以通过logger名称来区分)输出不同文件。 实现方法: 1. 定义多个appender,每个appender对应一个文件,并且可以设置不同日志级别过滤(例如,只输出ERROR级别,或者只输出INFO级别等)。 2. 定义多个logger,每个logger可以指定一个name,并关联到相应的appender,同时可以设置日志级别(可选)。 3. 在代码中,使用特定的logger(通过LoggerFactory.getLogger(name))来记录日志,这样日志就会被路由到对应的appender,从而写入不同文件。 但是,如果需求是“指定的level和内容”,这里“内容”可能是指日志消息的内容?通常,我们通过不同的logger来区分不同的业务模块(也就是内容),而level则是日志的级别。 如果“内容”指的是日志消息中包含某些关键字,那么我们可以使用Logback的过滤器(Filter)来实现,例如使用`EvaluatorFilter`或`MatcherFilter`来匹配消息内容。 下面我们将分别介绍两种场景: 场景一:按日志级别和不同的业务模块(即不同的logger)输出不同文件。 场景二:按日志级别和日志消息内容输出不同文件(使用过滤器)。 下面给出配置示例: 场景一:按业务模块和级别分离 假设我们有两个业务模块:datasource和init,我们想将datasource模块的日志输出到datasource.log,将init模块的日志输出到init.log,同时每个模块的日志按级别分离(比如ERROR级别单独输出)。 我们可以这样配置: 步骤: 1. 为每个模块定义两个appender:一个用于普通日志(比如INFO),一个用于错误日志(ERROR),并按日期滚动。 2. 为每个模块定义logger,并关联对应的appender。 示例配置logback.xml): ```xml <configuration> <!-- 公共配置,例如控制台输出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 为datasource模块配置两个appender:一个普通,一个错误 --> <appender name="DATASOURCE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/datasource_info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/datasource_info.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="DATASOURCE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/datasource_error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/datasource_error.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 同样为init模块配置两个appender --> ...(类似,省略) <!-- 定义logger --> <logger name="datasourceLog" level="INFO" additivity="false"> <appender-ref ref="DATASOURCE-INFO" /> <appender-ref ref="DATASOURCE-ERROR" /> <!-- 注意:这里我们同时引用了两个appender,但通过LevelFilter过滤,所以INFO和ERROR会进入不同文件 --> </logger> <logger name="initLog" level="INFO" additivity="false"> <appender-ref ref="INIT-INFO" /> <appender-ref ref="INIT-ERROR" /> </logger> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration> ``` 在代码中,我们使用如下方式记录日志: ```java // 使用datasourceLog这个logger LogConfig.datasourceLog.info("This is a datasource info log."); LogConfig.datasourceLog.error("This is a datasource error log."); // 使用initLog这个logger LogConfig.initLog.info("This is an init info log."); LogConfig.initLog.error("This is an init error log."); ``` 场景二:按日志消息内容分离 如果我们希望根据日志消息的内容(比如包含特定关键字)将日志输出不同文件,我们可以使用`EvaluatorFilter`或者自定义过滤器。 例如,我们想将包含“payment”关键字的日志输出到payment.log,而不管它来自哪个logger。 配置示例: ```xml <appender name="PAYMENT-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/payment.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/payment.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> <expression> // 这里使用Groovy表达式判断日志消息是否包含"payment" return message.contains("payment"); </expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 然后我们可以将这个appender添加到root logger,这样所有日志事件都会经过这个过滤器 --> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="PAYMENT-FILE" /> </root> ``` 注意:使用EvaluatorFilter需要小心性能,因为每条日志都会执行表达式。 另外,我们也可以自定义过滤器,如引用[3]中的ThreadFilter,我们可以类似地创建一个ContentFilter,根据消息内容过滤。 总结: 1. 按业务模块和级别分离:通过不同logger和appender的LevelFilter实现。 2. 按消息内容分离:通过过滤器(如EvaluatorFilter)实现。 根据需求选择合适的方式。 相关问题: 1. 如何配置Logback日志级别将日志拆分不同文件? 2. Logback中如何根据日志消息内容动态路由到不同日志文件? 3. Logback过滤器的使用方法和性能影响? </think>### Logback将指定Level和内容输出不同文件的实现方法 在Logback中,可以通过**多Appender组合+过滤器**实现将特定Level和内容的日志输出不同文件。以下是具体实现方案: #### 方法1:基于Logger名称分离(推荐) ```xml <configuration> <!-- 公共配置 --> <property name="LOG_DIR" value="/logs"/> <!-- 1. 核心业务日志 --> <appender name="CORE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DIR}/core.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/core.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <!-- 只接收INFO级别 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %msg%n</pattern> </encoder> </appender> <!-- 2. 错误日志 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DIR}/error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/error.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <maxHistory>90</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> <!-- 接收ERROR及以上 --> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 3. 特定内容日志(如支付模块) --> <appender name="PAYMENT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DIR}/payment.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/payment.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>50MB</maxFileSize> </rollingPolicy> <encoder> <pattern>%d{ISO8601} %-5level [%thread] %msg%n</pattern> </encoder> </appender> <!-- Logger绑定 --> <logger name="com.example.payment" level="DEBUG" additivity="false"> <appender-ref ref="PAYMENT_FILE"/> <!-- 支付模块日志 --> </logger> <root level="INFO"> <appender-ref ref="CORE_FILE"/> <!-- 核心日志 --> <appender-ref ref="ERROR_FILE"/> <!-- 错误日志 --> </root> </configuration> ``` #### 方法2:基于消息内容过滤 ```xml <!-- 在appender中添加EvaluatorFilter --> <appender name="ALERT_FILE" class="ch.qos.logback.core.FileAppender"> <file>${LOG_DIR}/alert.log</file> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression> // Groovy表达式:匹配包含"ALERT"的内容 message.contains("ALERT") && (level >= WARN) // 警告级别以上 </expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> ``` #### 代码中使用示例 ```java // 1. 按Logger名称输出 Logger paymentLogger = LoggerFactory.getLogger("com.example.payment"); paymentLogger.info("Payment processed: {}", orderId); // 写入payment.log // 2. 按内容输出 Logger rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); rootLogger.error("ALERT: Database connection failed"); // 写入alert.log ``` #### 关键配置说明 1. **LevelFilter**:精确匹配特定日志级别 ```xml <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> ``` 2. **ThresholdFilter**:接收指定级别及以上 ```xml <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> ``` 3. **EvaluatorFilter**:通过Groovy表达式匹配内容 ```xml <expression>message.contains("CRITICAL")</expression> ``` 4. **Logger的additivity**: - `additivity="false"` 阻止日志向上传递 - 避免root logger重复记录相同日志[^2] > **最佳实践**: > 1. 对高频日志使用`SizeAndTimeBasedRollingPolicy`防止单文件过大 > 2. 敏感信息日志单独存储,设置更严格的访问权限 > 3. 生产环境建议结合MDC实现请求链路追踪[^3]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值