// 男儿何不把吴钩,收取关山五十州
public static LoggingSystem get(ClassLoader classLoader) {
    // 获取系统属性
    String loggingSystem = System.getProperty(SYSTEM_PROPERTY);

if (StringUtils.hasLength(loggingSystem)) {
        // 是不是NONE
        if (NONE.equals(loggingSystem)) {
            // 空的日志系统
            return new NoOpLoggingSystem();
        }
        return get(classLoader, loggingSystem);
    }
    // 循环所有日志,
    return SYSTEMS.entrySet().stream().filter((entry) -> ClassUtils.isPresent(entry.getKey(), classLoader))
            .map((entry) ->
            // 实例化具体日志
                get(classLoader, entry.getValue())).findFirst()
            .orElseThrow(() -> new IllegalStateException("No suitable logging system located"));
}
//实例化日志系统
private static LoggingSystem get(ClassLoader classLoader, String loggingSystemClass) {
    try {
        Class<?> systemClass = ClassUtils.forName(loggingSystemClass, classLoader);
        Constructor<?> constructor = systemClass.getDeclaredConstructor(ClassLoader.class);
        constructor.setAccessible(true);
        return (LoggingSystem) constructor.newInstance(classLoader);
    }
    catch (Exception ex) {
        throw new IllegalStateException(ex);
    }
}

@Override
public void beforeInitialize() {
    // 日志上下文
    LoggerContext loggerContext = getLoggerContext();
    // 是否初始化
    if (isAlreadyInitialized(loggerContext)) {
        return;
    }
    // 父类方法
    super.beforeInitialize();
    // 添加过滤器
    loggerContext.getTurboFilterList().add(FILTER);
}

private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {
    if (this.loggingSystem == null) {
        this.loggingSystem = LoggingSystem.get(event.getSpringApplication().getClassLoader());
    }
    initialize(event.getEnvironment(), event.getSpringApplication().getClassLoader());
}

protected void initialize(ConfigurableEnvironment environment, ClassLoader classLoader) {
    new LoggingSystemProperties(environment).apply();
    this.logFile = LogFile.get(environment);
    if (this.logFile != null) {
        this.logFile.applyToSystemProperties();
    }
    this.loggerGroups = new LoggerGroups(DEFAULT_GROUP_LOGGERS);
    // 早期 的日志级别
    initializeEarlyLoggingLevel(environment);
    // 初始化日志系统
    initializeSystem(environment, this.loggingSystem, this.logFile);
    // 初始化日志级别
    initializeFinalLoggingLevels(environment, this.loggingSystem);
    registerShutdownHookIfNecessary(environment, this.loggingSystem);
}

private void initializeSystem(ConfigurableEnvironment environment, LoggingSystem system, LogFile logFile) {
    LoggingInitializationContext initializationContext = new LoggingInitializationContext(environment);
    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);
        }
    }
}

@Override
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.");
    }
}

private void initializeWithConventions(LoggingInitializationContext initializationContext, LogFile logFile) {
    String config = getSelfInitializationConfig();
    if (config != null && logFile == null) {
        // self initialization has occurred, reinitialize in case of property changes
        reinitialize(initializationContext);
        return;
    }
    if (config == null) {
        config = getSpringInitializationConfig();
    }
    if (config != null) {
        loadConfiguration(initializationContext, config, logFile);
        return;
    }
    // 加载默认配置
    loadDefaults(initializationContext, logFile);
}

@Override
protected void loadDefaults(LoggingInitializationContext initializationContext, LogFile logFile) {
    LoggerContext context = getLoggerContext();
    stopAndReset(context);
    boolean debug = Boolean.getBoolean("logback.debug");
    if (debug) {
        StatusListenerConfigHelper.addOnConsoleListenerInstance(context, new OnConsoleStatusListener());
    }
    LogbackConfigurator configurator = debug ? new DebugLogbackConfigurator(context)
            : new LogbackConfigurator(context);
    Environment environment = initializationContext.getEnvironment();
    context.putProperty(LoggingSystemProperties.LOG_LEVEL_PATTERN,
            environment.resolvePlaceholders("${logging.pattern.level:${LOG_LEVEL_PATTERN:%5p}}"));
    context.putProperty(LoggingSystemProperties.LOG_DATEFORMAT_PATTERN, environment.resolvePlaceholders(
            "${logging.pattern.dateformat:${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}"));
    context.putProperty(LoggingSystemProperties.ROLLING_FILE_NAME_PATTERN, environment
            .resolvePlaceholders("${logging.pattern.rolling-file-name:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}"));
    new DefaultLogbackConfiguration(initializationContext, logFile).apply(configurator);
    context.setPackagingDataEnabled(true);
}

