logback输出日志到不同文件

本文介绍如何使用Logback实现日志按包名及日志级别分别输出的方法。通过配置,可以将不同包下的日志输出到不同的文件中,并且能够针对不同级别的日志进行过滤,将特定级别的日志输出到单独的文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不同包的日志可能要放到不同的文件中,如service层和dao层的日志; 
不同日志级别:调试、信息、警告和错误等也要分文件输出。 

一、根据包输出,通过logger的name属性指定不同的包 

1. 创建不同包下的两个类: 
Java代码  收藏代码
package com.john.service;  
  
@Service  
public class ObligationService {  
    static final Logger log = LoggerFactory.getLogger(ObligationService.class);  
  
    @Resource  
    ObligationDao dao;  
      
    public void obligate() {  
        log.debug("obligate start...");  
        dao.queryObligations();  
        log.error("An error occurred during the progress");  
        log.debug("obligate end...");  
    }  
}  


Java代码  收藏代码
package com.john.dao;  
  
@Repository  
public class ObligationDao {  
    static final Logger log = LoggerFactory.getLogger(ObligationDao.class);  
      
    public void queryObligations() {  
        log.debug("query obligations start...");  
        log.error("An error occurred during the query");  
        log.debug("query obligations end...");  
    }  
}  


2. 在logback(-test).xml中添加: 
Xml代码  收藏代码
<appender name="serviceAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  
    <file>/logs/bribery.log</file>  
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
        <fileNamePattern>/logs/bribery-%d{yyyy-MM-dd}.log</fileNamePattern>  
    </rollingPolicy>  
    <encoder>  
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>  
    </encoder>  
</appender>  
  
<appender name="daoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  
    <file>/logs/venality.log</file>  
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
        <fileNamePattern>/logs/venality-%d{yyyy-MM-dd}.log</fileNamePattern>  
    </rollingPolicy>  
    <encoder>  
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>  
    </encoder>  
</appender>  
  
<logger name="com.john.service" level="DEBUG" additivity="false">  
    <appender-ref ref="serviceAppender" />  
</logger>  
  
<logger name="com.john.dao" level="DEBUG" additivity="false">  
    <appender-ref ref="daoAppender" />  
</logger>  


在类路径下创建Spring的beans.xml文件:(beans节点省略) 
Xml代码  收藏代码
<context:component-scan base-package="com.john" />  


3. 测试方法: 
Java代码  收藏代码
@Test  
public void dispatchByPackageTest() {  
    AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");  
    ObligationService service = ctx.getBean(ObligationService.class);  
    service.obligate();  
}  

执行测试后, 
bribery.log: 
15:59:59.839 [main] DEBUG c.j.s.ObligationService - obligate start... 
15:59:59.844 [main] ERROR c.j.s.ObligationService - An error occurred during the progress 
15:59:59.844 [main] DEBUG c.j.s.ObligationService - obligate end... 

venality.log: 
15:59:59.844 [main] DEBUG c.j.d.ObligationDao - query obligations start... 
15:59:59.844 [main] ERROR c.j.d.ObligationDao - An error occurred during the query 
15:59:59.844 [main] DEBUG c.j.d.ObligationDao - query obligations end... 

二、根据日志级别输出 

这里把所有级别为ERROR的日志输出到一个文件中 

1. 修改logback(-test).xml文件 

serviceAppender和daoAppender都加入以下级别过滤器,这样错误日志就不会在bribery.log和venality.log中打印了: 
Xml代码  收藏代码
<filter class="ch.qos.logback.classic.filter.LevelFilter">  
    <level>ERROR</level>  
    <onMatch>DENY</onMatch>  
    <onMismatch>ACCEPT</onMismatch>  
</filter>  


新建一个错误日志的appender: 
Xml代码  收藏代码
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  
    <file>/logs/error.log</file>  
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
        <fileNamePattern>/logs/venality-%d{yyyy-MM-dd}.log</fileNamePattern>  
    </rollingPolicy>  
    <encoder>  
        <pattern>%d{HH:mm:ss.SSS} %thread %X{invokeNo} %logger{40} %msg%n</pattern>  
    </encoder>  
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->  
        <level>ERROR</level>  
        <onMatch>ACCEPT</onMatch>  
        <onMismatch>DENY</onMismatch>  
    </filter>  
</appender>  


name为com.john.dao和com.john.service的logger都加上errorAppender: 
Xml代码  收藏代码
<appender-ref ref="errorAppender" />  


2. 执行上面的测试方法,service和dao的错误日志都打印到error.log文件中了: 
16:12:51,433 main com.john.dao.ObligationDao An error occurred during the query 
16:12:51,433 main com.john.service.ObligationService An error occurred during the progress

转载于:https://my.oschina.net/u/2764409/blog/700234

