您的位置:

logback使用教程

一、logback简介

logback是一个轻量级、高效的Java日志框架,是Log4j框架的改进版本。它可以与多种Java应用和框架集成使用,如Spring、Hibernate等。logback由三个不同的组件构成,分别是logback-core、logback-classic和logback-access。

二、logback配置

1. logback.xml文件配置

logback的主要配置是通过logback.xml文件来完成,文件名称必须为logback.xml,并且位于classpath根目录下。下面是一个简单的logback.xml文件配置示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>
 
  <logger name="com.example" level="debug" additivity="false">
    <appender-ref ref="STDOUT" />
  </logger>
 
  <root level="info">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

上面的配置示例定义了一个ConsoleAppender,它将日志输出到控制台上,并设置了一个Logger,它将仅拦截com.example包下的日志,并将它们输出到STDOUT Appender。另外,Root Logger是一个必须存在的Logger,定义了所有未定义Logger的默认行为。

2. 配置文件中的元素和属性

logback.xml中有多种元素和属性,下面是一些常见的元素和属性及其说明:

1) <configuration>:根元素,它包含所有其他元素。

2) <appender>:定义了一个Appender。

3) <encoder>:用于定义Appender的输出格式。

4) <logger>:定义一个Logger,会有一个级别和一个或多个Appender。

5) <root>:定义了所有Logger的默认级别和Appender。

6) name属性:元素或属性的名称。

7) class属性:Appender或其他组件的Java类。

8) level属性:Logger、Root Logger或Appender的级别。

9) additivity属性:当为false时,当前Logger不会将日志传递给父Logger。

三、logback使用

1. 创建Logger实例

在使用logback前,需要创建Logger实例。Logger是logback最重要的组件,用于记录应用程序的事件。

下面是一个创建Logger实例的示例代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClass {
  private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);
  ...
}

2. 日志级别

logback提供了多种日志级别,包括:TRACE、DEBUG、INFO、WARN、ERROR和OFF。

在Logger中设置级别时,所有级别大于或等于指定级别的日志都会被记录。

下面是一个示例代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClass {
  private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);
  ...
  LOGGER.debug("This is a debug message");
  LOGGER.info("This is an info message");
  LOGGER.warn("This is a warn message");
  LOGGER.error("This is an error message");
  ...
}

3. 使用MDC和NDC

MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)是logback提供的两种上下文内容。它们通常用于传递一些应用程序的上下文信息,如当前用户ID、当前请求的URL等。

在logback.xml文件中,可以使用“%X”和“%X{key}”来引用MDC中的上下文信息,使用“%X{key:-default}”对于key不存在时提供一个默认值。

下面是一个示例代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MyClass {
  private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);
  ...
  MDC.put("userId", "1234");
  LOGGER.info("This is a message for user {}", MDC.get("userId"));
  ...
}

4. 对日志进行切面增强

logback可以很方便地与Spring AOP集成,以对日志进行切面增强。

下面是一个示例代码,它将日志输出到文件中:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import java.util.Arrays;

@Aspect
@Component
public class LoggingAspect {
  private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAspect.class);
 
  @AfterReturning(pointcut = "execution(* com.example.service..*.*(..))", returning = "result")
  public void logAfterReturning(JoinPoint joinPoint, Object result) {
      LOGGER.info("Return value of {}: {}", joinPoint.getSignature().getName(), result);
  }
}

四、logback性能优化

logback可以通过以下方式进行性能优化:

1) 异步输出:设置AsyncAppender,以异步方式输出日志,提高效率。

2) 使用rolling policy:使用RollingFileAppender和TimeBasedRollingPolicy,在滚动文件时避免打开和关闭文件。

五、logback与Spring Boot集成

Spring Boot默认使用logback作为日志框架,可以轻松进行集成。

在Spring Boot应用程序的classpath下,创建一个名为“logback-spring.xml”的文件,以用于自定义logback配置。

下面是一个示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>/var/log/myapplication.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="info">
    <appender-ref ref="FILE" />
  </root>

</configuration>

六、logback常见问题

1. 日志文件大小超过限制的五倍但不滚动

这可能是由于Linux节流机制造成的。要禁用Linux的节流机制,请在logback.xml文件中的<policies>元素中添加<SizeBasedTriggeringPolicy>元素,如下所示:

<policies>
  <SizeBasedTriggeringPolicy maxFileSize="10MB" />
</policies>

2. 日志记录不到错误信息

请确认日志级别设置正确,对于Logger.error()方法,只有Throwable参数才能正确地记录错误信息。

3. 日志输出格式不正确

请检查logback.xml文件中的<encoder>元素,确保它的内容正确。

七、结论

logback是一个轻量级、高效的Java日志框架,你可以将它与多种Java应用和框架集成使用。logback通过logback.xml文件配置,可以对日志进行不同的输出格式和级别划分。通过MDC和NDC,你可以记录应用程序的上下文信息,并且还可以使用Spring AOP对日志进行切面增强。最后,通过性能优化和Spring Boot集成,你可以在logback中获得更好的性能和更简单的应用程序配置。