Springboot Logger日志适配

专栏文章:
Java Util Logger源码分析
Log4j源码分析
Slf4j源码分析
Logback源码分析

spring不是框架的生产商,但spring是框架的搬运工,对于应用的日志系统,spring采用自适应方式自动适配classpath下添加的日志框架jar包。
springboot在启动中通过SPI的方式加载日志框架,在启动的各个事件环节中初始化日志框架相关配置属性。
image.png
LoggingApplicationListener监听器中根据spring上下文启动事件,实现日志系统加载及初始化。

LoggingApplicationListener

public class LoggingApplicationListener implements GenericApplicationListener {

    private static final ConfigurationPropertyName LOGGING_LEVEL = ConfigurationPropertyName.of("logging.level");
    private static final ConfigurationPropertyName LOGGING_GROUP = ConfigurationPropertyName.of("logging.group");
    private static final Bindable<Map<String, LogLevel>> STRING_LOGLEVEL_MAP = Bindable.mapOf(String.class, LogLevel.class);
    private static final Bindable<Map<String, List<String>>> STRING_STRINGS_MAP = Bindable
        .of(ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, String.class).asMap());
    public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 20;
    public static final String CONFIG_PROPERTY = "logging.config";
    public static final String REGISTER_SHUTDOWN_HOOK_PROPERTY = "logging.register-shutdown-hook";
    public static final String LOGGING_SYSTEM_BEAN_NAME = "springBootLoggingSystem";
    public static final String LOG_FILE_BEAN_NAME = "springBootLogFile";
    public static final String LOGGER_GROUPS_BEAN_NAME = "springBootLoggerGroups";

    private static final Map<String, List<String>> DEFAULT_GROUP_LOGGERS;
    private static final Map<LogLevel, List<String>> SPRING_BOOT_LOGGING_LOGGERS;
    private static final AtomicBoolean shutdownHookRegistered = new AtomicBoolean();
    private final Log logger = LogFactory.getLog(getClass());
    // 日志系统适配器
    private LoggingSystem loggingSystem;
    // 封装日志文件输出地
    private LogFile logFile;
    // 日志分组
    private LoggerGroups loggerGroups;
    // order
    private int order = DEFAULT_ORDER;
    // 解析参数
    private boolean parseArgs = true;
    // 日志级别
    private LogLevel springBootLogging = null;
}

主要定义了几个重要的对象引用:

  1. LoggingSystem具体日志适配层对象
  2. LogFile日志输出位置,通过解析logging.file.path/logging.file.name得到
  3. LoggerGroups日志分组
  4. LogLevel日志级别
事件回调
// 监听的上下文事件
@Override
public void onApplicationEvent(ApplicationEvent event) {
    // 应用启动中
    if (event instanceof ApplicationStartingEvent) {
        onApplicationStartingEvent((ApplicationStartingEvent) event);
    }
    // 环境准备完成事件
    else if (event instanceof ApplicationEnvironmentPreparedEvent) {
        onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);
    }
    // 应用启动成功
    else if (event instanceof ApplicationPreparedEvent) {
        onApplicationPreparedEvent((ApplicationPreparedEvent) event);
    }
    else if (event instanceof ContextClosedEvent
             && ((ContextClosedEvent) event).getApplicationContext().getParent() == null) {
        onContextClosedEvent();
    }
    else if (event instanceof ApplicationFailedEvent) {
        onApplicationFailedEvent();
    }
}
ApplicationStartingEvent
private void onApplicationStartingEvent(ApplicationStartingEvent event) {
    // 加载类路径下的LoggingSystem实现类,根据一定的顺序取第一个
    this.loggingSystem = LoggingSystem.get(event.getSpringApplication().getClassLoader());
this.loggingSystem.beforeInitialize();
}

LoggingSystem.get()会通过SPI的方式加载spring.factoriers文件中配置的可用实现
image.png
通过工厂类适配加载classpath中合适的LoggerSystem实现。
image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 应用程序的日志记录可以使用 Log4j、Logback、java.util.logging 或者 Commons Logging 等日志框架来完成。Spring Boot 默认使用 Logback 作为日志框架,同时也提供了一些默认的日志配置。 在 Spring Boot 应用程序中,可以通过配置文件来设置日志记录级别、输出位置、输出格式等,常见的配置文件包括 application.properties 和 application.yml。例如,下面是一个使用 application.properties 配置日志记录的例子: ``` # 设置日志级别为 INFO logging.level.root=INFO # 输出日志到控制台和文件 logging.file=myapp.log logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n ``` 在上面的例子中,我们设置了日志记录级别为 INFO,表示记录 INFO 级别及以上的日志信息。同时,我们也指定了日志的输出位置,将日志同时输出到控制台和文件 myapp.log 中。最后,我们还指定了输出日志的格式,控制台和文件的输出格式分别为 logging.pattern.console 和 logging.pattern.file。 除了使用配置文件外,也可以通过编程方式来设置日志记录器。例如,下面是一个使用 Log4j2 编程方式设置日志记录器的例子: ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class MyService { private static final Logger logger = LogManager.getLogger(MyService.class); public void doSomething() { logger.info("Doing something..."); } } ``` 在上面的例子中,我们使用 LogManager 创建了一个名为 MyService 的日志记录器,然后在 doSomething 方法中记录了一条 INFO 级别的日志信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值