51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Linux下的日志,如何优雅地管理

# 前言 {#前言}

有的时候我们需要在Linux上执行命令,然后把日志写到一个文件中,就像下面这条命令一样。

nohup vllm serve glm-4v-9b --port 8081 >> mylog.log

在Java应用中,可以使用logback或log4j这样的框架管理日志。但通过命令写入的日志要如何优雅地管理起来呢?

# Logrotate介绍 {#logrotate介绍}

logrotate 是一个在Linux系统中广泛使用的日志文件管理工具,用于自动管理日志文件的大小和归档。Logrotate默认安装在发行版本的Linux服务器上,对于用户来说直接配置使用即可。

github开源地址如下:https://github.com/logrotate/logrotate (opens new window)

# Logrotate的配置 {#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   
}

每个参数的注释放在这里:

size 50M                # 当日志文件大小超过 50 MB 时分割
rotate 10               # 最多保留 10 个文件
missingok               # 如果日志文件不存在则忽略错误
notifempty              # 如果日志为空则不进行分割
compress                # 压缩旧日志文件
delaycompress           # 延迟压缩,避免对最新的日志文件立即压缩
copytruncate            # 复制并截断原日志文件,以免应用程序需要重启
create 0644 root root   # 创建新的日志文件,设置权限

第一行是日志的具体路径,配置里是各种参数,每个参数表达的意思已经放在后面的注释里了。

配置完成之后,调用下面这行命令就可以进行测试,-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    
}

每个参数的注释放在这里:

daily                    # 按天分割日志
rotate 7                 # 最多保留 7 天的日志
missingok                # 如果日志文件不存在则忽略错误
notifempty               # 如果日志为空则不进行分割
compress                 # 压缩旧日志文件,生成 .gz 文件
delaycompress            # 延迟压缩,保留最近一个分割的文件为原始格式
copytruncate             # 截断原日志文件,而不是创建新文件
create 0644 root root    # 每次分割后创建新日志文件并设置权限

和第一个案例的区别在于,使用daily来分割日志,而不是使用大小来分割日志。

# Logrotate参数介绍 {#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 一起使用以检查配置文件的正确性。

比如想要测试一下会生成怎样的日志,就可以使用-f参数,强制轮转日志文件。

# 配置文件参数 {#配置文件参数}

前面已经介绍了很多常用的配置文件参数,还有一些更多的参数可以配置时使用

基本参数

- daily:按天轮转日志。
- weekly:按周轮转日志。
- monthly:按月轮转日志。
- yearly:按年轮转日志。

条件和限制

- size <size>:当日志文件达到指定大小时进行轮转。可以指定 k、M、G 表示 KB、MB、GB,比如 size 50M。
- rotate <count>:保留的日志文件数量。例如,rotate 5 表示最多保留 5 个轮转文件,超过的旧日志文件将被删除。
- missingok:如果日志文件不存在,则忽略错误,不会影响其他文件的轮转。
- notifempty:如果日志文件为空,则不进行轮转。

文件管理

- compress:对轮转后的日志文件进行压缩,通常会生成 .gz 文件。
- nocompress:不对轮转后的日志文件进行压缩。
- delaycompress:延迟压缩,保留最近分割的文件未压缩,直到下次轮转才压缩。
- copytruncate:复制当前日志文件内容到新文件,并截断原日志文件。适合不支持重命名的程序。
- create <mode> <owner> <group>:轮转日志后创建新日志文件,并设置权限。例如,create 0644 root root。

文件命名和日期

- dateext:为日志文件添加日期后缀(如 .log-YYYYMMDD)。
- dateformat:自定义日期格式,与 dateext 搭配使用。例如,dateformat -%Y%m%d-%s。
- extension <extension>:指定轮转后的文件扩展名。例如,extension .log 将扩展名固定为 .log。

# 总结 {#总结}

通过合理设置 logrotate 的配置参数,可以有效控制日志文件的大小和数量,确保系统磁盘空间不被过度占用。

赞(1)
未经允许不得转载:工具盒子 » Linux下的日志,如何优雅地管理