springboot使用logback-spring配置日志格式,并分环境配置

配置不生效的解决办法

注意: 如果配置不生效,则说明spring优先加载了其他配置:
解决办法:

  1. yml中添加指定文件 logging.config 属性 classpath:logback-spring.xml

  2. 修改名字为 logback.xml, SpringBoot首先去查找标准的日志配置文件,如果找不到在去找拼接Spring的配置的文件, 标准文件名: "logback-test.groovy", "logback-test.xml", "logback.groovy","logback.xml" 等

  3. 排除 第三方jar包中的日志配置

如果xml中使用 获取配置的内容,如果是默认的名字,logback.xml或者logback-spirng.xml,则因为会加载两次原因,会先生成一个空的IS_UNDEFINED文件和日志
最好的处理办法,是自定义日志xml.比如叫logbak-myself.xml ,然后yml指定文件名称 logging.config就可以了

springboot中使用这个LoggingApplicationListener类进行初始化,具体流程可查源码

logback以-spring结尾的可以使用springboot的分环境注入特性:
直接贴代码,放到resource下面就行了:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    
    <!-- logback-spring 的文件可以基于环境配置,相对路径会默认成项目根目录开始 -->
    <springProfile name="comp">
        <property name="LOG_HOME" value="/home/houzheng/logs"/>
    </springProfile>
    <!-- home环境,windows -->
    <springProfile name="home">
        <property name="LOG_HOME" value="D:/logs"/>
    </springProfile>

   <!--定义输出格式,可以带颜色-->
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
    <property name="PATTERN_COLOR"
              value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>

    <!--控制台输出appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--设置输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!--设置编码-->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--文件输出,时间窗口滚动-->
    <appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志名,指定最新的文件名,其他文件名使用FileNamePattern -->
        <File>${LOG_HOME}/timeFile/out.log</File>
        <!--文件滚动模式-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩-->
            <FileNamePattern>${LOG_HOME}/timeFile/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
            <!--按大小分割同一天的-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!--输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!--设置编码-->
            <charset>UTF-8</charset>
        </encoder>

    </appender>

    <!--指定基础的日志输出级别-->
    <root level="INFO">
        <!--appender将会添加到这个loger,console会输出一个默认的日志文件,导致日志重复输出,建议生产关掉,只会使用file输出保存-->
        <appender-ref ref="console"/>
        <appender-ref ref="timeFileOutput"/>
    </root>

    <!-- 单独指定某个包的日志打印,级别,appender等   -->
    <!-- addtivity: 可选。是否向上级 loger(也就是 root 节点)传递打印信息。默认为 true,
        设置addtivity是因为这里已经指定了appender,如果再向上传递就会被root下的appender再次打印 -->
<!--    <logger name="com.hou.postgresql.user.service.impl.TestUserServiceImpl" level="WARN" addtivity="false">-->
<!--        <appender-ref ref="console"/>-->
<!--    </logger>-->

     <!-- 单独指定某个包的日志打印,级别,appender等,也可以在代码中使用 name属性获取 LoggerFactory.getLogger("LogName");   -->
     <logger name="AudiLogNameFormat" level="info" additivity="false">
        <appender-ref ref="Log"/>
    </logger>
</configuration>
posted @ 2020-05-24 18:02  侯小厨  阅读(3106)  评论(0编辑  收藏  举报
Fork me on Gitee