龙空技术网

logrotate日志切割

运维蚂蚁 47

前言:

如今朋友们对“php 中如何将日期转换为年月日”大约比较看重,同学们都想要剖析一些“php 中如何将日期转换为年月日”的相关资讯。那么小编在网络上搜集了一些有关“php 中如何将日期转换为年月日””的相关资讯,希望咱们能喜欢,看官们快快来了解一下吧!

logrotate 是一个 linux 系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间 / 大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。

logrotate 是基于 crontab 运行的,所以这个时间点是由 crontab 控制的,具体可以查询 crontab 的配置文件 /etc/anacrontab。 系统会按照计划的频率运行 logrotate,通常是每天。在大多数的 Linux 发行版本上,计划每天运行的脚本位于 /etc/cron.daily/logrotate。

一、logrotate运行机制

logrotate 在很多 Linux 发行版上都是默认安装的。系统会定时运行 logrotate,一般是每天一次。系统是这么实现按天执行的。crontab 会每天定时执行 /etc/cron.daily 目录下的脚本,而这个目录下有个文件叫 logrotate。在 centos 上脚本内容是这样的:

系统自带 cron task:/etc/cron.daily/logrotate,每天运行一次。

[root@gop-sg-192-168-56-103 logrotate.d]# cat /etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.confEXITVALUE=$?if [ $EXITVALUE != 0 ]; then    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"fiexit 0

可以看到这个脚本主要做的事就是以 /etc/logrotate.conf 为配置文件执行了 logrotate。就是这样实现了每天执行一次 logrotate。

因为我的系统执行 /etc/cron.daily 目录下的脚本不是我想滚动日志的时间,所以我把 /etc/cron.daily/logrotate 拷了出来,改了一下 logrotate 配置文件的路径,然后在 crontab 里加上一条指定时间执行这个脚本的记录,自定义周期滚动日志就大功告成了。这种自定义的方式有两点要注意:

配置文件里一定要配置 rotate 文件数目这个参数。如果不配置默认是 0 个,也就是只允许存在一份日志,刚切分出来的日志会马上被删除。多么痛的领悟,说多了都是泪。执行 logrotate 命令最好加 -f 参数,不然有时候配置文件修改的内容不生效。

很多程序的会用到 logrotate 滚动日志,比如 nginx。它们安装后,会在 /etc/logrotate.d 这个目录下增加自己的 logrotate 的配置文件。logrotate 什么时候执行 /etc/logrotate.d 下的配置呢?看到 /etc/logrotate.conf 里这行,一切就不言而喻了。

include /etc/logrotate.d
二、logrotate原理

logrotate 是怎么做到滚动日志时不影响程序正常的日志输出呢?logrotate 提供了两种解决方案。 1. create 2. copytruncate

2.1、Linux 文件操作机制

介绍一下相关的 Linux 下的文件操作机制。

Linux 文件系统里文件和文件名的关系如下图。

目录也是文件,文件里存着文件名和对应的 inode 编号。通过这个 inode 编号可以查到文件的元数据和文件内容。文件的元数据有引用计数、操作权限、拥有者 ID、创建时间、最后修改时间等等。文件件名并不在元数据里而是在目录文件中。因此文件改名、移动,都不会修改文件,而是修改目录文件。

借《UNIX 环境高级编程》里的图说一下进程打开文件的机制。

进程每新打开一个文件,系统会分配一个新的文件描述符给这个文件。文件描述符对应着一个文件表。表里面存着文件的状态信息(O_APPEND/O_CREAT/O_DIRECT...)、当前文件位置和文件的 inode 信息。系统会为每个进程创建独立的文件描述符和文件表,不同进程是不会共用同一个文件表。正因为如此,不同进程可以同时用不同的状态操作同一个文件的不同位置。文件表中存的是 inode 信息而不是文件路径,所以文件路径发生改变不会影响文件操作。

2.2、create

这也就是默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是重命名原日志文件,创建新的日志文件。详细步骤如下:

重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。创建新的日志文件,文件名和原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出的日志还是往原日志文件输出。最后通过某些方式通知程序,重新打开日志文件;由于重新打开日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。

如上也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。

不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了如下方式。

2.3、copytruncate

该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志;详细步骤如下:

将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并没改变,后续日志的输出仍然写入该文件中。

如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。

通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。

三.logrotate安装配置

[root@mayi ~]# yum -y install epel-release[root@mayi ~]# yum install -y logrotate
3.1、修改默认配置文件
 vim /etc/logrotate.conf 修改weekly为daily                  #daily为每天切割日志 修改rotate 4为rotate 30        #30表示只保留30天日志
