logrotate是CentOS系统自带的日志管理工具,可自动完成Java日志的轮转、压缩、删除及权限设置,无需额外安装复杂软件。
sudo yum install logrotate安装;创建/etc/logrotate.d/java配置文件(如无则新建),添加针对Java日志的规则(示例针对/path/to/your/java/logs/*.log):/path/to/your/java/logs/*.log {
daily # 按天轮转(可改为weekly/monthly)
rotate 7 # 保留最近7天的日志文件
compress # 使用gzip压缩旧日志(减少存储占用)
delaycompress # 延迟压缩(如第8天压缩第1天的日志,避免压缩当天日志)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 640 root adm # 新日志文件权限为640,属主root,属组adm(适配系统日志规范)
}
sudo logrotate -d /etc/logrotate.d/java测试配置语法(模拟运行,不实际修改文件);无误后通过sudo systemctl reload logrotate重新加载配置,使规则生效。通过Shell脚本可实现更个性化的备份逻辑(如备份到指定目录、添加时间戳、同步到远程服务器等),适合需要自定义流程的场景。
/usr/local/bin/backup_java_logs.sh,内容如下:#!/bin/bash
BACKUP_DIR="/backup/java_logs" # 备份目标目录
LOG_DIR="/var/log/myapp" # Java日志源目录
DATE=$(date +%Y%m%d_%H%M%S) # 当前时间戳(用于文件名)
# 创建备份目录(若不存在)
mkdir -p "$BACKUP_DIR"
# 备份日志文件(带时间戳)
cp "$LOG_DIR"/*.log "$BACKUP_DIR"/myapp_backup_"$DATE".log
# 清空原始日志文件(避免日志堆积)
> "$LOG_DIR"/*.log
# 删除30天前的备份(释放空间)
find "$BACKUP_DIR" -type f -name "*.log" -mtime +30 -exec rm -f {} \;
crontab -e添加定时执行规则(如每天凌晨2点运行):0 2 * * * /usr/local/bin/backup_java_logs.sh
scp或rsync将备份文件传输到远程服务器(示例见下文)。若需要将Java日志备份到远程服务器(如异地灾备),可使用rsync工具结合SSH实现加密传输。
/usr/local/bin/backup_java_logs_remote.sh,内容如下:#!/bin/bash
LOCAL_LOG_DIR="/var/log/myapp" # 本地Java日志目录
REMOTE_USER="backup_user" # 远程服务器用户名
REMOTE_HOST="remote.server.com" # 远程服务器IP/域名
REMOTE_DIR="/backup/java_logs" # 远程备份目录
DATE=$(date +%Y%m%d_%H%M%S)
# 使用rsync传输日志(加密且增量备份)
tar -czf - "$LOCAL_LOG_DIR" | ssh "$REMOTE_USER@$REMOTE_HOST" "tar -xzf - -C $REMOTE_DIR/myapp_backup_$DATE"
# 删除远程服务器上30天前的备份
ssh "$REMOTE_USER@$REMOTE_HOST" "find $REMOTE_DIR -type f -name '*.tar.gz' -mtime +30 -exec rm {} \;"
crontab -e添加定时执行规则(如每天凌晨3点运行):0 3 * * * /usr/local/bin/backup_java_logs_remote.sh
通过Java日志框架(如Log4j、Logback)的配置,实现日志文件的自动轮转(按大小/时间分割),无需依赖外部工具,适合需要精细化控制的场景。
log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/myapp.log
log4j.appender.file.MaxFileSize=10MB # 单个日志文件最大10MB
log4j.appender.file.MaxBackupIndex=10 # 保留10个备份文件
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp-%d{yyyy-MM-dd}.log</fileNamePattern> # 按天分割
<maxHistory>30</maxHistory> # 保留30天
</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="FILE" />
</root>
</configuration>
通过ELK(Elasticsearch+Logstash+Kibana)堆栈实现Java日志的集中收集、存储、分析与可视化,适合大规模分布式系统或需要日志分析的场景。
sudo yum install elasticsearch logstash kibana安装Elasticsearch、Logstash、Kibana;启动服务并设置开机自启(systemctl start/enable elasticsearch/logstash/kibana)。/etc/logstash/conf.d/java-app.conf,内容如下:input {
file {
path => "/var/log/myapp/*.log" # Java日志路径
start_position => "beginning" # 从文件开头读取(首次启动时)
}
}
filter {
# 可添加过滤器(如解析JSON日志、提取字段)
}
output {
elasticsearch {
hosts => ["localhost:9200"] # Elasticsearch地址
index => "java-app-logs-%{+YYYY.MM.dd}" # 按日期创建索引
}
stdout { codec => rubydebug } # 控制台输出(调试用)
}
sudo systemctl start logstash,日志将自动发送到Elasticsearch,并可通过Kibana可视化查询。