# Logback配置文件怎么寫
## 一、Logback簡介
Logback是Java社區中最流行的日志框架之一,作為Log4j的繼承者,由同一作者開發。它由三個模塊組成:
- logback-core(基礎模塊)
- logback-classic(實現了SLF4J API)
- logback-access(與Servlet容器集成)
### 1.1 Logback的優勢
- **性能提升**:比Log4j執行速度更快,內存占用更小
- **自動重載配置**:支持配置文件修改后自動重新加載
- **豐富的過濾功能**:提供多種靈活的過濾機制
- **上下文數據**:支持MDC(Mapped Diagnostic Context)
- **多種配置方式**:支持XML、Groovy和編程方式配置
## 二、基礎配置文件結構
Logback的標準配置文件名為`logback.xml`,需要放在classpath根目錄下?;窘Y構如下:
```xml
<configuration>
<!-- 屬性定義 -->
<property name="LOG_DIR" value="/var/logs/myapp" />
<!-- Appender配置 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Logger配置 -->
<logger name="com.example" level="DEBUG" />
<!-- Root Logger配置 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
可以在配置文件中定義變量,便于復用:
<!-- 簡單屬性 -->
<property name="LOG_DIR" value="/var/logs" />
<!-- 從系統環境變量獲取 -->
<property name="LOG_LEVEL" value="${LOG_LEVEL:-INFO}" />
<!-- 從配置文件獲取 -->
<property resource="application.properties" />
<!-- 使用條件判斷 -->
<if condition='property("os.name").contains("Windows")'>
<then>
<property name="LOG_DIR" value="C:/logs" />
</then>
<else>
<property name="LOG_DIR" value="/var/logs" />
</else>
</if>
Appender負責定義日志輸出目的地:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<target>System.out</target> <!-- 默認為System.err -->
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_DIR}/myapp.log</file>
<append>true</append>
<encoder>
<pattern>%d %p %c{1.} [%t] %m%n</pattern>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="ROLLING_SIZE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/size-roll.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/size-roll.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d %p %c{1.} [%t] %m%n</pattern>
</encoder>
</appender>
Encoder負責日志事件的格式化:
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
<immediateFlush>true</immediateFlush>
</encoder>
常用模式符號:
- %d
- 日期時間
- %thread
- 線程名
- %-5level
- 日志級別(左對齊,固定5字符)
- %logger
- Logger名稱
- %msg
- 日志消息
- %n
- 換行符
- %X{key}
- MDC中的值
Logger用于控制不同包的日志級別:
<!-- 特定包或類的Logger -->
<logger name="com.example.dao" level="DEBUG" additivity="false">
<appender-ref ref="DAO_FILE" />
</logger>
<!-- 第三方庫的Logger -->
<logger name="org.hibernate" level="WARN" />
<logger name="org.springframework" level="INFO" />
Root Logger是所有Logger的父級:
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
<if condition='property("env").equals("dev")'>
<then>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</then>
<else>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</else>
</if>
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>true</includeCallerData>
<appender-ref ref="FILE" />
</appender>
<appender name="EML" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>smtp.example.com</smtpHost>
<smtpPort>587</smtpPort>
<username>user@example.com</username>
<password>password</password>
<to>admin@example.com</to>
<from>noreply@example.com</from>
<subject>ERROR: %logger{20} - %m</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d %-5level %logger{35} - %message%n</pattern>
</layout>
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<bufferSize>10</bufferSize>
</cyclicBufferTracker>
<triggeringPolicy class="ch.qos.logback.classic.boolex.OnErrorEvaluator" />
</appender>
<conversionRule conversionWord="user"
converterClass="com.example.CustomConverter" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %user %msg%n</pattern>
</encoder>
</appender>
<springProfile name="dev">
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="EML" />
</root>
</springProfile>
immediateFlush="true"
includeCallerData
fileNamePattern
中的日期模式additivity
屬性<configuration scan="true" scanPeriod="30 seconds">
<!-- 環境變量 -->
<property name="APP_NAME" value="my-application" />
<property name="LOG_DIR" value="/var/log/${APP_NAME}" />
<!-- 控制臺輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>
<!-- 主日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 錯誤日志單獨輸出 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/error.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 異步日志 -->
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>1024</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="FILE" />
</appender>
<!-- Logger配置 -->
<logger name="com.example" level="DEBUG" />
<logger name="org.springframework" level="WARN" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<!-- Root Logger -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ASYNC_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
Logback提供了強大而靈活的日志配置能力,通過合理的配置可以: 1. 實現精細化的日志級別控制 2. 優化日志輸出性能 3. 方便地進行日志文件管理 4. 適應不同的運行環境需求
掌握Logback配置是Java開發者必備的技能,良好的日志實踐可以大大提高應用程序的可維護性和問題排查效率。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。