3.2、为nginx做切割日志
[root@mayi ~]# mkdir -p  /data/logs/nginx [root@mayi ~]#cat > /etc/logrotate.d/nginx << EOF/data/logs/access.log  #需要切割的nginx日志路径{daily                                       #表示每天切割一次dateext                                     #表示切割后的日志会增加一个日期格式dateformat %Y%m%d                           #添加的日期格式为年月日extension .log                              #后缀为.lognotifempty                                  #如果日志为空,就不重新新建日志rotate 30                                   #日志保留为30天olddir /data/logs/nginx                 #用来存放被分割后日志文件的目录sharedscripts                               #下面是脚本内容,具体nginx.pid路径为nginx日志设置 postrotate     [ ! -f /usr/local/logs/nginx.pid ] || /bin/kill -USR1 `cat /usr/local/logs/nginx.pid` endscript}EOF

常见配置参数

daily :指定转储周期为每天weekly :指定转储周期为每周monthly :指定转储周期为每月rotate count :指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份tabooext [+] list:让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和~missingok:在日志轮循期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。size size:当日志文件到达指定的大小时才转储,bytes (缺省) 及 KB (sizek) 或 MB (sizem)compress: 通过 gzip 压缩转储以后的日志nocompress: 不压缩copytruncate:用于还在打开中的日志文件,把当前日志备份并截断nocopytruncate: 备份日志文件但是不截断create mode owner group : 转储文件,使用指定的文件模式创建新的日志文件nocreate: 不建立新的日志文件delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。errors address : 专储时的错误信息发送到指定的 Email 地址ifempty :即使是空文件也转储,这个是 logrotate 的缺省选项。notifempty :如果是空文件的话,不转储mail address : 把转储的日志文件发送到指定的 E-mail 地址nomail : 转储时不发送日志文件olddir directory:储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统noolddir: 转储后的日志文件和当前日志文件放在同一个目录下prerotate/endscript: 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行3.3、为php-fpm做切割日志

[root@mayi ~]# mkdir -p  /data/logs/php[root@mayi ~]# cat >  /etc/logrotate.d/php <<EOF/data/logs/php-fpm.log{dailydateextdateformat %Y%m%dextension .lognotifemptyrotate 30olddir /data/logs/phpsharedscripts postrotate     [ ! -f /var/run/php-fpm/php-fpm.pid ] || /bin/kill -USR1 `cat /var/run/php-fpm/php-fpm.pid` endscript}EOF
3.4、为php-slow做切割日志
[root@mayi ~]# mkdir -p  /data/logs/php_slow[root@mayi ~]# cat > /etc/logrotate.d/php_slow <<EOF/data/logs/{dailydateextdateformat %Y%m%dextension .lognotifemptyrotate 30olddir /data/logs/php_slowsharedscripts postrotate     [ ! -f /var/run/php-fpm/php-fpm.pid ] || /bin/kill -USR1 `cat /var/run/php-fpm/php-fpm.pid` endscript}EOF
3.5、为mysql_slow做切割日志
[root@mayi ~]# mkdir -p /data/logs/mysql_slow[root@mayi ~]# cat > /etc/logrotate.d/mysql_slow << EOF/data/mysqlp/mysql-slow.log{dailydateextextension .lognotifemptyrotate 30olddir /data/logs/mysql_slowsharedscripts postrotate/usr/bin/mysqladmin -u root -p123 -S /usr/local/mysql_p/mysql.sock  flush-logsendscript}EOF
四.启动logrotate4.1、分别启动每个日志
[root@mayi ~]# /usr/sbin/logrotate  -f /etc/logrotate.d/nginx[root@mayi ~]# /usr/sbin/logrotate  -f /etc/logrotate.d/php_fpm[root@mayi ~]# /usr/sbin/logrotate  -f /etc/logrotate.d/php_slow[root@mayi ~]# /usr/sbin/logrotate  -f /etc/logrotate.d/mysql_slow
4.2、全部启动
[root@mayi ~]# /usr/sbin/logrotate  -f /etc/logrotate.conf
4.3、删除默认自动执行切割
[root@mayi ~]# rm -rf /etc/cron.daily/logrotate 

文章部分内容通过网络收集整理,如有侵权或技术交流请联系作者!

#Author : mayi

#wchat : a403182580

标签: #php 中如何将日期转换为年月日 #mysql数据切割 #syslogngnginx #压缩日志命令 #centos日志导出