logback执行流程图

logback执行流程图

1. Get the filter chain decision.获得过滤链的策略。
   依据过滤器链返回的结果做出不同的响应。共有三个响应结果:
FilterReply.DENY, 直接退出,不执行后续流程
FilterReply.NEUTRA,继续向下执行
FilterReply.ACCEPT,不进行步骤二,即类型输出类型检查。


2. Apply the basic selection rule. 执行基本的选择规则。
    主要是比较下level,如果级别低直接退出后续执行。


3. Create a LoggingEvent object. 创建LoggingEvent对象。
这个对象包裹一些基本信息,包括日志界别,信息本身,可能的异常信息,执行时间,执行线程,其实一些随日志请求一起发出的数据和MDC。其中MDC是用来装一些额外的上下文信息的。


4.Invoking appenders.调用appenders。
此时logback会调用appender的doAppender,如果appender里有一些filer的话,此时也会调用。


5.Formatting the output.格式化输出结果。
通常情况下都是由layout层将event格式化成String型。当然也有意外比如说SocketAppender就是将event格式化成流。


6.Sending out the LoggingEvent.输出LoggingEvent
将格式化好的结果,输出到appender中记录的地址。


转载于:https://my.oschina.net/u/944165/blog/124818

<think>我们正在讨论的是SpringBoot项目中日志配置文件命名的问题:logback-spring.xml与logback.xml的区别,以及为何改名后可能解决特定日志无法输出的问题。根据引用[1]和[2]以及SpringBoot官方文档,两者的核心区别在于:1.**加载时机**:-`logback.xml`:在SpringBoot应用程序启动的早期阶段就被Logback框架直接加载(早于Spring上下文初始化)-`logback-spring.xml`:由SpringBoot在应用程序上下文初始化阶段加载(晚于Spring环境准备)2.**配置能力差异**:-`logback.xml`:无法使用Spring特有的配置(如SpringProfile、SpringEnvironment属性)-`logback-spring.xml`:可以通过`<springProperty>`标签访问SpringEnvironment属性,支持`<springProfile>`按环境加载配置3.**问题根源分析**:-在引用[2]中提到的动态配置(如`springProperty`)依赖于Spring环境-如果配置中使用了Spring特性(例如:`<springPropertyname="LOG_DIR"source="logging.file.path"/>`),那么当使用`logback.xml`时,这些表达式将无法解析,导致配置失效4.**为何改名能解决问题**:-案例中描述的“单条日志无法输出”,很可能是由于在`logback-spring.xml`中使用了Spring动态配置(如日志路径的`${LOG_DIR}`),但在打包运行后该配置未被解析(因为JAR运行时环境变量未正确传递)[^2]-当改为`logback.xml`后:-优点:配置提前加载且不依赖Spring环境,在无法解决Spring属性注入问题时可能让日志框架回退到默认行为-缺点:同时也会导致所有Spring相关特性(如Profile分离)失效5.**推荐解决方案**:```xml<!--在logback-spring.xml中避免绝对依赖Spring属性,设置合理的默认值--><springPropertyname="LOG_DIR"source="logging.file.path"defaultValue="./logs"/>```-配合JAR启动命令明确指定路径:`java-jarapp.jar--logging.file.path=/valid/path`6.**配置对比表**:|特性|logback.xml|logback-spring.xml||--------------------|-------------|--------------------||Spring属性支持|❌|✅||Profile条件配置|❌|✅[^1]||加载时机|过早|合适||与SpringBoot整合度|低|高|7.**最佳实践**:-始终使用`logback-spring.xml`保证与SpringBoot的整合能力-对日志路径等关键属性设置默认值:`defaultValue="./logs"`-通过启动参数覆盖默认值:`--logging.file.path=/prod/logs`8.**改名后的副作用**:-如果配置中使用了`<springProfile>`,改为`logback.xml`会导致所有环境配置失效-动态属性(如`${LOG_DIR}`)会因无法解析而变成字面字符串(例如:在配置中写`${LOG_DIR}`,运行时目录名会变成"${LOG_DIR}"字面文件夹)结论:将logback-spring.xml改名为logback.xml只是一种回避Spring环境初始化问题的临时手段,正确做法应是完善配置中的默认值和启动参数传递机制。相关问题:1.如何在SpringBoot不同环境(dev/test/prod)中使用不同日志级别?2.logback.xml和logback-spring.xml同时存在时的加载优先级?3.如何在logback配置中避免使用硬编码路径?</think> ### logback-spring.xml 与 logback.xml 的区别及改名影响分析 #### 1. 核心区别对比 | **特性** | **logback-spring.xml** | **logback.xml** | |---------|-----------------------|----------------| | **加载时机** | Spring Boot 启动后加载 | Spring Boot 启动前加载 | | **环境感知** | ✅ 支持 Spring Profile (如 `<springProfile>`) [^1] | ❌ 不支持 | | **配置注入** | ✅ 支持 `${}` 注入 Spring 配置(如 `<springProperty>`)[^2] | ❌ 不支持 | | **加载顺序** | 优先级低于 logback.xml | 最高优先级 | | **推荐场景** | Spring Boot 专属配置 | 通用日志配置 | #### 2. 改名解决特定日志无法输出的原因 当出现**单条日志无法输出**但其他日志正常的情况时,改名为 `logback.xml` 可能解决问题的根本原因: 1. **加载时机问题**: - `logback-spring.xml` 依赖 Spring 环境初始化 - 某些日志器(如脱敏组件)在 Spring 初始化前执行 - 此时日志配置尚未生效导致日志丢失 [^2] 2. **配置覆盖问题**: ```xml <!-- logback-spring.xml 中可能存在的冲突配置 --> <logger name="com.sensitive" level="OFF" additivity="false"/> ``` - `logback.xml` 优先加载会覆盖此类错误配置 - 独立于 Spring 环境确保配置完全生效 3. **Profile 干扰问题**: - 当使用 `<springProfile>` 但未激活对应环境时 - 相关日志器配置不会加载 - 改用 `logback.xml` 可避免此类环境依赖问题 [^1] #### 3. 实际影响评估 | **改动项** | **积极影响** | **风险点** | |-----------|-------------|-----------| | **配置加载时机提前** | 解决初始化时序问题 | 可能过早加载导致缺少 Spring 配置 | | **跳过 Profile 检测** | 确保配置完整加载 | 失去环境隔离能力 | | **失去 Spring 特性** | 配置确定性增强 | `<springProperty>` 动态配置失效 | | **优先级提升** | 避免其他配置覆盖 | 需要手动处理多配置文件冲突 | #### 4. 最佳实践建议 1. **保留 logback-spring.xml** 并修复配置: ```xml <!-- 明确指定敏感日志器的 additivity --> <logger name="com.yourpackage.sensitive" level="INFO" additivity="false"> <appender-ref ref="SPECIAL_APPENDER"/> </logger> ``` 2. **双文件共存方案**: ``` src/main/resources ├── logback.xml # 基础配置(无 Spring 依赖) └── logback-spring.xml # Spring 增强配置 ``` - 基础配置在 `logback.xml` 中确保早期日志输出 - 扩展功能(动态路径、Profile)放在 `logback-spring.xml` 3. **启动时加载诊断**: ```bash # 查看加载了哪个配置文件 java -jar app.jar -Dlogging.config=file:./logback-debug.xml ``` #### 5. 典型问题排查流程图 ```mermaid graph TD A[日志部分缺失] --> B{配置文件名是?} B -->|logback-spring.xml| C[检查Profile是否激活] B -->|logback.xml| D[检查初始化时序] C --> E[查看环境变量 spring.profiles.active] D --> F[添加JVM参数 -Dlogback.debug=true] E --> G[显式指定--spring.profiles.active] F --> H[分析控制台输出的加载过程] ``` > **关键结论**:改名可解决因配置加载时序/环境依赖导致的特殊日志丢失问题,但会牺牲 Spring 整合特性。建议优先通过显式配置 `additivity="false"` 和精确的 logger 名称来解决问题 [^1][^2]。 --- ### 相关问题 1. 如何在多环境部署中保持 logback.xml 的灵活性? 2. 不修改配置文件名称的前提下如何解决日志初始化时序问题? 3. logback.xml 和 logback-spring.xml 同时存在时的加载优先级规则是什么? 4. 如何验证 logback 配置文件的加载顺序和最终生效配置?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值