首页 » 网站建设 » php打印运行log技巧_logrotate日志切割

php打印运行log技巧_logrotate日志切割

访客 2024-11-17 0

扫一扫用手机浏览

文章目录 [+]

logrotate 是基于 crontab 运行的,以是这个韶光点是由 crontab 掌握的,详细可以查询 crontab 的配置文件 /etc/anacrontab。
系统会按照操持的频率运行 logrotate,常日是每天。
在大多数的 Linux 发行版本上,操持每天运行的脚本位于 /etc/cron.daily/logrotate。

一、logrotate运行机制

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

php打印运行log技巧_logrotate日志切割

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

php打印运行log技巧_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 logrotate3.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}EOF3.4、为php-slow做切割日志

[root@mayi ~]# mkdir -p /data/logs/php_slow[root@mayi ~]# cat > /etc/logrotate.d/php_slow <<EOF/data/logs/www.log.slow{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}EOF3.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_slow4.2、全部启动

[root@mayi ~]# /usr/sbin/logrotate -f /etc/logrotate.conf4.3、删除默认自动实行切割

[root@mayi ~]# rm -rf /etc/cron.daily/logrotate

文章部分内容通过网络网络整理,如有侵权或技能互换请联系作者!

#Author : mayi

#wchat : a403182580

相关文章

xdebugphpini技巧_PHP 内存泄漏分析定位

场景二 程序操作大数据时产生拷贝场景三 配置不合理系统资源耗尽场景四 无用的数据未及时开释深入理解php内存管理php-fpm内存...

网站建设 2024-12-11 阅读0 评论0