Linux下的日志,如何优雅地管理
作者:鱼仔
博客首页: https://codeease.top
公众号:Java鱼仔
# 前言
有的时候我们需要在Linux上执行命令,然后把日志写到一个文件中,就像下面这条命令一样。
nohup vllm serve glm-4v-9b --port 8081 >> mylog.log
在Java应用中,可以使用logback或log4j这样的框架管理日志。但通过命令写入的日志要如何优雅地管理起来呢?
# Logrotate介绍
logrotate 是一个在Linux系统中广泛使用的日志文件管理工具,用于自动管理日志文件的大小和归档。Logrotate默认安装在发行版本的Linux服务器上,对于用户来说直接配置使用即可。
github开源地址如下:https://github.com/logrotate/logrotate (opens new window)
# Logrotate的配置
Logrotate默认有三个重要的路径:
- 执行脚本路径:/usr/sbin/logrotate
- 主配置文件:/etc/logrotate.conf
- 自定义配置文件:/etc/logrotate.d/*
如果有新的需要管理日志的任务的时候,只需要在/etc/logrotate.d/目录下创建新的配置文件即可。配置完成后不需要重启。
# 第一个案例
还是开头的这个例子,如果我希望实现mylog.log文件大于50M就进行切割,最多保留10个文件,就可以这样配置:
sudo vi /etc/logrotate.d/myapp
/var/log/myapp.log {
size 50M
rotate 10
missingok
notifempty
compress
delaycompress
copytruncate
create 0644 root root
}
2
3
4
5
6
7
8
9
10
每个参数的注释放在这里:
size 50M # 当日志文件大小超过 50 MB 时分割
rotate 10 # 最多保留 10 个文件
missingok # 如果日志文件不存在则忽略错误
notifempty # 如果日志为空则不进行分割
compress # 压缩旧日志文件
delaycompress # 延迟压缩,避免对最新的日志文件立即压缩
copytruncate # 复制并截断原日志文件,以免应用程序需要重启
create 0644 root root # 创建新的日志文件,设置权限
2
3
4
5
6
7
8
第一行是日志的具体路径,配置里是各种参数,每个参数表达的意思已经放在后面的注释里了。
配置完成之后,调用下面这行命令就可以进行测试,-d参数可以测试脚本是否正常。
sudo logrotate -d /etc/logrotate.d/myapp
如果存在报错,根据具体的报错解决问题即可
# 第二个案例
实现每天生成一个新的日志文件,并保留最多 7 天的数据,还是一样的配置思路,创建一个配置文件
sudo vi /etc/logrotate.d/myapp2
/var/log/myapp2.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
create 0644 root root
}
2
3
4
5
6
7
8
9
10
每个参数的注释放在这里:
daily # 按天分割日志
rotate 7 # 最多保留 7 天的日志
missingok # 如果日志文件不存在则忽略错误
notifempty # 如果日志为空则不进行分割
compress # 压缩旧日志文件,生成 .gz 文件
delaycompress # 延迟压缩,保留最近一个分割的文件为原始格式
copytruncate # 截断原日志文件,而不是创建新文件
create 0644 root root # 每次分割后创建新日志文件并设置权限
2
3
4
5
6
7
8
和第一个案例的区别在于,使用daily来分割日志,而不是使用大小来分割日志。
# Logrotate参数介绍
# 运行参数
在调试配置的时候,我们使用了logrotate -d这个参数,用于debug,除此之外,还有一些运行参数可以使用
- -f 或 --force:强制轮转日志文件,不论日志轮转条件是否达到。例如,即使日志文件没有达到设定大小或时间条件,也会进行轮转。
- -v 或 --verbose:启用详细输出模式,显示 logrotate 执行过程中处理的详细信息。
- -d 或 --debug:启用调试模式,不会实际轮转日志,只会显示 logrotate 将要执行的操作。
- -s <state_file> 或 --state <state_file>:指定 logrotate 的状态文件,记录最后一次轮转的时间。默认文件路径为 /var/lib/logrotate/status。
- -m <mail_command> 或 --mail <mail_command>:指定发送错误报告的邮件命令。
- -l <log_file> 或 --log <log_file>:指定记录 logrotate 日志信息的日志文件。
- -t 或 --test:用于测试配置文件的语法和逻辑,通常和 -d 一起使用以检查配置文件的正确性。
2
3
4
5
6
7
比如想要测试一下会生成怎样的日志,就可以使用-f参数,强制轮转日志文件。
# 配置文件参数
前面已经介绍了很多常用的配置文件参数,还有一些更多的参数可以配置时使用
基本参数
- daily:按天轮转日志。
- weekly:按周轮转日志。
- monthly:按月轮转日志。
- yearly:按年轮转日志。
2
3
4
条件和限制
- size <size>:当日志文件达到指定大小时进行轮转。可以指定 k、M、G 表示 KB、MB、GB,比如 size 50M。
- rotate <count>:保留的日志文件数量。例如,rotate 5 表示最多保留 5 个轮转文件,超过的旧日志文件将被删除。
- missingok:如果日志文件不存在,则忽略错误,不会影响其他文件的轮转。
- notifempty:如果日志文件为空,则不进行轮转。
2
3
4
文件管理
- compress:对轮转后的日志文件进行压缩,通常会生成 .gz 文件。
- nocompress:不对轮转后的日志文件进行压缩。
- delaycompress:延迟压缩,保留最近分割的文件未压缩,直到下次轮转才压缩。
- copytruncate:复制当前日志文件内容到新文件,并截断原日志文件。适合不支持重命名的程序。
- create <mode> <owner> <group>:轮转日志后创建新日志文件,并设置权限。例如,create 0644 root root。
2
3
4
5
文件命名和日期
- dateext:为日志文件添加日期后缀(如 .log-YYYYMMDD)。
- dateformat:自定义日期格式,与 dateext 搭配使用。例如,dateformat -%Y%m%d-%s。
- extension <extension>:指定轮转后的文件扩展名。例如,extension .log 将扩展名固定为 .log。
2
3
# 总结
通过合理设置 logrotate
的配置参数,可以有效控制日志文件的大小和数量,确保系统磁盘空间不被过度占用。