目录
  • Springboot logback-spring.xml无法加载
    • 现象
    • 原因分析
    • 解决方案
  • springboot logback-spring.xml 配置, 使用不同配置文件中的配置
    • application.yml
    • application-dev.yml
    • application-prod.yml
    • logback-spring.xml
    • 从application-xxx.yml 中拿配置
  • 总结

    Springboot logback-spring.xml无法加载

    现象

    SpringBoot项目,启动后,日志文件没有出现在logback-spring.xml指定的目录下

    且启动日志开头如下:

    "C:\Program Files\Java\jdk1.8.0_144\bin\java"…
    Connected to the target VM, address: '127.0.0.1:52494', transport: 'socket'
    18:34:58,011 |-INFO in ch.qos.logback.classic.LoggerContext[default] – Could NOT find resource [logback-test.xml]
    18:34:58,011 |-INFO in ch.qos.logback.classic.LoggerContext[default] – Could NOT find resource [logback.groovy]
    18:34:58,011 |-INFO in ch.qos.logback.classic.LoggerContext[default] – Found resource [logback.xml] at [jar:file:/D:/mvn_repo/xxx-1.0.2.jar!/logback.xml]
    18:34:58,014 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@707194ba – URL [jar:file:/D:/mvn_repo/yyy-1.0.2.jar!/logback.xml] is not of type file
    18:34:58,112 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction – Will scan for changes in [jar:file:/D:/mvn_repo/zzz-1.0.2.jar!/logback.xml] 

    logback-spring.xml文件一直未改动过,如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="INFO">
    
        <springProperty scope="context" name="logPath" source="log.path"/>
        <springProperty scope="context" name="logLevel" source="log.level"/>
    
    
        <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} %line - %msg%n</pattern>
            </layout>
        </appender>
    
        <appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--滚动策略-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--输出路径-->
                <fileNamePattern>${logPath}/server.%d.log</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} %line - %msg%n</pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <!--滚动策略-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--输出路径-->
                <fileNamePattern>${logPath}/server.%d.error</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} %line - %msg%n</pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <root level="${logLevel}">
            <appender-ref ref="consoleLog"/>
            <appender-ref ref="fileLog"/>
            <appender-ref ref="fileErrorLog"/>
        </root>
    </Configuration>
    

    原因分析

    1.配置文件位置正确

    classes/
    ├── application.properties
    ├── com
    │   └── nero
    │       └── test
    │           ├── api
    │           │   ├── Api.class

    2.分析启动日志,分析可能是依赖的jar中有logback.xml配置,冲突导致的问题

    解决方案

    在application.properties中加入配置:

    logging.config=classpath:logback-spring.xml
    

    通过该配置,强制指定日志的配置文件,问题得以解决

    springboot logback-spring.xml 配置, 使用不同配置文件中的配置

    application.yml

    spring:
      profiles:
        active: prod  # active 哪一个配置文件

    application-dev.yml

    logging:
      file:
        path: d:/var/log

    application-prod.yml

    logging:
      file:
        path: /var/log/question

    logback-spring.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <contextName>wechat-service</contextName>
        <!-- !!!!!!!!!获取 application-{xxx}.yml 的配置 !!!!!-->
        <springProperty scope="context" name="log.path" source="logging.file.path"/>
        <!--<property name="log.path" value="log" />-->
        <property name="log.maxHistory" value="15" />
        <property name="log.colorPattern" value="%d{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n"/>
        <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n" />
        <!--输出到控制台-->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${log.colorPattern}</pattern>
            </encoder>
        </appender>
        <!--输出到文件 info 级别的 log-->
        <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
                <MaxHistory>${log.maxHistory}</MaxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <!--输出到文件 error 级别的 log-->
        <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <root level="debug">
            <appender-ref ref="console" />
        </root>
        <root level="info">
            <appender-ref ref="file_info" />
            <appender-ref ref="file_error" />
        </root>
    
    </configuration>

    从application-xxx.yml 中拿配置

    <springProperty scope="context" name="log.path" source="logging.file.path"/>

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。