Logback是用于记录日志。可以与SSM等框架结合使用。
使用Logback不影响业务代码性能。结合SSM的AOP编程可以灵活扩展和修改日志特性。
日志规范
Jakarta Commons Logging(JCL):旧的日志规范。
Simple Logging Facade for Java(slf4j):目前主流的日志规范。不同的阶段有不同的实现。
日志框架:JUL(java.util.logging)、Log4j、Logback、Log4j2。JUL是JDK自带的日志框架。Log4j、Logback是同一个作者,Log4j2是apache基金会对Log4j的升级框架,参考了Logback。目前主流使用的是Logback(官网:https://logback.qos.ch/)。
基本使用
Logback包含三个模块:
logback-core:为其他两个模块提供基础代码。
logback-classic:实现了sfl4j API。
logback-access:与Tomcat、Jetty等Servlet容器集成,提供http访问日志功能。
1、通过Maven导入相关jar包,pom文件配置:
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.5.38</version> </dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.5.38</version> <scope>compile</scope> </dependency>如果使用的是SpringBoot,直接场景包即可包含logback。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.16</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <scope>compile</scope> </dependency> </dependencies>2、编写logback.xml或者logback-spring.xml配置文件(文件名不可自定义,必须是这两个文件名)。
logback.xml:原生加载,不支持Spring特有标签。
logback-spring.xml:SpringBoot容器加载,支持Spring特有标签。
<configuration scan="true" scanPeriod="60 seconds"> <!-- 定义变量 --> <property name="LOG_PATH" value="./logs"/> <property name="LOG_NAME" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/> <!-- 控制台输出:使用 PatternLayout 格式化日志 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>{LOG_NAME}</pattern> </layout> </appender> <!-- 日志文件输出:按天滚动归档,保留90天历史 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${LOG_NAME}.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${LOG_PATH}-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxHistory>90</maxHistory> </rollingPolicy> <encoder> <pattern>{LOG_NAME}</pattern> </encoder> </appender> <!-- 设置根日志级别和输出目标 --> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> </configuration>3、在代码中获取日志对象。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class XXXLog { private static final Logger LOGGER = LoggerFactory.getLogger(XXXLog.class); public static void main(String[] args) { } }4、根据日志级别记录日志信息。
日志级别
Logback日志有六个级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
ALL:打开全部日志。
OFF:关闭全部日志。
开发调试一般使用DEBUG级别,商用环境一般使用INFO级别(即高于INFO级别的日志都会打印)。
<!-- 设置根日志级别和输出目标 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root>配置文件
%d:日期格式。
%-5level:日志级别字符打印5个字符。
%c:在哪个类里面打印的日志。
%thread:当前线程的名字。
%msg:代码中的字符串。
%n:换行。
%logger{}:指定显示的字符数限制。
Logback与Spring AOP编程
在实际项目中,Logback可以结合Spring AOP使用,实现非侵入式日志记录、性能监控和全链路追踪,在微服务场景中,可以界定问题归属,避免模块团队间推诿。
经典写法:
@Aspect @Component @Slf4j public class XXXServiceLog { @Around("execution(* com.xxx.service..*(..))") public Object logMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); String className = signature.getDeclaringTypeName(); String methodName = signature.getName(); // 1. 记录开始时间和参数 long startTime = System.currentTimeMillis(); Object[] args = joinPoint.getArgs(); log.info(">>> 开始执行: {}.{}(), 参数: {}", className, methodName, Arrays.toString(args)); Object result; try { // 2. 执行目标方法 result = joinPoint.proceed(); // 3. 记录返回结果和耗时 long duration = System.currentTimeMillis() - startTime; log.info("<<< 执行成功: {}.{}(), 耗时: {}ms, 结果: {}", className, methodName, duration, result); return result; } catch (Throwable e) { // 4. 记录异常信息 long duration = System.currentTimeMillis() - startTime; log.error("!!! 执行异常: {}.{}(), 耗时: {}ms, 异常信息: {}", className, methodName, duration, e.getMessage(), e); throw e; //必须抛出,否则事务可能无法回滚 } } }Logback结合Spring的AOP编程特性,可以先专注完成业务代码,然后再补充日志。
使用@Around、@Before、@After、@AfterReturning、@AfterThrowing分别在环绕通知、方法执行前、方法执行后、方法正常返回、方法抛出异常时记录日志。