SpringMVC下logback配置环境分离

来源:互联网 发布:华腾软件 编辑:程序博客网 时间:2024/06/05 19:24

摘要

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

解决方案

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

<property resource="properties/${spring.profiles.active}/logback.properties"/>

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

实现代码

具体的实现代码如下:

  • logback.xml基础配置:
    下面这段配置中主要配置的含义可以通过查看logback文档去了解,不做过多的阐述,有两个地方可以相应了解下,一个是日志写入文件时,会同时按照日期和最大文件大小生存新文件,另一个是statusListener和debug=’false’可以不打印logback自身的日志信息。除了${spring.profiles.active},其他的${}包裹的变量都是从logback.properties文件中进行读取的,所以我们需要在开发环境和生产环境分别定义一套logback.properties文件:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE xml><configuration scan="true" debug="false">    <property resource="properties/${spring.profiles.active}/logback.properties"/>    <!-- 清除logback状态日志  -->    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />    <appender name="FILE-ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>${_log.path}/${_file_name}.log</file>        <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">                <!-- 文件超过20M时产生新文件,这里设置小于20M是因为logback存在缓冲区-->                <maxFileSize>${_max_file_size}</maxFileSize>            </timeBasedFileNamingAndTriggeringPolicy>            <!-- 每30天清除一次历史 -->            <maxHistory>${_max_history}</maxHistory>        </rollingPolicy>        <!-- <layout class="ch.qos.logback.classic.html.HTMLLayout"> 可以按HTML格式输出 -->        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">            <charset>UTF-8</charset>            <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进行环境分离时可以使用上面的写法进行配置,当然如果我们自己开发的测试项目,不需要进行环境的分离,使用上面这种配置也是可以的,而且在修改上面也会更加方便和清晰一些,有问题的地方也欢迎一起进行讨论。