1. 程式人生 > >SpringBoot日誌logback-spring.xml分環境(轉)

SpringBoot日誌logback-spring.xml分環境(轉)

框架 filesize hal enc pos charset mod 一個 步驟

springboot按照profile進行打印日誌

  • log4j logback slf4j區別?

    首先談到日誌,我們可能聽過log4j logback slf4j這三個名詞,那麽它們之間的關系是怎麽樣的呢?SLF4J,即簡單日誌門面(Simple Logging Facade for JAVA),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。一般來說,slf4j配合log4j、logback進行使用,可以理解為slf4j是標準,log4j和logback是實現,我們可以根據自己的需求進行選擇具體的日誌系統。
    這裏推薦使用logback,因為logback更快的執行速度,logback-classic 非常自然的實現了SLF4J,官方也推薦使用logback作為日誌系統。

  • logback如何配置springboot框架

    創建logback-spring.xm在src/main/resources下面(springboot推薦使用logback-spring.xml而不是logback.xml)文件。

  • logback-spring.xml文件例子:

    以下是一個logback-spring.xml的例子,可以直接復制使用

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
<property
name="LOG_NAME" value="/home">
</property>
<!-- %m輸出的信息,%p日誌級別,%t線程名,%d日期,%c類的全名,,,, -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
<!--格式化輸出:%d:表示日期 %thread:表示線程名 %-5level:級別從左顯示5個字符寬度 %msg:日誌消息 %n:是換行符-->

<pattern>1-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
<charset>GBK</charset>
</encoder>
</appender>
<!--<include resource="org/springframework/boot/logging/logback/base.xml"/>--> <contextName>RestAPI</contextName>
<property name="LOG_PATH" value=".logs"/> <!--設置系統日誌目錄-->
<property name="APPDIR" value="app"/>
<!-- 說明:
1、日誌級別及文件
日誌記錄采用分級記錄,級別與日誌文件名相對應,不同級別的日誌信息記錄到不同的日誌文件中
例如:error級別記錄到log_error_xxx.log或log_error.log(該文件為當前記錄的日誌文件),而log_error_xxx.log為歸檔日誌,
日誌文件按日期記錄,同一天內,若日誌文件大小等於或大於2M,則按0、1、2...順序分別命名
例如log-level-2013-12-21.0.log
其它級別的日誌也是如此。
2、文件路徑
若開發、測試用,在Eclipse中運行項目,則到Eclipse的安裝路徑查找logs文件夾,以相對路徑../logs。
若部署到Tomcat下,則在Tomcat下的logs文件中
3、Appender
FILEERROR對應error級別,文件名以log-error-xxx.log形式命名
FILEWARN對應warn級別,文件名以log-warn-xxx.log形式命名
FILEINFO對應info級別,文件名以log-info-xxx.log形式命名
FILEDEBUG對應debug級別,文件名以log-debug-xxx.log形式命名
CONSOLE將日誌信息輸出到控制上,為方便開發測試使用
-->

<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌文件的路徑及文件名 --> <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日誌文件的路徑,例如今天是2013-12-21日誌,當前寫的日誌文件路徑為file節點指定,可以將此文件與file指定文件路徑設置為不同路徑,從而將當前日誌文件或歸檔日誌文件置不同的目錄。 而2013-12-21的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌文件不能超過2M,若超過2M,日誌文件會以索引0開始,
命名日誌文件,例如log-error-2013-12-21.0.log -->

<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append> <!-- 日誌文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder>
<!-- 此日誌文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌文件的路徑及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 歸檔的日誌文件的路徑,例如今天是2013-12-21日誌,當前寫的日誌文件路徑為file節點指定,可以將此文件與file指定文件路徑設置為不同路徑,從而將當前日誌文件或歸檔日誌文件置不同的目錄。
而2013-12-21的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->

<fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌文件不能超過2M,若超過2M,日誌文件會以索引0開始, 命名日誌文件,例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset> </encoder>
<!-- 此日誌文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>


