你的应用是不是只有service_stdout.log?

简介: 本文记录了logback-spring.xml文件不生效问题的整体排查思路。

一、背景

近期遇到同组同反馈logback-spring.xml文件不生效的问题,由于本人很久没申请过新应用,所以对于配置类的事宜有点陌生(大部分是应用交接维护,直接使用log也没过多关注配置,知道大概但细节有点脱节,虚了),导致自己在排查阶段花了很长时间,本文记录了整个排查思路,包括logback配置、不生效的原因分析等,希望给大家提供一些经验参考。


1.1 Logback简介

SLF4J(Simple Logging Facade for Java)是一个Java的日志API的简单门面,它提供了一个简单统一的记录日志的接口,而具体的日志实现则可以通过不同的日志库来完成。

Logback是一个日志库,Logback被设计为能够与SLF4J无缝集成,也可替代SLF4J,因为Logback的开发者之一是SLF4J的创始人。


二、logback配置

因为pandora-boot默认集成logback,不需要额外logback依赖。


2.1 配置姿势

官方推荐使用logback,排查思路均以logback不生效为主线。

1)指定配置文件路径 image.png

application.properties添加配置项logging.config=classpath:logback-spring.xml

2)自定义配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <!-- https://github.com/spring-projects/spring-boot/blob/v1.5.13.RELEASE/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="APP_NAME" value="xxxx" />
    <property name="LOG_PATH" value="${user.home}/logs/eleme/${APP_NAME}/" />
    <property name="LOG_FILE" value="${LOG_PATH}/application.log" />
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/common-error.log"/>
    <property name="TRACE_FILE_LOG_PATTERN" value="[%X{requestId}][%X{rpcId}] -%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) ${LOG_LEVEL_PATTERN:-%5p} %magenta(${PID:- }) --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <property name="ERROR_FILE_LOG_PATTERN_D"
              value="${ERROR_FILE_LOG_PATTERN_D:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} [%X{requestId}] [%X{rpcId}][traceId:%X{EAGLEEYE_TRACE_ID}][%c{2}#%M] %logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}</file>
        <encoder>
            <pattern>${TRACE_FILE_LOG_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>50MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <appender name="ERROR_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <pattern>${ERROR_FILE_LOG_PATTERN_D}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${ERROR_LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>50MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${TRACE_CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <root level="INFO">
<!--        <appender-ref ref="CONSOLE" />-->
        <appender-ref ref="APPLICATION" />
        <appender-ref ref="ERROR_APPENDER" />
    </root>
</configuration>


2.2 配置可能遇到的一些问题

1)自定义变量不生效?

如果引用外部的变量,只有几个变量适用,比如${PID}、${LOG_FILE}、${LOG_PATH}、${LOG_EXCEPTION_CONVERSION_WORD},其它变量建议定义成property才能正常使用。如上文中的APP_NAME


2)如何看更多报错信息?


可以在启动时加上`-Dlog4j.defaultInitOverride=true`


2.3 完成配置后未生效表象

按照如上配置后,可能出现自定义的Appender不生效,即指定目录下只有service_stdout.log,无自定义的file配置。

image.png

所有的文件都会输出到service_stdout.log,因为在appctl.sh中,默认start_pandora_boot方法中已指定输出到"$SERVICE_OUT" 2>&1 "&" ,这里是无问题,核心在于自定义的logback-spring.xml如何分发。


三、不生效原因分析


3.1、远程debug

  • 首先要开启远程debug,
    JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
  • idea启动Remote JVM Debug


3.2、查看logback appender

执行命令LoggerFactory.getLogger("ROOT"),查看ROOT下的aai(AppenderAttachableImpl作用是管理和处理与日志记录器相关联的多个Appender对象),发现并不是logback-spring.xml自己定义的Appender对象,意味着被覆盖或优先级有所不同。

image.png


这里也走了弯路,不断debug源码找问题,包括org.springframework.boot.context.logging.LoggingApplicationListener#initialize其中logback-spring.xml已被加载。

image.png

回头看了下官方文档,提示可能包冲突导致的问题。


3.3 排查日志冲突问题

image.png

牢记官方这个图的顺序:

  • 理论上使用logback,就要排除SLF4J-Log4j12
  • 因为jcl-over-slf4j commons-logging冲突, 需要排除commons-logging

如果跟pom无冲突, 子pom.xml也要排除,使用Dependency Analyzer事半功倍。

image.png

排除过程中采用最小原则,避免影响其它业务代码。


3.4 double check

执行命令LoggerFactory.getLogger("ROOT"),再次查看ROOT实例下的aai

image.png

与`logback-spring.xml`定义的appender一样, 同时定义的file也被正常初始化了。

image.png

四、总结

1、仔细阅读spring-boot官方文档,自己踩过的坑绝不是独一无二的。

2、引入二方包时养成最小原则,善用exclusion(虽然这只是美好愿望,希望排查时不要泪两行)。

参考文章:

PandoraBoot文档: https://mw.alibaba-inc.com/products/pandoraboot/_book/log-config.html



来源  |  阿里云开发者公众号
作者  |  
率领






相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
6月前
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
1761 94
|
机器学习/深度学习 存储 监控
Elasticsearch 在日志分析中的应用
【9月更文第2天】随着数字化转型的推进,日志数据的重要性日益凸显。日志不仅记录了系统的运行状态,还提供了宝贵的洞察,帮助企业改进产品质量、优化用户体验以及加强安全防护。Elasticsearch 作为一个分布式搜索和分析引擎,因其出色的性能和灵活性,成为了日志分析领域的首选工具之一。本文将探讨如何使用 Elasticsearch 作为日志分析平台的核心组件,并详细介绍 ELK(Elasticsearch, Logstash, Kibana)栈的搭建和配置流程。
963 4
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
737 136
|
9月前
|
监控 安全 Linux
AWK在网络安全中的高效应用:从日志分析到威胁狩猎
本文深入探讨AWK在网络安全中的高效应用,涵盖日志分析、威胁狩猎及应急响应等场景。通过实战技巧,助力安全工程师将日志分析效率提升3倍以上,构建轻量级监控方案。文章详解AWK核心语法与网络安全专用技巧,如时间范围分析、多条件过滤和数据脱敏,并提供性能优化与工具集成方案。掌握AWK,让安全工作事半功倍!
334 0
|
12月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
315 3
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
2175 28
|
存储 人工智能 JSON
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
586 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
|
SQL 数据库
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
320 0
|
存储 弹性计算 运维
海量日志接入 Elasticsearch Serverless 应用降本70%以上
本文将探讨在日志场景下,使用阿里云Elasticsearch Serverless相较于基于ECS自建Elasticsearch集群的成本与性能优势,展示如何通过Serverless架构实现高达 70%以上的成本节约。
749 0