<think>我们面对的任务是:在JUnit测试中配置SLF4J与Logback,将日志信息写入文件。 步骤: 1. 添加必要的依赖(Maven示例) 2. 创建Logback的配置文件logback-test.xml)并放置在测试资源目录下(src/test/resources) 3. 在配置文件中配置文件追加器(FileAppender)以及相关的输出设置 4. 在测试代码中使用SLF4J的Logger进行日志记录 5. 确保测试运行时使用该配置 详细步骤: 第一步:添加依赖(如果项目还没有引入Slf4j和Logback) 在pom.xml中添加以下依赖(版本号根据实际情况调整): ```xml <dependencies> <!-- SLF4J API --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- Logback 核心 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.11</version> </dependency> <!-- Logback 经典实现(包含Slf4j的绑定) --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> <scope>test</scope> </dependency> <!-- 如果需要,添加JUnit依赖(假设使用JUnit5) --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> </dependencies> ``` 第二步:创建Logback配置文件 在`src/test/resources`目录下创建`logback-test.xml`文件(注意:测试环境使用`logback-test.xml`,而主程序使用`logback.xml`,这样测试时Logback会自动加载测试配置)。 配置文件内容示例(将日志输出文件): ```xml <configuration> <!-- 定义文件输出格式 --> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /> <!-- 文件追加器,将日志写入文件 --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <!-- 设置日志文件路径(这里输出到项目根目录下的target目录,文件名为test.log) --> <file>target/test.log</file> <!-- 设置输出格式 --> <encoder> <pattern>${LOG_PATTERN}</pattern> </encoder> </appender> <!-- 设置根日志级别,并引用文件追加器 --> <root level="INFO"> <appender-ref ref="FILE" /> </root> </configuration> ``` 第三步:在测试类中使用SLF4J记录日志 示例测试类: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.junit.jupiter.api.Test; public class MyTest { private static final Logger logger = LoggerFactory.getLogger(MyTest.class); @Test public void testLogging() { logger.info("This is an info message"); logger.error("This is an error message"); } } ``` 运行测试后,日志将写入`target/test.log`文件中。 注意事项: 1. 确保配置文件在测试资源目录下,且命名为`logback-test.xml`(这是Logback在测试环境默认加载的配置文件名)。 2. 如果需要同时输出到控制台和文件,可以配置多个appender,并在root中引用多个appender。 3. 日志文件路径可以根据需要调整。 扩展:如果希望每个测试类单独一个日志文件,可以动态设置文件名(例如使用测试类名),这需要更复杂的配置(如使用SiftingAppender)或通过编程方式配置Logback。 相关问题: 1. 如何在Logback配置中同时输出到控制台和文件? 2. 如何按日志级别将日志输出不同文件? 3. 如何在JUnit测试中动态设置日志文件名(例如使用测试类名)? 4. 如何配置Logback以支持日志文件的滚动(例如按日期或大小滚动)?</think>### 在JUnit测试中配置SLF4J与Logback输出日志文件 以下是完整配置步骤(基于Maven项目): #### 1. 添加依赖(pom.xml) ```xml <dependencies> <!-- SLF4J API --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- Logback 实现 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> <scope>test</scope> </dependency> <!-- JUnit 5 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> </dependencies> ``` #### 2. 创建Logback配置文件(src/test/resources/logback-test.xml) ```xml <configuration> <!-- 文件输出配置 --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>target/test-logs/test.log</file> <!-- 日志文件路径 --> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 控制台输出配置(可选) --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 根日志级别配置 --> <root level="INFO"> <appender-ref ref="FILE" /> <!-- 如需同时输出到控制台,添加此行 --> <!-- <appender-ref ref="STDOUT" /> --> </root> </configuration> ``` #### 3. 测试类示例 ```java import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; class MyServiceTest { private static final Logger logger = LoggerFactory.getLogger(MyServiceTest.class); @Test void testLogging() { logger.info("测试开始 - 日志将写入文件"); logger.debug("调试信息"); // 默认不输出(因级别为INFO) logger.error("模拟错误日志"); logger.info("测试结束"); } } ``` #### 4. 验证结果 运行测试后,日志文件将生成在: `项目目录/target/test-logs/test.log` 内容示例: ``` 2023-08-10 14:23:45.678 [main] INFO com.example.MyServiceTest - 测试开始 - 日志将写入文件 2023-08-10 14:23:45.679 [main] ERROR com.example.MyServiceTest - 模拟错误日志 2023-08-10 14:23:45.680 [main] INFO com.example.MyServiceTest - 测试结束 ``` #### 关键配置说明 1. **文件位置**:必须放在`src/test/resources`目录 2. **配置文件命名**: - 测试环境专用:`logback-test.xml` - 主环境使用:`logback.xml` 3. **日志级别控制**: - 修改`<root level="INFO">`中的级别 - 支持:TRACE, DEBUG, INFO, WARN, ERROR 4. **高级特性**(可选): ```xml <!-- 按日期滚动日志 --> <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>target/test-logs/test.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>target/test-logs/test.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder><pattern>%msg%n</pattern></encoder> </appender> ``` > **注意**:测试配置不会影响主程序日志Logback在测试环境会自动优先加载`logback-test.xml`[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值