Logrotate处理日志
Logrotate处理日志
logrotate介绍
Logrotate是一个在Linux系统中负责轮换日志文件的工具。它的作用是定期地将旧的日志文件进行备份,并清除一些不再需要的日志文件。通常情况下,系统会在一段时间内持续地生成日志,如果这些日志文件不进行轮换或适时清理,就会消耗磁盘空间,最终导致系统瘫痪或运行不稳定。Logrotate可以帮助系统管理员自动管理日志文件,避免出现这种问题。同时,它也可以帮助管理员节省时间和精力,避免手动去管理和删除日志文件。
logrotate.conf 主配置文件
logrotate.conf文件是Logrotate工具的主配置文件。它的作用是告诉Logrotate如何进行日志文件的轮换和清理。常见的几个配置项包括:
rotate
:指定轮换多少个日志文件。例如,rotate 7表示只保留7个日志文件,旧的日志将被删除。weekly/daily/hourly/monthly
:指定日志轮换的周期频率,例如weekly表示每周执行一次日志轮换。create
:指定在轮换日志文件时,如果指定的新日志文件不存在,则可以使用该参数自动创建一个新的空日志文件,并设置该文件的文件权限和文件所属用户/用户组等属性。不指定用户权限时默认为create 0666
。compress
:指定是否压缩归档的旧日志文件。例如,compress表示将归档的旧日志文件使用gzip压缩。size
:指定日志文件大小达到多少字节时需要进行轮换。例如,size 50M表示当日志文件达到50MB大小时,需要进行轮换。dateext
:使用日期作为轮转后日志文件的后缀;missingok
:如果日志文件不存在,则跳过轮转而不是报错;include
:引入指定路径下的配置文件。
通常情况下,我们需要根据实际需要配置不同的轮换策略。例如,对于某些日志文件,我们可能需要在日志文件达到一定大小时进行轮换,而对于其他类型的日志文件,我们可能需要按照每天、每周等固定时间进行轮换。在配置过程中,我们也需要注意避免将重要的日志文件错误地删除或归档。
# see "man logrotate" for details
# rotate log files weekly 将日志文件按照周进行轮转;
weekly
# keep 4 weeks worth of backlogs 保留四周的备份日志文件;
rotate 4
# create new (empty) log files after rotating old ones 在轮转旧日志文件后,创建新的空日志文件;
create
# use date as a suffix of the rotated file 使用日期作为轮转后日志文件的后缀;
dateext
# uncomment this if you want your log files compressed 将归档的旧日志文件使用gzip压缩
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
# 仅当文件大小超过1M时才进行轮转
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
/etc/logrotate.d 目录下配置文件
/opt/app/wso2/am/gw01/repository/logs/* {
daily
rotate 2
dateext
copytruncate
compress
missingok
postrotate
export PATH=$PATH:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/puppetlabs/bin:/root/bin
bash -c "aws s3 sync --region cn-north-1 --exclude \"*\" --include \"*.gz\" /opt/app/logs/ s3://donaver/Logs/"
rm -f /opt/app/logs/*.gz
endscript
}
这是一个logrotate的配置文件,该文件定义了轮转日志文件的规则。具体来说,以下是每个配置选项的含义:
/opt/app/logs/
:要轮转的日志文件路径,表示任何以.log结尾的文件名。daily
:按天执行轮转操作。rotate 2
:最多保留2个归档文件,超过2个则删除最早的文件。dateext
:使用日期来扩展归档文件名。copytruncate
:在轮转时将当前日志文件复制到新文件中,然后截断当前文件,而不是将其重命名。compress
:压缩轮转后的日志文件。missingok
:如果日志文件不存在,则不发出警告或错误消息。
下面是postrotate脚本的说明:
- 使用
export PATH
设置环境变量PATH,以便在脚本中使用bin目录下的可执行文件。 - 运行AWS CLI sync命令将目录
/opt/app/logs/
中的.gz文件同步到S3存储桶s3://donaver/Logs/
中,--exclude
表示排除某些文件,--include
表示只同步包含特定扩展名的文件。 - 删除已压缩的文件,以节省磁盘空间。
因此,这个配置文件的功能是每天按照日期进行日志文件轮转操作,并将轮转后的日志文件压缩并拷贝到Amazon S3存储桶中,最后删除已压缩的日志文件,以节省磁盘空间。
Logrotate操作命令
常用的logrotate操作命令和参数如下:
-
logrotate
:执行默认配置文件 /etc/logrotate.conf 中指定的所有日志文件的轮换操作。 -
logrotate -f /etc/logrotate.conf
:强制执行所有日志文件的轮换操作。 -
logrotate -vf /etc/logrotate.d/myapp
:以verbose模式,强制对指定的日志文件 "/etc/logrotate.d/myapp" 进行轮换操作。 -
logrotate -d /etc/logrotate.d/apache2
:以调试模式,对指定的日志文件"/etc/logrotate.d/apache2" 进行轮换操作。 -
logrotate -s /var/log/logstatus /etc/logrotate.conf
:备份所有日志文件后,将状态信息输出到指定的状态文件 /var/log/logstatus,该状态文件包含轮换后的状态信息,以便下一次轮换时继续处理。 -
logrotate --force /etc/logrotate.d/nginx
:强制执行指定的日志文件 "/etc/logrotate.d/nginx" 的轮换操作。 -
logrotate --version
:查看logrotate版本信息。 -
logrotate --help
:查看帮助信息。 -
-v
:表示使用verbose模式,会输出轮换过程中的详细信息。 -
-f
:表示强制执行,即无需等到轮换时间到来时再执行,忽略轮换频率的设置。 -
-d
:表示使用调试模式,会输出轮换过程中的调试信息。 -
cat /var/lib/logrotate.status
命令可以查看 logrotate 的状态。该文件包含了 logrotate 最后一次运行时所处理的日志文件的信息、备份文件的信息、以及下一次计划运行时间等。通过查看该文件,您可以了解到 logrotate 的最后一次运行情况以及文件处理情况。例如,该文件可能包含以下信息:
logrotate state -- version 2 "/var/log/syslog" 2019-10-10-6:25:1 "/var/log/auth.log" 2019-10-10-6:25:1 "/var/log/kern.log" 2019-10-10-6:25:1 "/var/log/user.log" 2019-10-10-6:25:1 "/var/log/nginx/access.log" 2019-10-10-6:25:1 "/var/log/nginx/error.log" 2019-10-10-6:25:1 "/var/log/postgresql/postgresql-9.6-main.log" 2019-10-10-6:25:1 "/var/log/mysql/mysql.log" 2019-10-10-6:25:1 "/var/log/messages" 2019-10-10-6:25:1 "/var/log/secure" 2019-10-10-6:25:1 "/var/log/maillog" 2019-10-10-6:25:1 "/var/log/cron" 2019-10-10-6:25:1 "/var/log/httpd/*log" 2019-10-10-6:25:1 "*.log" 2019-10-10-6:25:1 "/var/log/wtmp" 2019-10-10-6:25:1 "/var/log/btmp" 2019-10-10-6:25:1 "/var/log/lastlog" 2019-10-10-6:25:1 # End of status file
在上面的示例中,每个已处理日志文件的名称都显示了其最后一次旋转的日期和时间。如果某个日志文件没有被旋转,则其最后一次旋转的日期和时间将显示为 “never”. 通过查看这些信息,您可以了解上一次 logrotate 运行的情况以及哪些日志文件已被处理。
查看logrotate进程
可以使用Linux系统中的ps命令结合grep命令来查看logrotate进程。具体命令为:
ps aux | grep logrotate
该命令会列出所有包含"logrotate"关键字的进程信息,包括进程号(PID)、进程状态(STAT)、CPU使用率(%CPU)、内存使用率(%MEM)、命令名称(COMMAND)等。一般情况下,logrotate进程会在后台运行,因此可以使用上述命令来查询logrotate正在执行的进程状态。
Cron介绍
在Linux中,Cron(翻译成定时器)是一种常见的任务调度程序,它可以根据预定时间表自动执行命令或脚本。它通常用于重复性的任务,例如定期备份数据、从互联网下载文件、打开特定的应用程序或执行必要的系统维护任务等。
定时任务配置
Cron的配置文件通常保存在/etc/crontab中,它包含了所有计划的任务和执行时间。每一行都代表了一个特定的任务,每一列都代表了一个时间间隔。格式如下:
minute hour day month weekday command
其中:
- minute:任务执行的分钟数(0-59)
- hour:任务执行的小时数(0-23)
- day:任务执行的日期(1-31)
- month:任务执行的月份(1-12)
- weekday:任务执行的星期几(0-7,0和7都代表星期日)
- command:要执行的命令或脚本
例如,假设你想在每个星期五下午4点定期备份你的数据库,那么你可以在/etc/crontab中添加如下一行:
0 16 * * 5 /usr/bin/mysqldump -u root -p123456 mydb > /backups/mydb_backup.sql
这个任务将在每个星期五下午4点执行,使用mysqldump命令备份mydb数据库,并将备份文件存储在/backups目录中的mydb_backup.sql文件中。
要查看当前计划的任务列表,可以使用crontab -l
命令。如果要编辑计划的任务列表,可以使用crontab -e
命令。
-
/etc/cron.daily
目录下的脚本将会在Linux系统中每天的固定时间自动执行一次,执行时间为每天的凌晨(00:00)。这个目录中存放的是一些日常维护的任务,例如日志清理、系统备份等。这些任务的执行时间都是在系统空闲的时候进行,因此不会对系统的正常运行造成影响。 -
/etc/cron.hourly
目录下的脚本也会定时执行。该目录下存放的是每小时执行的脚本任务。这些任务可以在不需要干预的情况下,自动从系统运行时间的每个小时开始执行。和其他cron目录不同的是,/etc/cron.hourly目录下的脚本会每隔一个小时运行一次,而不是每天运行。如果需要添加一个每小时执行一次的脚本任务,可以将其放在/etc/cron.hourly目录中。例如,在该目录下添加一个名为"mytask"的脚本,脚本可以在该文件开头加上以下内容:
#!/bin/bash
echo "This is mytask, which will be called every hour." >> /var/log/mytask.log
该脚本将在每个小时的第0分钟自动执行,并将"mytask"脚本执行的结果输出到/var/log/mytask.log文件中。需要注意的是,为了其能够被执行,应给予该文件必要的权限,如可执行权限(chmod +x /etc/cron.hourly/mytask)等。
/etc/cron.weekly
目录下存放的也是一些自动执行的脚本任务,不过是每周执行一次。这些任务通常是执行一些较为耗时的操作,例如系统备份、日志分析等。该目录下的任务将在每周的第一个工作日(即周一)的凌晨2点执行。如果你需要添加一些每周执行的脚本任务,也可以将其放在/etc/cron.weekly目录中。例如,你可以在该目录下添加一个名为"mybackup"的脚本,用于定期备份系统数据:
#!/bin/sh
# This is mybackup script, which will be called every week.
cp -r /home/user/data /backup/
该脚本将在每周一的凌晨2点自动执行,并将/home/user/data目录备份到/backup目录下面。需要注意的是,脚本文件必须被赋予可执行权限(chmod +x /etc/cron.weekly/mybackup),否则它无法被执行。
/etc/cron.monthly
目录下存放的是每月执行一次的任务。这些任务通常涉及比较重要的或者耗时较长的操作,如系统备份等。该目录下的任务将在每个月的第一个工作日(即1号)的凌晨2点执行。这些任务可以自动执行,不需要用户干预。如果需要添加每月执行一次的任务,也可以将其放在/etc/cron.monthly目录下。例如,你可以在该目录下添加一个名为"mymonthlytask"的脚本,用于定期清理系统垃圾文件:
#!/bin/sh
# This is mymonthlytask, which will be called every month.
find /var/log/ -ctime +30 -type f -delete > /dev/null 2>&1
该脚本将在每个月的第一个工作日的凌晨2点自动执行,并清除过期30天的日志文件。需要注意的是,脚本文件必须被赋予可执行权限(chmod +x /etc/cron.monthly/mymonthlytask),否则它无法被执行。
需要注意的是,如果使用的是anacron服务,它会自动检测任务是否已经运行。如果在预定的执行时间内,该任务未被运行,则anacron会在之后的某一个时段自动启动该任务进程。但如果使用的是传统的cron服务,则任务可能会被跳过,因为它不会考虑在系统下一次启动前已经错过的计划。如果您需要确保在指定的时间执行任务,建议使用anacron服务进行配置。
crond服务启动或停止
- 启动crond服务:
sudo systemctl start crond
- 停止crond服务:
sudo systemctl stop crond
- 重启crond服务:
sudo systemctl restart crond
- 查看crond服务状态:
sudo systemctl status crond
需要注意的是,crond服务的状态被称为"target",默认状态为"multi-user.target"。启动该服务时,系统会自动进入这个target,同时crond会在后台运行,按照预定的时间执行脚本任务。如果你需要在系统启动时自动启动crond服务,可以使用以下命令将其设置为自动启动:
sudo systemctl enable crond
这样,当系统每次启动时,crond服务会自动启动,并按照预定的时间执行脚本任务。
logrotate定时任务配置
在/etc/cron.daily
目录下创建一个logrotate文件,并写入一下内容:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
注:logrotate文件需要有可执行的权限
chmod 755 logrotate
脚本的内容解读:
-
第一行
#!/bin/sh
指定了使用哪种shell进行解释和执行这个脚本,本例中使用的是Bash。 -
第二行
/usr/sbin/logrotate /etc/logrotate.conf
是脚本的执行部分,使用/usr/sbin/logrotate
工具来执行日志切割操作,/etc/logrotate.conf
是指定的日志切割配置文件。 -
第三行
EXITVALUE=$?
是将上一条命令的退出状态码保存到EXITVALUE
变量中。 -
第四行
if [ $EXITVALUE != 0 ]; then
是判断EXITVALUE
是否为0,如果不为0则说明命令执行出错。 -
第五行
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
是使用logger
工具将日志信息输出到系统日志中,记录日志切割命令执行出错的信息。 -
第六行
exit 0
是告诉Bash退出脚本,退出状态码为0,表示成功完成了脚本的执行。
总之,这个脚本是一个非常常用的日志切割脚本,在Linux系统中非常常见。
日志查看
当cron的脚本执行异常时,/usr/bin/logger
命令会将日志信息输出到系统日志文件中。
在大多数Linux发行版中,系统日志文件存在于/var/log
目录下,一般使用syslog
或rsyslog
程序进行管理。日志文件名可能因发行版和配置而异,常见的系统日志文件有以下几个:
/var/log/syslog
或/var/log/messages
:系统日志,包括所有的系统消息和错误信息。/var/log/auth.log
或/var/log/secure
:系统认证日志,包括所有的登录、认证和授权信息。/var/log/kern.log
:内核日志,包括所有的关于内核的信息、错误和调试信息。/var/log/daemon.log
:守护进程日志,包括所有的守护进程产生的信息和错误消息。/var/log/cron.log
:cron日志,包括所有的cron任务执行记录。
因此,可以通过查看系统日志文件,查找有关日志切割脚本错误信息的记录。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)