@Override
public void initialize(LoggingInitializationContext initializationContext, String configLocation, LogFile logFile) {
    LoggerContext loggerContext = getLoggerContext();
    // 是否加载过
    if (isAlreadyInitialized(loggerContext)) {
        return;
    }
    // 日志初始化
    super.initialize(initializationContext, configLocation, logFile);
    // 删除 FILTER
    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.");
    }
}

Spring Boot 系统日志代码解析-立哥技术相关推荐

  1. 优酷视频云技术解析-立哥技术

    前言:从15年开始,云计算就开始从领先概念慢慢落成实地, 视频云技术作为其中重要分支,得到了长足发展.今天是笔者的生日,也从技术发展角度解析下视频云的要点技术. 1.优酷视频云技术核心:Cache C ...

  2. Spring 全家桶BeanDefinition资源定位解析-立哥技术

    /**  * 重点在于构造方法理解  * @param configLocation  * @throws BeansException  */ // configLocation 包含了 BeanD ...

  3. 智能汽车雷达解析-立哥技术

    前言:汽车行业是我国的支柱产业之一,也是上海的支柱产业.上海的辉煌,既是欧风美雨的产物,也是一代代中国人奋斗的结晶.除了特斯拉在临港设立的"亚洲第一超级工厂",上汽也和美国.德国等 ...

  4. Spring MVC 跨域处理-立哥技术

    // 剑气纵横九万里,一剑光寒九百州! // CrossOrigin 注解 package com.huifer.source.controller; import org.springframewo ...

  5. spring boot 源码解析23-actuate使用及EndPoint解析

    前言 spring boot 中有个很诱人的组件–actuator,可以对spring boot应用做监控,只需在pom文件中加入如下配置即可: <dependency><group ...

  6. springboot 获取application参数_(最新 9000 字 )Spring Boot 配置特性解析

    一.概述 目前Spring Boot版本: 2.3.4.RELEASE,这更新的速度也是嗖嗖的了,随着新版本的发布,也一步步针对公司基础组件进行了升级改造,其中很重要的一块就是配置文件的更新(虽然目前 ...

  7. spring boot 源码解析52-actuate中MVCEndPoint解析

    前言 之前的几篇文章分析了spring boot 中有关endpoint的实现,细心的朋友可以发现,在org.springframework.boot.actuate.endpoint.mvc 包下也 ...

  8. spring boot 源码解析15-spring mvc零配置

    前言 spring boot 是基于spring 4 的基础上的一个框架,spring 4 有一个新特效–>基于java config 实现零配置.而在企业的实际工作中,spring 都是和sp ...

  9. spring boot 源码解析29-LogbackLoggingSystem

    前言 现在我们来分析一下LogbackLoggingSystem,spring boot 中默认生效的,该类也是继承自Slf4JLoggingSystem. 解析 LogbackLoggingSyst ...

最新文章

  1. win7网络适配器_Win7系统笔记本电脑连接蓝牙音箱的操作方法
  2. 最近遇到的jsfl开发问题总结
  3. 二十四、深入Java抽象类,抽象方法和接口
  4. pcb二次钻孔_线路板中的二次孔是什么?线路板钻孔有哪些常见问题?
  5. address标签,为网页加入地址信息
  6. Jzoj4840 小W砍大树
  7. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏
  8. 解析xml的4种方法详解
  9. 0x800f0845 更新1803报错
  10. superoneclick 2.2_一季度食品监督抽检2.2%不合格:农兽药残留超标等系主因
  11. StringUtils一些常用方法
  12. 图像分割(三)--Grab Cut
  13. 设计一个求立方体体积的父类,包含一个显示底面各个形状信息的统一方法,信息显示方式 “类别+周长+面积”;一个计算和显示立方体体积的统一方法 设计三个子类(利用继承关系):圆柱、长方体、三棱柱
  14. qt opengl 天空盒
  15. Java的运行机制(一)
  16. java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled.
  17. 电容ESR表(一) 电容ESR表的特点、测量原理、电路分析
  18. 编译安装nginx实现反向代理、负载均衡、缓存功能
  19. alertdialog旋转屏幕消失造成leak window
  20. c语言16进制怎么计算器,问各位大侠一个16进制计算器的问题(Charles Petzold著《windows程序设计》第11章)...

热门文章

  1. CSS——background系列属性
  2. 常用电子元器件电路符号及实物外形图,你值得拥有!
  3. 多模态预训练模型简述
  4. Java生成MD5的坑
  5. arm 使用bluetoothctl连接蓝牙耳机
  6. 根据经纬度查附近的点
  7. #1518空瓶换酒问题
  8. 快速搭建springcloud项目
  9. 【武sir】django rest framework源码和实战_day01(上)
  10. cloudstack部署记录(不成功)