<?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>
常用日志框架合并异常堆栈信息为一行_常用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 &
通常, -server 模式比 -client 模式提供更高的吞吐量,但启动时间会稍长一些。