Logback 详细配置解析及配置案例

一、Logback 核心配置标签解析

1. 根标签
  • 作用:整个配置文件的容器,包含所有日志配置。
  • 属性
    • scan:是否自动扫描配置文件变更(默认 false)。
    • scanPeriod:扫描间隔时间(如 scanPeriod="30 seconds")。
  • 示例
    <configuration scan="true" scanPeriod="60 seconds">
      
    configuration>
    
2. 标签
  • 作用:定义变量,简化重复值的使用。
  • 属性
    • name:变量名。
    • value:变量值。
    • fileresource:从文件或资源加载变量。
  • 示例
    <property name="LOG_HOME" value="/var/log/myapp" />
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
    
3. 标签
  • 作用:定义日志输出目标(如文件、控制台、数据库等)。
  • 常用类型
    • ConsoleAppender:输出到控制台。
    • RollingFileAppender:输出到文件并支持滚动切割。
    • SMTPAppender:发送日志到邮件。
  • 示例
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>${LOG_PATTERN}pattern>
      encoder>
    appender>
    
4. 标签
  • 作用:定义日志输出的格式。
  • 常用子标签
    • :格式模板。
    • :字符编码(如 UTF-8)。
  • 示例
    <encoder>
      <pattern>%d{ISO8601} [%thread] %level %logger{35} - %msg%npattern>
      <charset>UTF-8charset>
    encoder>
    
5. 标签
  • 作用:定义日志文件的滚动策略。
  • 常用类型
    • TimeBasedRollingPolicy:按时间滚动(如每天)。
    • SizeAndTimeBasedRollingPolicy:按时间和大小滚动。
    • FixedWindowRollingPolicy:按固定窗口滚动。
  • 示例
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <fileNamePattern>logs/app-%d{yyyy-MM-dd}.%i.logfileNamePattern>
      <maxFileSize>100MBmaxFileSize>
      <maxHistory>30maxHistory>
    rollingPolicy>
    
6. 标签
  • 作用:触发日志滚动的条件。
  • 常用类型
    • SizeBasedTriggeringPolicy:按文件大小触发。
  • 示例
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>50MBmaxFileSize>
    triggeringPolicy>
    
7. 标签
  • 作用:过滤日志事件。
  • 常用类型
    • ThresholdFilter:按级别过滤。
    • LevelFilter:精确匹配级别。
  • 示例
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>WARNlevel>
    filter>
    
8. 标签
  • 作用:配置特定包或类的日志级别。
  • 属性
    • name:包或类名。
    • level:日志级别(如 DEBUG, INFO)。
    • additivity:是否继承父 Logger 的 Appender(默认 true)。
  • 示例
    <logger name="com.example.service" level="DEBUG" additivity="false">
      <appender-ref ref="FILE" />
    logger>
    
9. 标签
  • 作用:配置根日志记录器,所有日志事件的默认处理。
  • 属性
    • level:根日志级别。
  • 示例
    <root level="INFO">
      <appender-ref ref="CONSOLE" />
    root>
    

二、配置案例

以下是一个面向生产环境的完整 logback-spring.xml 配置,支持多环境、异步日志、错误日志分离和 ELK 集成。


<configuration scan="true" scanPeriod="60 seconds">
    
    <property name="LOG_HOME" value="/var/log/myapp" />
    <property name="APP_NAME" value="myapp-prod" />
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
    <property name="LOGSTASH_PATTERN" value="%d{ISO8601} [%thread] %level %logger{35} - %msg" />

    
    <springProfile name="prod">
       

        
        <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_HOME}/${APP_NAME}.logfile>
            <encoder>
                <pattern>${LOG_PATTERN}pattern>
                <charset>UTF-8charset>
            encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i.log.gzfileNamePattern>
                <maxFileSize>100MBmaxFileSize>
                <maxHistory>30maxHistory>
                <totalSizeCap>20GBtotalSizeCap>
            rollingPolicy>
        appender>
 
        <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
            <queueSize>1024queueSize>
            <discardingThreshold>0discardingThreshold>
            <appender-ref ref="ROLLING_FILE" />
        appender>
        
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_HOME}/${APP_NAME}-error.logfile>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERRORlevel>
            filter>
            <encoder>
                <pattern>${LOG_PATTERN}pattern>
            encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/${APP_NAME}-error-%d{yyyy-MM-dd}.logfileNamePattern>
                <maxHistory>90maxHistory>
            rollingPolicy>
        appender>

        
        <appender name="LOGSTASH" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_HOME}/${APP_NAME}.jsonfile>
            <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                <customFields>{"app":"${APP_NAME}", "env":"prod"}customFields>
            encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.jsonfileNamePattern>
                <maxHistory>7maxHistory>
            rollingPolicy>
        appender>

        
        <root level="INFO">
            <appender-ref ref="ASYNC_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="LOGSTASH" />
        root>

        
        <logger name="org.springframework" level="WARN" />
        <logger name="org.hibernate" level="WARN" />
        <logger name="com.rabbitmq" level="ERROR" />
    springProfile>

    
    <springProfile name="dev">
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${LOG_PATTERN}pattern>
                <charset>UTF-8charset>
            encoder>
        appender>
        <root level="DEBUG">
            <appender-ref ref="CONSOLE" />
        root>
    springProfile>
configuration>

三、配置详解

1. 多环境支持
  • 标签:根据 spring.profiles.active 激活不同配置。
  • 生产环境prod):
    • 使用异步日志(AsyncAppender)提升性能。
    • 主日志按时间和大小滚动,压缩存档(.gz)。
    • 错误日志独立存储,保留 90 天。
    • 生成 JSON 日志供 ELK 分析。
  • 开发环境dev):
    • 控制台输出,日志级别为 DEBUG
2. 异步日志
  • AsyncAppender
    • queueSize:队列容量(默认 256)。
    • discardingThreshold:队列剩余多少时丢弃低级别日志(0 表示不丢弃)。
  • 优点:将 I/O 操作异步化,减少对主线程的影响。
3. 滚动策略
  • SizeAndTimeBasedRollingPolicy
    • fileNamePattern:文件名模式(%i 表示序号)。
    • maxFileSize:单个文件最大 100MB。
    • maxHistory:保留最近 30 天日志。
    • totalSizeCap:总日志上限 20GB。
  • .gz 压缩:减少磁盘占用。
4. 错误日志分离
  • ThresholdFilter:仅记录 ERROR 级别日志。
  • 独立滚动策略:按天滚动,保留 90 天。
5. ELK 集成
  • LogstashEncoder:生成结构化 JSON 日志。
  • customFields:添加自定义字段(如应用名、环境)。
6. 第三方库日志降级
  • 降低 Spring、Hibernate 等框架的日志级别,减少噪音。

四、依赖配置

1. Janino 条件支持
<dependency>
    <groupId>org.codehaus.janinogroupId>
    <artifactId>janinoartifactId>
    <version>3.0.6version>
dependency>
2. Logstash Encoder
<dependency>
    <groupId>net.logstash.logbackgroupId>
    <artifactId>logstash-logback-encoderartifactId>
    <version>7.4version>
dependency>

五、正式环境最佳实践

  1. 禁用控制台输出

    • 生产环境中控制台日志无意义且消耗资源。
  2. 日志分级存储

    • ERROR 日志单独存放,便于监控告警。
  3. 异步写入

    • 使用 AsyncAppender 提升吞吐量,但需监控队列堆积。
  4. 定期清理日志

    • 通过 maxHistorytotalSizeCap 防止磁盘耗尽。
  5. 日志监控

    • 集成 ELK 或 Prometheus+Grafana 实现可视化。

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