Logback配置文件怎么写

发布时间:2021-10-21 10:05:26 作者:柒染
来源:亿速云 阅读:195
# 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根目录下。基本结构如下:

```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>

三、详细配置解析

3.1 属性定义

可以在配置文件中定义变量,便于复用:

<!-- 简单属性 -->
<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>

3.2 Appender配置

Appender负责定义日志输出目的地:

3.2.1 控制台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>

3.2.2 文件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>

3.2.3 滚动文件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>

3.2.4 大小和时间的滚动策略

<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>

3.3 Encoder配置

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中的值

3.4 Logger配置

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" />

3.5 Root Logger配置

Root Logger是所有Logger的父级:

<root level="INFO">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
</root>

四、高级配置技巧

4.1 条件配置

<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>

4.2 异步日志

<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
    <queueSize>512</queueSize>
    <discardingThreshold>0</discardingThreshold>
    <includeCallerData>true</includeCallerData>
    <appender-ref ref="FILE" />
</appender>

4.3 邮件通知

<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>

4.4 自定义转换器

<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>

五、最佳实践

5.1 多环境配置

<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>

5.2 日志文件管理

  1. 按应用、日期、实例区分日志文件
  2. 设置合理的滚动策略和保留期限
  3. 对大文件使用压缩
  4. 监控日志目录磁盘空间

5.3 性能优化

  1. 生产环境避免使用immediateFlush="true"
  2. 合理设置异步日志的队列大小
  3. 谨慎使用includeCallerData
  4. 简化复杂模式布局

六、常见问题解决

6.1 配置文件不生效

  1. 检查文件位置(classpath根目录)
  2. 检查文件名(logback.xml或logback-test.xml)
  3. 检查是否有多个配置文件冲突

6.2 日志文件不滚动

  1. 检查fileNamePattern中的日期模式
  2. 确保应用程序持续运行
  3. 检查文件权限

6.3 日志重复输出

  1. 检查Logger的additivity属性
  2. 避免重复的appender-ref

七、完整配置示例

<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开发者必备的技能,良好的日志实践可以大大提高应用程序的可维护性和问题排查效率。 “`

推荐阅读:
  1. spring 使用logback
  2. 自己写的sqlHelper 以及读取配置文件

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

logback

上一篇:线上nginx的no live upstreams while connecting to upstream 示例分析

下一篇:线程模型Netty怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》