本文目录导读:

- 日志分割的核心原则
- 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
这样规整的日志分割流程既能保证日志的可维护性,又能满足性能要求,同时也为后续的日志分析和监控打下了良好基础。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播