Logrotate处理日志

Logrotate处理日志

logrotate介绍

Logrotate是一个在Linux系统中负责轮换日志文件的工具。它的作用是定期地将旧的日志文件进行备份,并清除一些不再需要的日志文件。通常情况下,系统会在一段时间内持续地生成日志,如果这些日志文件不进行轮换或适时清理,就会消耗磁盘空间,最终导致系统瘫痪或运行不稳定。Logrotate可以帮助系统管理员自动管理日志文件,避免出现这种问题。同时,它也可以帮助管理员节省时间和精力,避免手动去管理和删除日志文件。

logrotate.conf 主配置文件

logrotate.conf文件是Logrotate工具的主配置文件。它的作用是告诉Logrotate如何进行日志文件的轮换和清理。常见的几个配置项包括:

  1. rotate:指定轮换多少个日志文件。例如,rotate 7表示只保留7个日志文件,旧的日志将被删除。
  2. weekly/daily/hourly/monthly:指定日志轮换的周期频率,例如weekly表示每周执行一次日志轮换。
  3. create:指定在轮换日志文件时,如果指定的新日志文件不存在,则可以使用该参数自动创建一个新的空日志文件,并设置该文件的文件权限和文件所属用户/用户组等属性。不指定用户权限时默认为create 0666
  4. compress:指定是否压缩归档的旧日志文件。例如,compress表示将归档的旧日志文件使用gzip压缩。
  5. size:指定日志文件大小达到多少字节时需要进行轮换。例如,size 50M表示当日志文件达到50MB大小时,需要进行轮换。
  6. dateext:使用日期作为轮转后日志文件的后缀;
  7. missingok:如果日志文件不存在,则跳过轮转而不是报错;
  8. 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

脚本的内容解读:

  1. 第一行#!/bin/sh指定了使用哪种shell进行解释和执行这个脚本,本例中使用的是Bash。

  2. 第二行/usr/sbin/logrotate /etc/logrotate.conf是脚本的执行部分,使用/usr/sbin/logrotate工具来执行日志切割操作,/etc/logrotate.conf是指定的日志切割配置文件。

  3. 第三行EXITVALUE=$?是将上一条命令的退出状态码保存到EXITVALUE变量中。

  4. 第四行if [ $EXITVALUE != 0 ]; then是判断EXITVALUE是否为0,如果不为0则说明命令执行出错。

  5. 第五行/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" 是使用logger工具将日志信息输出到系统日志中,记录日志切割命令执行出错的信息。

  6. 第六行exit 0是告诉Bash退出脚本,退出状态码为0,表示成功完成了脚本的执行。

总之,这个脚本是一个非常常用的日志切割脚本,在Linux系统中非常常见。

日志查看

当cron的脚本执行异常时,/usr/bin/logger命令会将日志信息输出到系统日志文件中。

在大多数Linux发行版中,系统日志文件存在于/var/log目录下,一般使用syslogrsyslog程序进行管理。日志文件名可能因发行版和配置而异,常见的系统日志文件有以下几个:

  • /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任务执行记录。

因此,可以通过查看系统日志文件,查找有关日志切割脚本错误信息的记录。

posted @   Donaver  阅读(322)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示