A

Logback配置

Logback Manual

第三章:logback 的配置 | logback

配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- Logback配置文件,用于配置日志输出 -->
<configuration>
    <!-- 控制台输出配置 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 使用PatternLayoutEncoder进行日志格式化 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 日志输出格式:
                 %d{yyyy-MM-dd HH:mm:ss.SSS} - 时间戳
                 [%thread] - 线程名
                 [%X{traceId:-N/A},%X{spanId:-N/A}] - 链路追踪ID和跨度ID,不存在时显示N/A
                 %-5level - 日志级别,左对齐5个字符
                 %logger{36} - 日志输出者名字(最长36个字符)
                 %msg - 日志消息
                 %n - 换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-N/A},%X{spanId:-N/A}] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 文件输出配置,使用RollingFileAppender进行文件滚动 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 当前日志文件路径 -->
        <file>logs/application.log</file>
        <!-- 使用固定窗口策略进行文件滚动,适合于ELK日志收集场景 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <!-- 归档日志文件的命名模式,%i表示索引 -->
            <fileNamePattern>logs/application.%i.log</fileNamePattern>
            <!-- 最小索引值 -->
            <minIndex>1</minIndex>
            <!-- 最大索引值,设置为1表示只保留一个归档文件 -->
            <maxIndex>1</maxIndex>
        </rollingPolicy>
        <!-- 基于文件大小的触发策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!-- 单个日志文件的最大大小为 -->
            <maxFileSize>50MB</maxFileSize>
        </triggeringPolicy>
        <!-- 使用PatternLayoutEncoder配置日志格式,采用JSON格式便于ELK解析 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- JSON格式的日志模式,包含:
                 timestamp - 时间戳
                 thread - 线程名
                 traceId - 链路追踪ID
                 spanId - 跨度ID
                 level - 日志级别
                 logger - 日志输出者
                 message - 日志消息 -->
            <pattern>{"timestamp":"%d{yyyy-MM-dd HH:mm:ss.SSS}","thread":"%thread","traceId":"%X{traceId:-N/A}","spanId":"%X{spanId:-N/A}","level":"%-5level","logger":"%logger{36}","message":"%msg"}%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 异步写入日志,提升性能 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
        <queueSize>256</queueSize>
        <appender-ref ref="FILE"/>
    </appender>

    <!-- 根日志级别配置,所有logger都会继承此配置 -->
    <root level="INFO">
        <!-- 同时输出到控制台和文件 -->
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>

    <!-- 第三方库的日志级别配置,避免过多日志输出 -->
    <logger name="org.springframework" level="INFO"/>
    <logger name="org.hibernate" level="INFO"/>
</configuration> 

ELK堆栈处理

  1. 程序内部堆栈合并一行
  2. filebeat配置合并输出

常用日志框架合并异常堆栈信息为一行_常用log4j2合并异常堆栈信息为一行-CSDN博客

filebeat 处理 java 堆栈信息(异常日志)_filebeat采集error 堆栈信息-CSDN博客

# Filebeat 输入配置部分
filebeat.inputs:
  # 使用 filestream 类型,这是新版本推荐的输入类型
  - type: filestream
    # 为此输入定义唯一标识符
    id: java-app-logs
    # 启用此输入配置
    enabled: true
    # 定义要监控的日志文件路径,支持通配符
    paths:
      - /Users/name/devlop/IdeaProjects/main-service/logs/*.log

    # JSON 日志解析配置
    # 将 JSON 字段提升到事件的根级别
    json.keys_under_root: true
    # 如果 JSON 解析失败,添加错误信息到事件中
    json.add_error_key: true

    # 多行日志处理配置
    multiline:
      # 使用正则表达式模式匹配
      type: pattern
      # 匹配以空格开头,后面跟着 "at" 或 "..." 或 "Caused by:" 的行
      pattern: '^\\s+(at|Caused by:|\\.\\.\\.)'
      # false 表示匹配到的行不会成为新事件的开始
      negate: false
      # 将匹配的行追加到前一行之后
      match: after
      # 单个多行事件最多包含的行数
      max_lines: 500
      # 等待更多行的超时时间
      timeout: 5s

# 处理器配置,用于增强和转换事件
processors:
  # 添加主机元数据(如主机名、操作系统等)
  - add_host_metadata: ~
  # 添加云服务提供商元数据(如果在云环境中运行)
  - add_cloud_metadata: ~
  # 添加 Docker 元数据(如果在 Docker 环境中运行)
  - add_docker_metadata: ~

# Elasticsearch 输出配置
output.elasticsearch:
  # Elasticsearch 服务器地址
  hosts: ["localhost:9200"]
  # 索引名称格式,按日期自动轮转
  index: "java-app-logs-%{+yyyy.MM.dd}"

# Elasticsearch 索引模板设置
setup.template.name: "java-app-logs"
# 索引模板匹配模式
setup.template.pattern: "java-app-logs-*"
# 启用索引生命周期管理
setup.ilm.enabled: true

# Filebeat 日志级别设置
logging.level: info

日志输出

即使使用了 Logback,你仍能保留命令里的重定向配置,不过这会让日志输出到两个地方

# 输出到output.log logback
sudo nohup  java -server -Xmx2G -Xms2G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/myname/java/target/heapError -jar  -Dspring.profiles.active=prod   jeecg-boot-module-system-3.3.0.jar  > ./output.log 2>&1 &

# 输出到nohup.out 中
sudo nohup  java -server -Xmx2G -Xms2G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/myname/java/target/heapError -jar  -Dspring.profiles.active=prod   jeecg-boot-module-system-3.3.0.jar  &

仅依靠 Logback 来管理日志

sudo nohup  java -server -Xmx2G -Xms2G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/myname/java/target/heapError -jar  -Dspring.profiles.active=prod   jeecg-boot-module-system-3.3.0.jar  > /dev/null 2>&1 &

java -server -client 模式

通常, -server 模式比 -client 模式提供更高的吞吐量,但启动时间会稍长一些。