• 切割日志(mysql,nginx,php tomcat)使用logrotate


    1、简介

    logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把这个过程叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行,比如系统每天的定时任务会执行一次logrotate操作来完成系统日志的转储。logrotate 的默认配置文件是 /etc/logrotate.conf,一般自定义一个新的配置文件来完成相应日志切割管理。

    logrotate是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为“转储”。我们可以根据日志的大小,或者根据其使用的天数来转储。

    logrotate 的执行由crond服务实现。在/etc/cron.daily目录中,有个文件logrotate,它实际上是个shell script,用来启动logrotate。logrotate程序每天由cron在指定的时间(/etc/crontab)启动。因此,使用ps是无法查看到logrotate的。如果它没有起来,就要查看一下crond服务有没有在运行。在执行logrotate时,需要指定其配置文件/etc/logrotate.conf。这 个配置文件的注释写得很清楚,没有必要再罗嗦了。只想强调下面这行,它的作用包含存放在/etc/logrotate.d目录下面的配置文件,不可或缺。 如果你安装了一个新的服务,它的日志转储的规则可以建立一个专门的配置文件,放在/etc/logrotate.d下面。它其实也因为下面的这句话,在 logrotate服务启动时被读取。

    每个存放在/etc/logrotate.d目录里的文件,都有上面格式的配置信息。在{}中定义的规则,如果与logrotate.conf中的冲突,以/etc/logrotatate.d/中的文件定义的为准

    测试参数

    1 -?或--help:在线帮助; 
    2 -d或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况; 
    3 -f或--force :强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然; 
    4 -s<状态文件>或--state=<状态文件>:使用指定的状态文件; 
    5 -v或--version:显示指令执行过程; 
    6 -usage:显示指令基本用法。
    eg :logrotate -vf /etc/logrotate.conf #强制执行
    ----- 可直接手动执行
    $ logrotate --force /etc/logrotate.d/nginx
    
    ----- 显示详细的信息;而且--debug/-d实际上不会操作具体文件(Dry Run)
    $ logrotate --debug --verbose --force /etc/logrotate.d/nginx

    2 主要参数

     1 compress     通过gzip 压缩转储以后的日志
     2 nocompress     不需要压缩时,用这个参数
     3 copytruncate     用于还在打开中的日志文件,把当前日志备份并截断
     4 nocopytruncate     备份日志文件但是不截断
     5 create mode owner group     转储文件,使用指定的文件模式创建新的日志文件
     6 nocreate     不建立新的日志文件
     7 delaycompress      和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
     8 nodelaycompress      覆盖 delaycompress 选项,转储同时压缩。
     9 errors address      专储时的错误信息发送到指定的Email 地址
    10 ifempty      即使是空文件也转储,这个是 logrotate 的缺省选项。
    11 notifempty      如果是空文件的话,不转储
    12 mail address      把转储的日志文件发送到指定的E-mail 地址
    13 nomail      转储时不发送日志文件
    14 olddir directory      转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
    15 noolddir      转储后的日志文件和当前日志文件放在同一个目录下
    16 prerotate/endscript      在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
    17 postrotate/endscript      在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
    18 daily      指定转储周期为每天
    19 weekly      指定转储周期为每周
    20 monthly      指定转储周期为每月
    21 rotate count      指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
    22 tabootext [+] list 让logrotate      不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
    23 size size      当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
    24 dateext  切换后的日志文件会附加上一个短横线和YYYYMMDD格式的日期,没有这个配置项会附加一个小数点加一个数字序号.
    25 dateformat 配合dateext使用可以为切割后的日志加上YYYYMMDD格式的日期
    26 sharedscripts #共享脚本,下面的postrotate <s> endscript中的脚本只执行一次即可;

    在定义日志文件时也可以使用通配符,但最好少用通配符,因会它会包括已经切换过的日志,要用的话最好在*号后加上扩展名, 如*.log。

    常见日志切割

    nginx的日志切割

    首先切换到/etc/logrotate.d

    cd  /etc/logrotate.d
    touch nginx

    配置

     1 #也可以分开写
     2 #/var/log/nginx/access.log /var/log/nginx/err.log{}
     3 /usr/local/nginx/logs/*.log {
     4 #频次为每天运行 
     5     daily
     6 #保留3天的日志 
     7     rotate 3
     8 #如果日志文件不存在,则不报错,直接忽略
     9     missingok
    10 #如果日志文件为空则不执行轮替操作
    11     notifempty
    12     compress
    13 #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统;
    14     olddir /data/log_backup/
    15 #日志共享脚本,也就是说等access和error两个日志都rotate之后再执行下面的脚本
    16     sharedscripts
    17 #日期格式默认access.log-20171206
    18     dateext
    19 #总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
    20     delaycompress
    21     su root
    22     postrotate
    23   [ -e /usr/local/nginx/logs/nginx.pid ] && /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || :
    24     endscript
    25 }

     不过也可以脚本,如下

     1 #!/bin/bash
     2 PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
     3 logs_path="/usr/local/nginx/logs/"
     4 logs_backup_path="/usr/local/nginx/logs/backup_log/"
     5 
     6 #以前的日志文件。
     7 
     8 log_name="accessaa.log"
     9 log_err="error.log"
    10 pid_path="/usr/local/nginx/logs/nginx.pid"
    11 
    12 
    13 
    14 mv ${logs_path}${log_name} ${logs_backup_path}${log_name}_$(date +"%Y-%m-%d").log
    15 
    16 mv ${logs_path}${log_err}  ${logs_backup_path}${log_err}_$(date +"%Y-%m-%d").log
    17 
    18 
    19 
    20 kill -USR1 `cat ${pid_path}`
    View Code

    mysql日志配置

    参考https://www.percona.com/blog/2013/04/18/rotating-mysql-slow-logs-safely/

     1 #日志路径,以下参数参照上边的
     2 /var/mysql/slow_query.log {
     3     compress
     4     delaycompress
     5     rotate 30
     6     create 660 mysql mysql
     7     size 1G
     8     olddir  /data/backup/mysql_log/
     9     dateext
    10     missingok
    11     notifempty
    12     sharedscripts
    13     postrotate
    14        /usr/local/bin/mysql -uroot -hhost -ppwd -P3306 -e 'select @@global.long_query_time into @lqt_save; set global long_query_time=2000; select sleep(2); FLUSH LOGS; select sleep(2); set global long_query_time=@lqt_save;' >/dev/null 2>&1
    15     endscript

     mysql的err.log按照他自己的来写

    MySQL本身提供了一个rotate的参考配置文件,在support-files目录下,文件名为mysql-log-rotate,内容如下:

     1 # The log file name and location can be set in
     2 # /etc/my.cnf by setting the "log-error" option
     3 # in either [mysqld] or [mysqld_safe] section as
     4 # follows:
     5 #
     6 # [mysqld]
     7 # log-error=/usr/local/mysql/data/mysqld.log
     8 #
     9 # In case the root user has a password, then you
    10 # have to create a /root/.my.cnf configuration file
    11 # with the following content:
    12 #
    13 # [mysqladmin]
    14 # password = <secret> 
    15 # user= root
    16 #
    17 # where "<secret>" is the password. 
    18 #
    19 # ATTENTION: The /root/.my.cnf file should be readable
    20 # _ONLY_ by root !
    21 
    22 /usr/local/mysql/data/mysqld.log {
    23         # create 600 mysql mysql
    24         notifempty
    25         daily
    26         rotate 5
    27         missingok
    28         compress
    29     postrotate
    30         # just if mysqld is really running
    31         if test -x /usr/local/mysql/bin/mysqladmin && 
    32            /usr/local/mysql/bin/mysqladmin ping &>/dev/null
    33         then
    34            /usr/local/mysql/bin/mysqladmin flush-logs
    35         fi
    36     endscript
    View Code

    参照上边的根据自己的具体情况来写err.log的,也可以用上边的

     1 mysqladmin根据实际路径来写,其他参数自行添加
     2 /data/mysql/log/errt.log {  
     3         create 600 mysql mysql  
     4         notifempty  
     5         daily  
     6         rotate 7  
     7         missingok  
     8         # compress  
     9     postrotate  
    10         # just if mysqld is really running  
    11         if test -x /opt/mysql/bin/mysqladmin &&   
    12            /opt/mysql/bin/mysqladmin ping &>/dev/null  
    13         then  
    14            /opt/mysql/bin/mysqladmin flush-logs  
    15         fi  
    16     endscript  
    17 } 

     php日志

     1 /var/log/php-fpm/*log {
     2     rotate  10
     3     missingok
     4     notifempty
     5     dateext
     6     sharedscripts
     7     delaycompress
     8     olddir  /data/backup/php_log/
     9     create 0664 www www
    10     postrotate
    11         /bin/kill -SIGUSR1 `cat /var/run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true
    12     endscript
    13 }

     tomcat日志

    # cat /etc/logrotate.d/tomcat
    /usr/local/tomcat/logs/catalina.out {
    daily
    rotate 5
    missingok
    dateext
    compress
    notifempty
    copytruncate
    }

    测试

    logrotate --force /etc/logrotate.d/tomcat  立即截断

    参考:https://linux.cn/article-4126-1.html

    http://www.ywnds.com/?p=5471

    https://jin-yang.github.io/post/logrotate-usage.html

    https://zhuanlan.zhihu.com/p/24880144

  • 相关阅读:
    元素的ID和Name有什么区别???[转自"天道酬勤"]
    招聘时会问到的问题
    关于asp.net开发B/S应用系统的思索和讨论
    软件文档知多少?
    C# 编码规范和编程好习惯
    [转]多层结构来开发ASP.NET程序
    ASP.NET页面间的传值的几种方法
    为sql server 表数据生成创建的储存过程(生成insert 脚本)
    XHTML+CSS应用教程——利用CSS实现双语导航条
    XHTML+CSS应用教程——CSS实现文字的双影
  • 原文地址:https://www.cnblogs.com/Dicky-Zhang/p/7993100.html
Copyright © 2020-2023  润新知