1. 项目结构
实现 (a) A B C D 类都有对应的独立日志文件 (b) 一个全局的info级别日志文件并保留历史日志 (c) 一个全局的error级别的日志文件并保留历史日志
1.1 配置logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 使用caller, 可以像log4j一样, 在日志中输出带有跳转的链接 --> <pattern> %date [%thread] %-5level %replace(%caller{1}){'(\bCaller(.+?)at\b)|\r|\n|\s*|\t', ''} - %msg%n </pattern> </encoder> </appender> <!-- 用于记录所有的error级别的日志 --> <appender name="all_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!-- 存放error级别日志的文件. --> <file>log/all_error/error.log</file> <!-- 按照序列生成滚动日志文件 单个日志文件的生命周期 eg: error.log -r(ename)-> error-his-1.log -r-> ... -r-> error-his-5.log -delete-> null --> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>log/all_error/error-his-%i.log</fileNamePattern> <minIndex>1</minIndex> <maxIndex>5</maxIndex> </rollingPolicy> <!-- 触发条件 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>1MB</maxFileSize> </triggeringPolicy> <encoder> <pattern> %date [%thread] %-5level [%logger:%method:%line] - %msg%n </pattern> </encoder> </appender> <!-- 用于记录所有的info及以上级别的日志 --> <appender name="all_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <file>log/all_info/info.log</file> <!-- 按照时间规则生成日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>log/all_info/info_his_%d{yyyyMMdd_HH/mm}.log </fileNamePattern> <!-- 保留最多5个历史日志 --> <maxHistory>5</maxHistory> </rollingPolicy> <encoder> <pattern> %date [%thread] %-5level [%logger:%method:%line] - %msg%n </pattern> </encoder> </appender> <appender name="a" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/a/a_debug.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <FileNamePattern>log/a/a_debug.%i.log</FileNamePattern> <MinIndex>1</MinIndex> <MaxIndex>5</MaxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>5MB</MaxFileSize> </triggeringPolicy> <encoder> <pattern> %date [%thread] %-5level [%logger:%method:%line] - %msg%n </pattern> </encoder> </appender> <appender name="b" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/b/b_info.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <FileNamePattern>log/b/b_info.%i.log</FileNamePattern> <MinIndex>1</MinIndex> <MaxIndex>5</MaxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>5MB</MaxFileSize> </triggeringPolicy> <encoder> <pattern> %date [%thread] %-5level [%logger:%method:%line] - %msg%n </pattern> </encoder> </appender> <appender name="c" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/c/c_warn.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <FileNamePattern>log/c/c_warn.%i.log</FileNamePattern> <MinIndex>1</MinIndex> <MaxIndex>5</MaxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>5MB</MaxFileSize> </triggeringPolicy> <encoder> <pattern> %date [%thread] %-5level [%logger:%method:%line] - %msg%n </pattern> </encoder> </appender> <appender name="d" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/d/d_error.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <FileNamePattern>log/d/d_error.%i.log</FileNamePattern> <MinIndex>1</MinIndex> <MaxIndex>5</MaxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>5MB</MaxFileSize> </triggeringPolicy> <encoder> <pattern> %date [%thread] %-5level [%logger:%method:%line] - %msg%n </pattern> </encoder> </appender> <root level="ALL"> <appender-ref ref="all_info" level="ALL"></appender-ref> <appender-ref ref="all_error"></appender-ref> <appender-ref ref="STDOUT"></appender-ref> </root> <!-- 记录logger name为com.homeway.logger.a.* 输出的 debug级别及以上的日志, 并保存到独立的日志文件中 --> <logger name="com.homeway.logger.a" level="DEBUG" additivity="false"> <appender-ref ref="a"></appender-ref> </logger> <logger name="com.homeway.logger.b" level="INFO"> <appender-ref ref="b"></appender-ref> </logger> <logger name="com.homeway.logger.c" level="WARN"> <appender-ref ref="c"></appender-ref> </logger> <logger name="com.homeway.logger.d" level="ERROR"> <appender-ref ref="d"></appender-ref> </logger> </configuration>
常用模板
<!-- simple caller --> %date{HH:mm:ss.SSS} %-5level %replace(%caller{1}){'(Caller(.+?)(?=\())|\r|\n|\s*|\t', ''} - %msg%n <!-- fully caller --> %date %-5level %replace(%caller{1}){'(\bCaller(.+?)at\b)|\r|\n|\s*|\t', ''} - %msg%n
1.2 测试代码
1.2.1 com.homeway.logger.a.A.java (classes B,C,D类似)
package com.homeway.logger.a; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class A { static final Logger log = LoggerFactory.getLogger(A.class); public A(){ log.debug(" A - debug "); log.info(" A - info "); log.warn(" A - {} ", "warn"); log.error(" {} - {} ", "A" , "error"); } }
1.2.2 com.homeway.logger.LoggerTest.java
package com.homeway.logger; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.homeway.logger.a.A; import com.homeway.logger.b.B; import com.homeway.logger.c.C; import com.homeway.logger.d.D; public class LoggerTest { static final Logger logger = LoggerFactory.getLogger(LoggerTest.class); public static void log(){ logger.debug("hello {}", "world"); A a = new A(); B b = new B(); C c = new C(); D d = new D(); logger.warn("logged classes: {}, {}, {}, {}", a.getClass(), b.getClass(), c.getClass(), d.getClass()); } public static void main(String[] args) throws Exception { logger.info("start logger test."); // 定时任务 ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); exec.scheduleAtFixedRate(new Runnable() { @Override public void run() { log(); } }, 0, 1, TimeUnit.MINUTES); } }
1.3 运行后生成的日志文件目录结构
项目代码附件 : Logger.7z
相关推荐
本文将详细介绍如何使用SLF4J与Logback来输出应用程序的日志,并提供必要的配置和依赖知识。 1. **SLF4J介绍** SLF4J提供了一种统一的日志接口,使得开发者可以在不改变代码的情况下切换不同的日志实现,如Log4j、...
在Spring MVC应用中,你可以通过SLF4J的LoggerFactory获取Logger实例,并在控制器、服务、DAO等各个层记录日志。例如: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Test...
3. **使用Slf4j API**: 在Java代码中,通过import slf4j的LoggerFactory来获取Logger实例,然后调用其各种方法记录日志。例如: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public ...
Spring Boot默认集成了SLF4J和Logback,并提供了自动配置,只需在`application.properties`或`application.yml`中调整日志配置即可。 通过上述内容,我们可以了解到SLF4J和Logback日志系统的使用方法以及其主要特点...
在代码中,你可以使用SLF4J的LoggerFactory获取Logger实例,然后通过调用各种级别的方法(如`debug()`, `info()`, `warn()`, `error()`等)来记录日志。 ```java import org.slf4j.Logger; import org.slf4j....
接下来,我们来看看如何配置Logback作为SLF4J的日志实现。Logback的核心组件包括`ch.qos.logback.classic.LoggerContext`,它是日志配置的上下文,以及`ch.qos.logback.classic.Logger`,它是实际的日志器类。在`src...
SLF4J(Simple Logging Facade for Java)和Logback是Java日志处理中的两个重要组件,它们在软件开发中广泛用于记录应用程序的运行时信息。SLF4J作为一个日志门面,提供了一种标准的接口,允许开发者在运行时插入...
SLF4J(Simple Logging Facade for Java)是一个日志门面,它为各种日志框架提供一个统一的接口,如Logback、Log4j、Java Util Logging等。它的主要目标是使日志库与应用程序解耦,让开发者能够在不修改代码的情况...
1. **SLF4J API**:项目中的Java代码将使用SLF4J的API来记录日志,如`LoggerFactory.getLogger()`方法获取logger实例,然后调用`info()`, `debug()`, `error()`等方法记录不同级别的日志。 2. **Logback配置**:...
SLF4J提供了一个抽象层,允许开发者在部署时插入所需的日志实现,比如Log4j、Logback等。这样做的好处是提高了代码的可移植性和灵活性,因为不同的项目可能有不同的日志需求或偏好。 SLF4J的核心组件是`slf4j-api-1...
SLF4J提供了一个接口层,允许开发者在不改变代码的情况下切换不同的日志实现,比如Logback或Log4j。Log4j则是Apache组织的一个经典日志记录工具,提供了丰富的日志级别、灵活的日志配置以及多种输出格式。 在这个...
SLF4J(Simple Logging Facade for Java)是Java的日志抽象层,它提供了一种标准的接口,允许用户在不修改代码的情况下更换不同的日志框架,如Log4j、Logback等。Log4j2是Log4j的升级版,提供了更优秀的性能和更多的...
**Logback-SLF4J配置文件详解** 在Java开发中,日志管理是不可或缺的一部分,Logback和SLF4J(Simple Logging Facade for Java)是广泛使用的日志框架。SLF4J提供了一个接口层,允许开发者选择任何底层的日志实现,...
4. 配置SLF4J:在应用的配置文件中,比如`logback.xml`或`logging.properties`,指定我们的自定义日志处理器为SLF4J的日志实现。 在“mongodbdemo”这个项目中,可能包含了实现这一功能的示例代码。通过分析这些...
这个实例将围绕Spring Boot如何集成SLF4J(Simple Logging Facade for Java)和Logback进行详细讲解。 SLF4J是一个日志门面,提供了一种标准的日志API,允许我们在部署时选择不同的日志实现。Logback是SLF4J的一个...
它的主要目标是为各种日志框架(如Logback、Log4j等)提供一个统一的接口,使得在项目中切换日志框架变得简单。SLF4J的核心概念包括Logger、Level和Marker,它们分别用于定义日志记录器、控制日志级别和标记特定的...
SLF4J是一个日志门面接口,它为各种日志框架提供了统一的编程接口,如Logback、Log4j等。Log4j则是一个具体的日志实现,它提供了丰富的日志功能和高性能的特性。下面我们将详细讨论这两个组件以及如何在Java项目中...
在代码中,你可以使用SLF4J的LoggerFactory获取一个Logger实例,然后通过这个实例进行日志记录。SLF4J的API提供了各种方法,如`info()`, `debug()`, `warn()` 和 `error()`,对应不同级别的日志输出。 7. **总结**...
本文将详细探讨如何通过SLF4J接口来使用Log4j进行日志记录,并展示一个测试代码实例。 **SLF4J简介** SLF4J是一个抽象层,为各种日志框架提供了统一的API,如Logback、Log4j等。它的主要优点在于可以让你在不修改...