美文网首页
spring boot log system 自定义配置文件地址

spring boot log system 自定义配置文件地址

作者: Hunter哈哈哈哈 | 来源:发表于2020-01-29 22:53 被阅读0次

自定义log配置文件

实际是使用过程中,很有可能日志文件在一个自定义的位置,需要自定义一下,可以用以下的方式实现
  • 在spring 启动前设置properties指定对应配置文件的名字和地址
  • 修改启动脚本或者直接加入如下代码
System.setProperty(LoggingApplicationListener.CONFIG_PROPERTY,对应日志配置文件);

spring boot logging system 基本启动流程

  • 启动入口

org.springframework.boot.context.logging.LoggingApplicationListener

    @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) {
                // 将对应的loggingSystem(比如LogbackLoggingSystem)暴露到spring上下文中,供业务引用
            onApplicationPreparedEvent((ApplicationPreparedEvent) event);
        }
        else if (event instanceof ContextClosedEvent && ((ContextClosedEvent) event)
                .getApplicationContext().getParent() == null) {
            onContextClosedEvent();
        }
        else if (event instanceof ApplicationFailedEvent) {
            onApplicationFailedEvent();
        }
    }
  • beforeInitialize 启动准备

org.springframework.boot.logging.logback.LogbackLoggingSystem#beforeInitialize

    @Override
    public void beforeInitialize() {
        LoggerContext loggerContext = getLoggerContext();
               // 防止重复启动, 启动标志完毕的写入逻辑在Initilize那一节会提到
        if (isAlreadyInitialized(loggerContext)) {
            return;
        }
                // 删除可能预先加载的jul 业务代码
        super.beforeInitialize();
                // 禁止所有日志数据打印
        loggerContext.getTurboFilterList().add(FILTER);
    }
  • 启动
    org.springframework.boot.context.logging.LoggingApplicationListener
        if (this.loggingSystem == null) {
            this.loggingSystem = LoggingSystem
                    .get(event.getSpringApplication().getClassLoader());
        }
// 正式启动
        initialize(event.getEnvironment(), event.getSpringApplication().getClassLoader());
    private void initializeSystem(ConfigurableEnvironment environment,
            LoggingSystem system, LogFile logFile) {
        LoggingInitializationContext initializationContext = new LoggingInitializationContext(
                environment);
// 寻找自定义配置文件 配置key 
        String logConfig = environment.getProperty(CONFIG_PROPERTY);
        if (ignoreLogConfig(logConfig)) {
            system.initialize(initializationContext, null, logFile);
        }
        else {
            try {
                ResourceUtils.getURL(logConfig).openStream().close();
                system.initialize(initializationContext, logConfig, logFile);
            }
            catch (Exception ex) {
                // NOTE: We can't use the logger here to report the problem
                System.err.println("Logging system failed to initialize "
                        + "using configuration from '" + logConfig + "'");
                ex.printStackTrace(System.err);
                throw new IllegalStateException(ex);
            }
        }
    }

org.springframework.boot.logging.logback.LogbackLoggingSystem#initialize

    public void initialize(LoggingInitializationContext initializationContext,
            String configLocation, LogFile logFile) {
        LoggerContext loggerContext = getLoggerContext();
        if (isAlreadyInitialized(loggerContext)) {
            return;
        }
// 初始化核心逻辑
        super.initialize(initializationContext, configLocation, logFile);
   // 打开日志开关,让日志可以正常打印
        loggerContext.getTurboFilterList().remove(FILTER);
// 写入初始化完毕标志,防止重复初始化
        markAsInitialized(loggerContext);
        if (StringUtils.hasText(System.getProperty(CONFIGURATION_FILE_PROPERTY))) {
            getLogger(LogbackLoggingSystem.class.getName()).warn(
                    "Ignoring '" + CONFIGURATION_FILE_PROPERTY + "' system property. "
                            + "Please use 'logging.config' instead.");
        }
    }

org.springframework.boot.logging.AbstractLoggingSystem#initialize

        if (StringUtils.hasLength(configLocation)) {
// 使用自定义的配置文件 最终使用loadConfiguration让配置生效
            initializeWithSpecificConfig(initializationContext, configLocation, logFile);
            return;
        }
// 使用默认的配置文件 最终使用loadConfiguration让配置生效 如果没有任何配置,则使用默认配置项
// 配置文件的优先级是  logback-*.xml->logback-spring-*.xml
        initializeWithConventions(initializationContext, logFile);

org.springframework.boot.logging.logback.LogbackLoggingSystem#loadConfiguration

// 导入默认配置项,如最大文件大小等等
        super.loadConfiguration(initializationContext, location, logFile);
// 清理已有的配置
        LoggerContext loggerContext = getLoggerContext();
        stopAndReset(loggerContext);
// 检测配置文件地址是否正确
        try {
// 使配置生效
            configureByResourceUrl(initializationContext, loggerContext,
                    ResourceUtils.getURL(location));
        }
        catch (Exception ex) {
            throw new IllegalStateException(
                    "Could not initialize Logback logging from " + location, ex);
        }
        List<Status> statuses = loggerContext.getStatusManager().getCopyOfStatusList();
        StringBuilder errors = new StringBuilder();
        for (Status status : statuses) {
            if (status.getLevel() == Status.ERROR) {
                errors.append((errors.length() > 0) ? String.format("%n") : "");
                errors.append(status.toString());
            }
        }
        if (errors.length() > 0) {
            throw new IllegalStateException(
                    String.format("Logback configuration error detected: %n%s", errors));
        }

相关文章

网友评论

      本文标题:spring boot log system 自定义配置文件地址

      本文链接:https://www.haomeiwen.com/subject/dusbthtx.html