<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌文件的路徑及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_info.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日誌文件的路徑,例如今天是2013-12-21日誌,當前寫的日誌文件路徑為file節點指定,可以將此文件與file指定文件路徑設置為不同路徑,從而將當前日誌文件或歸檔日誌文件置不同的目錄。 而2013-12-21的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌文件不能超過2M,若超過2M,日誌文件會以索引0開始, 命名日誌文件,例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--日誌異步到數據庫 -->
<!--<appender name="DBAPPENDER" class="ch.qos.logback.classic.db.DBAppender">-->
<!--<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">-->
<!--<dataSource class="com.zaxxer.hikari.HikariDataSource">-->
<!--<driverClassName>com.mysql.jdbc.Driver</driverClassName>-->
<!--<jdbcUrl>jdbc:mysql://localhost:3306/albedo-new?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</jdbcUrl>-->
<!--<username>root</username>-->
<!--<password>123456</password>-->
<!--<poolName>HikariPool-logback</poolName>-->
<!--</dataSource>-->
<!--</connectionSource>-->
<!--&lt;!&ndash; 此日誌文件只記錄info級別的 &ndash;&gt;-->
<!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--<level>warn</level>-->
<!--<onMatch>ACCEPT</onMatch>-->
<!--<onMismatch>DENY</onMismatch>-->
<!--</filter>-->
<!--&lt;!&ndash; 此日誌文件只記錄info級別的 &ndash;&gt;-->
<!--<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>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<!--<charset>GBK</charset>-->
</encoder>
</appender>
<logger name="com.minlia" level="DEBUG"/> <logger name="org.springframework.data.mybatis" level="DEBUG"/>
<logger name="org.springframework.aop.aspectj" level="ERROR"/>

<logger name="javax.activation" level="WARN"/>
<logger name="javax.mail" level="WARN"/>
<logger name="javax.xml.bind" level="WARN"/>
<logger name="ch.qos.logback" level="INFO"/>
<logger name="com.codahale.metrics" level="WARN"/>
<logger name="com.ryantenney" level="WARN"/>
<logger name="com.sun" level="WARN"/>
<logger name="com.zaxxer" level="WARN"/>
<logger name="io.undertow" level="WARN"/>
<logger name="net.sf.ehcache" level="WARN"/>
<logger name="org.apache" level="WARN"/>
<logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
<logger name="org.bson" level="WARN"/>
<logger name="org.hibernate.validator" level="WARN"/>
<logger name="org.hibernate" level="WARN"/>
<logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springframework.security" level="WARN"/>
<logger name="org.springframework.cache" level="WARN"/>
<logger name="org.thymeleaf" level="WARN"/>
<logger name="org.xnio" level="WARN"/>
<logger name="springfox" level="WARN"/>
<logger name="sun.rmi" level="WARN"/>
<logger name="liquibase" level="WARN"/>
<logger name="sun.rmi.transport" level="WARN"/>

<logger name="jdbc.connection" level="ERROR"/>
<logger name="jdbc.resultset" level="ERROR"/>
<logger name="jdbc.resultsettable" level="INFO"/>
<logger name="jdbc.audit" level="ERROR"/>
<logger name="jdbc.sqltiming" level="ERROR"/>
<logger name="jdbc.sqlonly" level="INFO"/>

<!--<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">-->
<!--<resetJUL>true</resetJUL>-->
<!--</contextListener>-->

<springProfile name="production">
<root level="DEBUG">
<!--<appender-ref ref="FILEERROR"/>-->
<!--<appender-ref ref="FILEWARN"/>-->
<!--<appender-ref ref="FILEINFO"/>-->
<!--<appender-ref ref="DBAPPENDER"/>-->
<appender-ref ref="STDOUT"/>

</root>
</springProfile>

<springProfile name="dev">
<root level="DEBUG">
<!--<appender-ref ref="FILEERROR"/>-->
<!--<appender-ref ref="FILEWARN"/>-->
<!--<appender-ref ref="FILEINFO"/>-->
<!--<appender-ref ref="DBAPPENDER"/>-->
<appender-ref ref="CONSOLE"/>

</root>
</springProfile>
</configuration>
  • ###配置多環境日誌輸出
    從上面可以看到,我們可以用springProfile標簽區分環境,其中root中的DEBUG是系統的日誌級別,我們可以通過application.yml或者
    application.properties文件
   <springProfile name="dev">
<root level="DEBUG">
<!--<appender-ref ref="FILEERROR"/>-->
<!--<appender-ref ref="FILEWARN"/>-->
<!--<appender-ref ref="FILEINFO"/>-->
<!--<appender-ref ref="DBAPPENDER"/>-->
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>

通過在配置文件中指定生效的環境和日誌的級別

spring.profiles.active=dev
logging.level.org.springframework.web=debug

- ###總結如下,springboot創建多環境日誌步驟
1.在src/main/resources下面創建logback-spring.xml文件,可以直接copy上面的文件修改
2.指定日誌級別和環境

SpringBoot日誌logback-spring.xml分環境(轉)