本文目录导读:

- 日志分割的核心原则
- Logback配置方案(推荐)
- Log4j2配置方案
- Spring Boot配置示例
- logstash-logback-encoder(ELK集成)
- 性能优化建议
- 实际运维脚本
- 监控告警配置
- 最佳实践总结
我来系统性地介绍Java日志分割的规范流程和最佳实践。
日志分割的核心原则
分割维度
时间维度:按天、小时、分钟
大小维度:按文件大小(10MB、100MB等)
混合维度:时间和大小组合
命名规范
格式:应用名_日期_序号.log
示例:order_service_2024-01-15_0.log
order_service_2024-01-15_1.log
Logback配置方案(推荐)
按时间分割(生产环境标准配置)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 应用名称 -->
<property name="APP_NAME" value="order-service" />
<!-- 日志根目录 -->
<property name="LOG_HOME" value="/data/logs/${APP_NAME}" />
<!-- 1. 按天分割,保留30天 -->
<appender name="DAILY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}.log</file>
<!-- 文件大小限制,防止单文件过大 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<!-- 滚动策略:按天+大小 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名模式 -->
<fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 保留30天 -->
<maxHistory>30</maxHistory>
<!-- 总大小限制 -->
<totalSizeCap>20GB</totalSizeCap>
<!-- 每天最大文件数 -->
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 2. 错误日志单独分割 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/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_HOME}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>60</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="DAILY_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
按小时分割(高频应用)
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按小时分割 -->
<fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd_HH}.log</fileNamePattern>
<!-- 保留72小时 -->
<maxHistory>72</maxHistory>
<!-- 每个文件最大100MB -->
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
Log4j2配置方案
混合分割配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="APP_NAME">order-service</Property>
<Property name="LOG_HOME">/data/logs/${APP_NAME}</Property>
</Properties>
<Appenders>
<!-- 按天滚动,带大小限制 -->
<RollingFile name="RollingFile"
fileName="${LOG_HOME}/${APP_NAME}.log"
filePattern="${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %c{1} - %msg%n"/>
<Policies>
<!-- 基于时间策略 -->
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
<!-- 基于大小策略 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- 默认1,最大100个备份文件 -->
<DefaultRolloverStrategy max="100">
<Delete basePath="${LOG_HOME}" maxDepth="1">
<IfFileName glob="*.log.gz"/>
<IfLastModified age="30d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
</Configuration>
Spring Boot配置示例
application.yml
logging:
# 日志级别
level:
root: INFO
com.example: DEBUG
org.springframework: WARN
# 日志文件配置
file:
path: /data/logs/order-service
name: /data/logs/order-service/application.log
max-size: 100MB
max-history: 30
total-size-cap: 20GB
自定义配置(logging-spring.xml)
<configuration>
<springProperty name="APP_NAME" source="spring.application.name"/>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APP_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 分割规则:应用名.日期.序号 -->
<fileNamePattern>${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>
</configuration>
logstash-logback-encoder(ELK集成)
<!-- 用于ELK的JSON格式日志 -->
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.%i.json</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!-- 自定义字段 -->
<customFields>{"application":"${APP_NAME}","environment":"${ENV:-dev}"}</customFields>
</encoder>
</appender>
性能优化建议
异步日志配置
<!-- 异步输出,提升性能 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 队列大小 -->
<queueSize>1024</queueSize>
<!-- 线程数 -->
<maxFlushTime>1000</maxFlushTime>
<!-- 引用具体appender -->
<appender-ref ref="ROLLING_FILE"/>
</appender>
压缩历史日志
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 添加.gz后缀,自动压缩 -->
<fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
</rollingPolicy>
实际运维脚本
日志清理脚本
#!/bin/bash
# clean_old_logs.sh
LOG_DIR="/data/logs"
RETENTION_DAYS=30
# 清理超过30天的日志
find ${LOG_DIR} -name "*.log" -type f -mtime +${RETENTION_DAYS} -delete
find ${LOG_DIR} -name "*.log.gz" -type f -mtime +${RETENTION_DAYS} -delete
# 清理空目录
find ${LOG_DIR} -type d -empty -delete
日志分析脚本
#!/bin/bash # analyze_logs.sh # 统计各等级日志数量 echo "=== Error Count ===" grep -r "ERROR" /data/logs/*.log | wc -l # 统计特定时间段 echo "=== Last Hour Errors ===" awk '/2024-01-15 14:.*ERROR/' /data/logs/application.log
监控告警配置
Prometheus + Grafana 监控
# prometheus.yml
- job_name: 'log-monitor'
static_configs:
- targets: ['localhost:9091']
metrics_path: '/metrics'
日志文件大小告警
# 监控日志文件大小
MAX_SIZE=1073741824 # 1GB
CURRENT_SIZE=$(stat -f%z "/data/logs/application.log")
if [ $CURRENT_SIZE -gt $MAX_SIZE ]; then
echo "WARNING: Log file size exceeded 1GB"
fi
最佳实践总结
生产环境配置建议
- 分割策略: 按天分割 + 100MB大小限制
- 保留周期: 常规日志30天,错误日志60天
- 压缩格式: 使用GZIP压缩历史日志
- 编码格式: 统一使用UTF-8
注意事项
- Linux系统建议设置
logrotate作为双保险 - 避免在容器中使用文件日志,应使用标准输出
- 关键业务日志单独配置不同的保留策略
- 定期检查磁盘使用情况,避免日志占满磁盘
推荐技术栈
日志框架: Logback (Spring Boot默认)
收集方案: Filebeat → Kafka → Logstash → Elasticsearch
分析平台: Kibana + Grafana
告警系统: Prometheus + AlertManager
这样规整的日志分割流程既能保证日志的可维护性,又能满足性能要求,同时也为后续的日志分析和监控打下了良好基础。