linux 服务器运行时间长了,日志文件很容易越积越多。常见的占用来源主要有:
/var/log/ /var/log/journal/ 应用程序自己的日志目录 nginx、mysql、docker 等服务日志
如果磁盘空间突然变小,可以先从日志开始排查。
1. 先看日志占用了多少空间
先查看 /var/log:
du -sh /var/log/*
也可以按大小排序:
du -h /var/log/* | sort -h
如果想看 systemd 日志占用:
journalctl --disk-usage
可能看到:
archived and active journals take up 2.8g in the file system.
说明 journal 已经占用了接近 3gb。
2. 使用 journalctl 清理旧日志
如果只想保留最近 7 天:
journalctl --vacuum-time=7d
只保留最近 3 天:
journalctl --vacuum-time=3d
也可以直接限制日志总大小,比如保留 500mb:
journalctl --vacuum-size=500m
执行后再次查看:
journalctl --disk-usage
一般就能看到明显下降。
3. 不要直接乱删 journal 文件
有些人看到:
/var/log/journal/
占用很大,就直接:
rm -rf /var/log/journal/*
虽然能快速释放空间,但不推荐这么处理。
更稳妥的方法还是:
journalctl --vacuum-time=7d
或者:
journalctl --vacuum-size=500m
这样由 systemd 自己处理日志文件,不容易造成异常。
4. 限制 journal 最大占用
如果服务器经常出现日志越来越大的情况,可以直接限制 journald。
编辑:
nano /etc/systemd/journald.conf
找到或者增加:
systemmaxuse=500m systemkeepfree=1g maxretentionsec=7day
其中:
systemmaxuse journal 最大磁盘占用 systemkeepfree 至少给磁盘保留多少空间 maxretentionsec 日志最长保留时间
修改完成后重启:
systemctl restart systemd-journald
这样以后日志就不会无限增长。
5. 普通日志文件靠 logrotate 管理
除了 journal,linux 上很多服务会直接写日志文件,例如:
/var/log/nginx/access.log /var/log/nginx/error.log /var/log/mysql/ /var/log/syslog
这些通常由 logrotate 负责自动轮转。
查看配置:
cat /etc/logrotate.conf
服务自己的配置一般位于:
ls /etc/logrotate.d/
例如 nginx:
cat /etc/logrotate.d/nginx
6. logrotate 是怎么工作的
一个简单配置可能是:
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
}
含义分别是:
daily 每天轮转 rotate 7 保留 7 份旧日志 compress 压缩旧日志 missingok 文件不存在不报错 notifempty 空日志不处理
轮转以后,原来的:
app.log
可能变成:
app.log app.log.1 app.log.2.gz app.log.3.gz
这样日志就不会一直写进同一个越来越大的文件。
7. 给自己的应用配置日志轮转
假设 node.js 项目日志是:
/opt/myapp/logs/app.log
可以创建:
nano /etc/logrotate.d/myapp
写入:
/opt/myapp/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncate 会先复制旧日志,然后清空原文件。
对于一些不会主动重新打开日志文件的程序,这种方式比较方便。
配置后可以测试:
logrotate -d /etc/logrotate.d/myapp
-d 只是调试,不会真正执行。
确认没问题后再正常使用。
8. 单个日志文件特别大怎么办
先查看:
ls -lh /var/log/
如果发现某个日志已经几十 gb,不建议直接删除正在使用的文件。
可以先清空:
truncate -s 0 /var/log/xxx.log
例如:
truncate -s 0 /var/log/nginx/access.log
这样文件还在,只是内容被清空,正在运行的程序通常也不会因为日志文件突然消失而出问题。
不过清理之前最好先确认日志是否还需要保留。
9. 一套常用排查流程
服务器磁盘异常时,我一般先执行:
df -h
然后:
du -sh /var/log/*
检查 journal:
journalctl --disk-usage
如果 journal 太大:
journalctl --vacuum-time=7d
如果是普通日志文件太大,就继续检查:
ls -lh /var/log/
最后再看对应服务的 logrotate 配置。
日志清理不难,真正需要解决的是“为什么一直增长”。临时删掉几个 gb 只能缓解一次,长期运行的服务器最好同时配置 journald 大小限制和 logrotate,否则过一段时间磁盘还是会再次被占满。
以上就是linux使用journalctl与日志轮转清理日志的具体教程的详细内容,更多关于linux journalctl与日志轮转清理日志的资料请关注代码网其它相关文章!
发表评论