SpringMVC下logback配置环境分离

摘要

最近开发过程中,使用Spring Profiles进行了开发环境与测试环境的分离,由于开发环境和测试环境之间需要使用不同的配置,例如开发环境和测试环境的日志级别,日志文件存储的路径极有可能是不同的,所以需要将开发环境和测试环境分离开来,我们首先想到的可能是把logback.xml文件拷贝成两份,不同环境使用不同的logback.xml文件不就可以了吗?其实这样是有问题的,一个是两个logback.xml文件进行管理是很头疼的,另一个很重要的问题是logback.xml文件会在web.xml文件里面配置,而web.xml文件很难去判断读取哪一个logback.xml文件。

解决方案

我们使用logback的一个特性,它提供来读取我们的配置文件,我们只需要在resource里面配置好我们对应logback.properties的文件路径就可以了,例如这些:

"properties/${spring.profiles.active}/logback.properties"/>

这样我们直接使用${spring.profiles.active}来获取对应环境的目录就可以了,非常方便。

实现代码

具体的实现代码如下:

  • logback.xml基础配置:
    下面这段配置中主要配置的含义可以通过查看logback文档去了解,不做过多的阐述,有两个地方可以相应了解下,一个是日志写入文件时,会同时按照日期和最大文件大小生存新文件,另一个是statusListener和debug=’false’可以不打印logback自身的日志信息。除了${spring.profiles.active},其他的${}包裹的变量都是从logback.properties文件中进行读取的,所以我们需要在开发环境和生产环境分别定义一套logback.properties文件:


<configuration scan="true" debug="false">
    <property resource="properties/${spring.profiles.active}/logback.properties"/>
    
    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
    <appender name="FILE-ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${_log.path}/${_file_name}.logfile>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">   
            <level>${_file_level}level>   
        filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${_log.path}/${_file_name}.%d{yyyy-MM-dd}.%i.log
            fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                
                <maxFileSize>${_max_file_size}maxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            
            <maxHistory>${_max_history}maxHistory>
        rollingPolicy>
        
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <charset>UTF-8charset>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>${_file_pattern}pattern>
            layout>
        encoder>
    appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">   
            <level>${_stdout_level}level>   
        filter>
        <encoder>
            <pattern>${_stdout_pattern}pattern>
        encoder>
    appender>

    <root level="${_root_level}">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE-ALL"/>
    root>

    <logger name="org.apache" level="WARN">logger>

    <logger name="org.apache.ibatis" level="DEBUG">logger>

    <logger name="org.springframework" level="WARN">logger>

    <logger name="org.quartz" level="WARN">logger>

    <logger name="com.alibaba.druid" level="ERROR">logger>

configuration>
  • logback.properties基础配置:
    普通的properties配置文件,没什么好说的,类似的配置如下:
#日志文件路径
_log.path=/Logs/backend
#输出到日志文件级别,
_file_level=INFO
#输出到日志文件名称,此时生成日志文件路径类似于/Logs/backend/backend.log
_file_name=backend
#输出到日志文件最大大小,超过20000KB时会产生新文件
_max_file_size=20000KB
#日志文件允许存在最大天数
_max_history=60
#日志文件输出格式
_file_pattern=%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method:%L - %msg%n


#控制台输出级别,例如本地测试如果想打印sql,只需要把INFO修改成DEBUG级别
_stdout_level=ERROR
#控制台输出格式
_stdout_pattern=%date{HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method:%L - %msg%n
#根级别
_root_level=DEBUG

总结

logback进行环境分离时可以使用上面的写法进行配置,当然如果我们自己开发的测试项目,不需要进行环境的分离,使用上面这种配置也是可以的,而且在修改上面也会更加方便和清晰一些,有问题的地方也欢迎一起进行讨论。

你可能感兴趣的:(java,spring)