精华内容
下载资源
问答
  • 日志滚动Linux 系统上是再常见不过的一个功能了,它为系统监控和故障排查保留必要的日志内容,同时又防止过多的日志造成单个日志文件太大。-- Sandra Henry-stocker(作者)日志滚动的过程是这样的:在一组日志...

    b5e0ca23901d472d77837f1c9cfb2534.png
    日志滚动在 Linux 系统上是再常见不过的一个功能了,它为系统监控和故障排查保留必要的日志内容,同时又防止过多的日志造成单个日志文件太大。
    -- Sandra Henry-stocker(作者)

    日志滚动的过程是这样的:在一组日志文件之中,编号最大的(最旧的)一个日志文件会被删除,其余的日志文件编号则依次增大并取代较旧的日志文件,而较新的文件则取代它作为当前的日志文件。这一个过程很容易就可以实现自动化,在细节上还能按需作出微调。

    使用 logrotate 命令可以手动执行日志滚动的操作。本文将要介绍的就是手动进行日志滚动的方法,以及预期产生的结果。

    文中出现的示例适用于 Ubuntu 等 Linux 系统,对于其它类型的系统,日志文件和配置文件可能会有所不同,但日志滚动的过程是大同小异的。

    为什么需要滚动日志

    一般情况下,无需手动旋转日志文件。Linux 系统会每隔一天(或间隔更长的时间)或根据日志文件的大小自动进行一次日志滚动。如果你需要滚动日志以释放存储空间,又或者将某一部分日志从当前的活动中分割出来,这很容易做到,具体要取决于文件滚动规则。

    一点背景介绍

    在 Linux 系统安装完成后就已经有很多日志文件被纳入到日志滚动的范围内了。另外,一些应用程序在安装时也会为自己产生的日志文件设置滚动规则。一般来说,日志滚动的配置文件会放置在 /etc/logrotate.d。如果你想了解日志滚动的详细实现,可以参考这篇以前的文章。

    在日志滚动的过程中,活动日志会以一个新名称命名,例如 log.1,之前被命名为 log.1 的文件则会被重命名为 log.2,依此类推。在这一组文件中,最旧的日志文件(假如名为 log.7)会从系统中删除。日志滚动时文件的命名方式、保留日志文件的数量等参数是由 /etc/logrotate.d 目录中的配置文件决定的,因此你可能会看到有些日志文件只保留少数几次滚动,而有些日志文件的滚动次数会到 7 次或更多。

    例如 syslog 在经过日志滚动之后可能会如下所示(注意,行尾的注释部分只是说明滚动过程是如何对文件名产生影响的):

    $ ls -l /var/log/syslog*
    -rw-r----- 1 syslog adm  128674 Mar 10 08:00 /var/log/syslog      <== 新文件
    -rw-r----- 1 syslog adm 2405968 Mar  9 16:09 /var/log/syslog.1    <== 之前的 syslog
    -rw-r----- 1 syslog adm  206451 Mar  9 00:00 /var/log/syslog.2.gz <== 之前的 syslog.1
    -rw-r----- 1 syslog adm  216852 Mar  8 00:00 /var/log/syslog.3.gz <== 之前的 syslog.2.gz
    -rw-r----- 1 syslog adm  212889 Mar  7 00:00 /var/log/syslog.4.gz <== 之前的 syslog.3.gz
    -rw-r----- 1 syslog adm  219106 Mar  6 00:00 /var/log/syslog.5.gz <== 之前的 syslog.4.gz
    -rw-r----- 1 syslog adm  218596 Mar  5 00:00 /var/log/syslog.6.gz <== 之前的 syslog.5.gz
    -rw-r----- 1 syslog adm  211074 Mar  4 00:00 /var/log/syslog.7.gz <== 之前的 syslog.6.gz

    你可能会发现,除了当前活动的日志和最新一次滚动的日志文件之外,其余的文件都已经被压缩以节省存储空间。这样设计的原因是大部分系统管理员都只需要查阅最新的日志文件,其余的日志文件压缩起来,需要的时候可以解压查阅,这是一个很好的折中方案。

    手动日志滚动

    你可以这样执行 logrotate 命令进行手动日志滚动:

    $ sudo logrotate -f /etc/logrotate.d/rsyslog

    值得一提的是,logrotate 命令使用 /etc/logrotate.d/rsyslog 这个配置文件,并通过了 -f 参数实行“强制滚动”。因此,整个过程将会是:

    • 删除 syslog.7.gz
    • 将原来的 syslog.6.gz 命名为 syslog.7.gz
    • 将原来的 syslog.5.gz 命名为 syslog.6.gz
    • 将原来的 syslog.4.gz 命名为 syslog.5.gz
    • 将原来的 syslog.3.gz 命名为 syslog.4.gz
    • 将原来的 syslog.2.gz 命名为 syslog.3.gz
    • 将原来的 syslog.1.gz 命名为 syslog.2.gz
    • 但新的 syslog 文件不一定必须创建。

    你可以按照下面的几条命令执行操作,以确保文件的属主和权限正确:

    $ sudo touch /var/log/syslog
    $ sudo chown syslog:adm /var/log/syslog
    $ sudo chmod 640 /var/log/syslog

    你也可以把以下这一行内容添加到 /etc/logrotate.d/rsyslog 当中,由 logrotate 来帮你完成上面三条命令的操作:

    create 0640 syslog adm

    整个配置文件的内容是这样的:

    /var/log/syslog
    {
    rotate 7
    daily
    missingok
    notifempty
    create 0640 syslog adm           <==
    delaycompress
    compress
    postrotate
    /usr/lib/rsyslog/rsyslog-rotate
    endscript
    }

    下面是手动滚动记录用户登录信息的 wtmp 日志的示例。由于 /etc/logrotate.d/wtmp 中有 rotate 2 的配置,因此系统中只保留了两份 wtmp 日志文件。

    滚动前:

    $ ls -l wtmp*
    -rw-r----- 1 root utmp  1152 Mar 12 11:49 wtmp
    -rw-r----- 1 root utmp   768 Mar 11 17:04 wtmp.1

    执行滚动命令:

    $ sudo logrotate -f /etc/logrotate.d/wtmp

    滚动后:

    $ ls -l /var/log/wtmp*
    -rw-r----- 1 root utmp     0 Mar 12 11:52 /var/log/wtmp
    -rw-r----- 1 root utmp  1152 Mar 12 11:49 /var/log/wtmp.1
    -rw-r----- 1 root adm  99726 Feb 21 07:46 /var/log/wtmp.report

    需要知道的是,无论发生的日志滚动是自动滚动还是手动滚动,最近一次的滚动时间都会记录在 logrorate 的状态文件中。

    $ grep wtmp /var/lib/logrotate/status
    "/var/log/wtmp" 2020-3-12-11:52:57

    展开全文
  • 在很多实际项目中,应用程序会持续写日志,如果程序代码中没有调用支持自动切分(如按filesize或date切割)的日志库,则日志文件会很快增长到G级别。单机操作大文件对后续跟进日志来说非常不方便。 本文介绍如何...

    在很多实际项目中,应用程序会持续写日志,如果程序代码中没有调用支持自动切分(如按filesize或date切割)的日志库,则日志文件会很快增长到G级别。单机操作大文件对后续跟进日志来说非常不方便。

    本文介绍如何利用logrotate这个工具来在应用程序外部切分日志。

    1. logrotate是什么
    logrotate是大多数linux系统自带的日志切割工具,在shell终端输入"man logrotate"可查看其简介(部分摘出如下):
    logrotate is designed to ease administration of systems that generate large numbers of log files. It allows automatic rotation, compression, removal, and mailing of log files. Each log file may be handled daily, weekly, monthly, or when it grows too large.
    更完整的简介可以在shell终端查看其man文档,这里不赘述。
    总之,我们知道它可以用来切割仍在滚动的日志文件即可,这里的“仍在滚动”是指当前日志文件仍在被应用程序持续进行追加写操作。

    2. logrotate的适用场景
    如果文件是静态的(即当前没有应用程序对齐进行写操作),则split是更常用的静态文件切割工具,其用法简介见这里,此处略过。
    logrotate常用来切割仍在被写的“动态”文件,它支持按时间间隔或文件大小来触发文件的自动切分(automatic rotation)。具体用法下面说明。

    3. 如何使用logrotate
    根据man logrotate的说明,logrotate用法很简单:
    logrotate [-dv] [-f|--force] [-s|--state file] config_file+
    其中[]中出现的option(s)均是可选项,我们只需提供一份配置文件即可,下面用示例对配置文件格式做说明。
    # sample logrotate configuration file
    compress # 全局配置项,对切分后的文件做gzip压缩
          
    # 一个配置文件中可以包含多个相互独立的sections
    # 其中,待切分文件路径 + { xxx }构成了一个独立的section,每个section可以配置针对该类文件的切分行为
    # 注意:全局配置项会作用于每个section,除非在该section配置中覆盖了全局配置项的行为 
     
    # 下面section的配置表明按时间间隔(weekly)触发日志的自动切分,历史数据只保存最近的5份
    # 切分完成后,通过发送-HUP信号来重启syslogd这个daemon进程。
    /var/log/messages {  
        rotate 5  
        weekly
        postrotate
            /sbin/killall -HUP syslogd
        endscript
    }
           
    # 下面的示例section表明按文件大小触发日志自动切分,大小单位除了上面所示的k外,还可以是M或G
    # 待切分文件路径可以有多个,多个路径用空格隔开
    "/var/log/httpd/access.log" /var/log/httpd/error.log {
        rotate 5
        mail www@my.org
        size=100k
        sharedscripts # 表明HUP信号只需在所有文件均切分完成后发送一次,若无该配置,则每完成一个文件的切分就会执行一次postrotate/endscript之间配置的命令
        postrotate
            /sbin/killall -HUP httpd
        endscript
    }
           
    # 下面的示例section表明按时间(monthly)触发切分
    # 切分后的历史文件会被保存到olddir指定的目录下(该目录需要事先mkdir出来,否则会报错)
    /var/log/news/news.crit {
        monthly
        rotate 2
        olddir /var/log/news/old
        missingok # 若section起始处指定的待切分文件不存在,也不会报错(默认会报错)
        postrotate
            kill -HUP 'cat /var/run/inn.pid'
        endscript
        nocompress # 切分时不做压缩,这里改写了配置文件第1行的全局配置
    }
    上述配置文件中,"#"表示后面是注释,它可以独占一行,也可以与配置项在同一行。
    配置项"rotate 5"表明切分后的历史文件最多保存最近的5份,若触发本次切分时已有5份历史文件(默认为messages.1/messages.2/messages.3/messages.4/messages.5),则文件messages.5会被物理删除,剩余文件后缀序号依次加1。
    切分的具体执行过程可以参考《鸟哥的Linux私房菜》在这里的说明。
    上面的示例配置文件只是展示了logrotate配置文件的基本格式,该工具还支持其它众多配置项,具体可以参考man logrotate的说明。
    下面的配置文件说明了在实际项目中如何按文件大小对不允许restart的应用程序进行日志自动切分。
     # filename: logrotate.conf
     /home/work/running.log {
        copytruncate # 先copy running.log内容至历史文件,然后清空running.log的内容
        rotate 30    # 保存30份历史日志 
        size=1G      # 若日志文件达到1G,则触发切分
        olddir /home/work/history # 指定历史日志存放目录
        notifempty   # 若/home/work/running.log是空文件,则不做切分
        missingok    # 若/home/work/running.log不存在,不报错
    }
    特别注意copytruncate这个配置项,根据其文档说明(见下面的摘录),它可能会导致部分数据丢失,在不允许日志数据丢失的应用场景下,不应该使用该配置(若日志不允许丢失,则最好在应用程序代码中支持HUP信号来实现优雅重启,这样就可以避免使用copytruncate;当然,也可以用logrotate支持的create配置来达到目的)。
    copytruncate
        Truncate  the  original  log file in place after creating a copy, instead of moving the old log file and optionally creating a new one, It can be used when some program can not be told to close its logfile and thus might continue writing (appending) to the previous log file forever.  Note that there is a very small time slice between copying the file and truncating it, so some logging data might be lost.  When this option is used, the create option will have no effect, as the old log file stays in place.

    【参考资料】
    1. man logrotate
    2. 鳥哥的Linux私房菜 - 登錄檔的輪替(logrotate) 

    ====================== EOF ===================


    展开全文
  • 截至到redis-5.0版本,redis仍然不会自动滚动日志文件,如果不处理则日志文件日积月累越来越大,最终将导致磁盘满告警: #ls-lh total12G -rw-r--r--1redisredis8.5GFeb1810:26redis-6379.log -rw-r--r-...

    截至到redis-5.0版本,redis仍然不会自动滚动日志文件,如果不处理则日志文件日积月累越来越大,最终将导致磁盘满告警:

    # ls -lh

    total 12G

    -rw-r--r-- 1 redis redis 8.5G Feb 18 10:26 redis-6379.log

    -rw-r--r-- 1 redis redis 1.5G Feb 18 10:26 redis-6380.log

    -rw-r--r-- 1 redis redis 2.0G Feb 18 10:26 redis-6381.log

     

    查看redis的源代码,可发现每次写日志均是先fopenfprintf,实现十分简单,毫无日志滚动逻辑:

    // server.c

    void serverLogRaw(int level, const char *msg)

    {

        FILE *fp;

        。。。。。。

        fp = log_to_stdout? stdout: fopen(server.logfile,"a");

        if (!fp) return;

        。。。。。。

        fflush(fp);

        if (!log_to_stdout) fclose(fp);

        if (server.syslog_enabled)

            syslog(syslogLevelMap[level], "%s", msg);

    }

     

    显然,这是redis运维需要解决的。最易想到的是自己写脚本滚动日志,比如直接利用日志滚动脚本工具log_rotater.sh。不过这里更推荐Linux系统自带的日志滚动工具logrotate

    # which logrotate

    /usr/sbin/logrotate

    # which rsyslogd

    /usr/sbin/rsyslogd

     

    Linux系统自带的日志滚动工具logrotate由两部分组成:一是命令行工具logrotate,二是后台服务rsyslogd

    使用rsyslogd,只需简单的配置即可实现日志滚动。rsyslogd的配置文件为/etc/logrotate.conf,但一般不建议直接修改logrotate.conf,而是在目录/etc/logrotate.d下新增文件的方式。logrotate.confinclude所有logrotate.d目录下的文件,语法是一致的,区别是logrotate.conf定义了默认的配置,而logrotate.d目录下为专有配置。

     

    下列为redis的配置示例:

    # cat /etc/logrotate.d/redis

    /usr/local/redis/log/redis-6379.log

    /usr/local/redis/log/redis-6380.log

    /usr/local/redis/log/redis-6381.log

    {

        rotate 2

        minsize 100M

        nocompress

        missingok

        create 0664 redis redis

        notifempty

    }

     

    配置项说明:

    1) rotate指定日志文件备份数,如果值为0表示不备份

    2) minsize表示日志文件达到多大才滚动

    3) nocompress表示是否压缩备份的日志文件

    4) missingok如果日志丢失,不报错继续滚动下一个日志

    5) notifempty日志文件为空时,不进行轮转,默认值为ifempty

    6) create指定创建新日志文件的属性,logrotate是以root运行的,如果目标日志文件非root运行,则这个一定要指定好。

     

    有关logrotate的详细使用,请参考logrotate资料,本文不过多描述。

     

    注意,修改后需要重启下rsyslogd。如果是CentOS可使用下列任意一种方式重启(实际上systemctl新方式,而service实际也是使用systemctl):

    # service rsyslog restart 

    # systemctl restart  rsyslog.service

    转载于:https://www.cnblogs.com/aquester/p/10394314.html

    展开全文
  • linux log rotation日志滚动详解

    千次阅读 2020-03-27 01:02:12
    Linux 系统会每隔一天(或间隔更长的时间)或根据日志文件的大小自动进行一次日志滚动。如果你需要滚动日志以释放存储空间,又或者将某一部分日志从当前的活动中分割出来,这很容易做到,具体要取决于文件滚动规则 ...

    为什么需要滚动日志

    一般情况下,无需手动旋转日志文件。Linux 系统会每隔一天(或间隔更长的时间)或根据日志文件的大小自动进行一次日志滚动。如果你需要滚动日志以释放存储空间,又或者将某一部分日志从当前的活动中分割出来,这很容易做到,具体要取决于文件滚动规则

    日志滚动过程

    日志滚动的过程是这样的:在一组日志文件之中,编号最大的(最旧的)一个日志文件会被删除,其余的日志文件编号则依次增大并取代较旧的日志文件,而较新的文件则取代它作为当前的日志文件。这一个过程很容易就可以实现自动化,在细节上还能按需作出微调。

    日志滚动背景介绍

    在 Linux 系统安装完成后就已经有很多日志文件被纳入到日志滚动的范围内了。另外,一些应用程序在安装时也会为自己产生的日志文件设置滚动规则。一般来说,日志滚动的配置文件会放置在 /etc/logrotate.d

    在日志滚动的过程中,活动日志会以一个新名称命名,例如 log.1,之前被命名为 log.1 的文件则会被重命名为 log.2,依此类推。在这一组文件中,最旧的日志文件(假如名为 log.7)会从系统中删除。**日志滚动时文件的命名方式、保留日志文件的数量等参数是由 /etc/logrotate.d 目录中的配置文件决定的,**因此你可能会看到有些日志文件只保留少数几次滚动,而有些日志文件的滚动次数会到 7 次或更多。

    例如 syslog 在经过日志滚动之后可能会如下所示(注意,行尾的注释部分只是说明滚动过程是如何对文件名产生影响的):

    $ ls -l /var/log/syslog*
    -rw-r----- 1 syslog adm  128674 Mar 10 08:00 /var/log/syslog      <== 新文件
    -rw-r----- 1 syslog adm 2405968 Mar  9 16:09 /var/log/syslog.1    <== 之前的 syslog
    -rw-r----- 1 syslog adm  206451 Mar  9 00:00 /var/log/syslog.2.gz <== 之前的 syslog.1
    -rw-r----- 1 syslog adm  216852 Mar  8 00:00 /var/log/syslog.3.gz <== 之前的 syslog.2.gz
    -rw-r----- 1 syslog adm  212889 Mar  7 00:00 /var/log/syslog.4.gz <== 之前的 syslog.3.gz
    -rw-r----- 1 syslog adm  219106 Mar  6 00:00 /var/log/syslog.5.gz <== 之前的 syslog.4.gz
    -rw-r----- 1 syslog adm  218596 Mar  5 00:00 /var/log/syslog.6.gz <== 之前的 syslog.5.gz
    -rw-r----- 1 syslog adm  211074 Mar  4 00:00 /var/log/syslog.7.gz <== 之前的 syslog.6.gz
    

    你可能会发现,除了当前活动的日志和最新一次滚动的日志文件之外,其余的文件都已经被压缩以节省存储空间。这样设计的原因是大部分系统管理员都只需要查阅最新的日志文件,其余的日志文件压缩起来,需要的时候可以解压查阅,这是一个很好的折中方案。

    日志滚动工具logrotate

    logrotate命令用于对系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱。使用logrotate指令,可让你轻松管理系统所产生的记录文件。每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在/etc/logrotate.conf文件中。

    logrotate(选项)(参数)
    选项

    -?或--help:在线帮助;
    -d或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况;
    -f或--force :强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然;
    -s<状态文件>或--state=<状态文件>:使用指定的状态文件;
    -v或--version:显示指令执行过程;
    -usage:显示指令基本用法。
    

    logrotate参数

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

    logrotate配置文件位置

    Linux系统默认安装logrotate工具,它默认的配置文件在:

    /etc/logrotate.conf
    /etc/logrotate.d/
    

    logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。
    另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。
    实际运行时,Logrotate会调用配置文件/etc/logrotate.conf。
    可以在/etc/logrotate.d目录里放置自定义好的配置文件,用来覆盖Logrotate的缺省值。

    定时轮循机制

    Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。
    logrotate这个任务默认放在cron的每日定时任务cron.daily下面 /etc/cron.daily/logrotate
    /etc/目录下面还有cron.weekly/, cron.hourly/, cron.monthly/ 的目录都是可以放定时任务的

    $ cat /etc/cron.daily/logrotate 
    #!/bin/sh
    
    /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
    EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit 0
    

    实际运行时,Logrotate会调用配置文件/etc/logrotate.conf

    $ cat /etc/logrotate.conf
    # 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
    #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
    	minsize 1M
        rotate 1
    }
    
    /var/log/btmp {
        missingok
        monthly
        create 0600 root utmp
        rotate 1
    }
    
    # system-specific logs may be also be configured here.
    

    这里的设置可以理解为Logrotate的缺省值,当然了,可以我们在/etc/logrotate.d目录里放置自己的配置文件,用来覆盖Logrotate的缺省值
    nginx 常用日志切割配置

    $ cat /etc/logrotate.d/nginx
    /data/log/nginx/*.log /data/log/nginx/*/*.log { # 对匹配上的日志文件进行切割
    
        weekly # 每周切割
    
        missingok     # 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
    
        rotate 6      # 保留 6 个备份
    
        compress     # 压缩
    
        delaycompress    # delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
    
        notifempty     # 如果是空文件的话,不转储
    
        create 0644 www-data ymserver     # mode owner group 转储文件,使用指定的文件模式创建新的日志文件
    
        sharedscripts # 下面详细说
    
        prerotate # 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
    
            if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
    
                run-parts /etc/logrotate.d/httpd-prerotate; \
    
            fi \
    
        endscript
    
        postrotate  # 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
    
            [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    
        endscript
    
        su root ymserver # 轮训日志时切换设置的用户/用户组来执行(默认是root),如果设置的user/group 没有权限去让文件容用 create 选项指定的拥有者 ,会触发错误。
    
    }
    

    如果要配置一个每日0点执行切割任务,怎么做到?我们的logrotate默认每天执行时间已经写到了/etc/cron.daily/目录下面,而这个目录下面的任务执行时间上面也说了,在/etc/crontab里面定义了时6:25。我之前就有个这样的需求,看看下面的配置

    /data/log/owan_web/chn_download_stat/chn_app_rec.log {
    
        copytruncate
    
        # weekly 注释了 但是会继承/etc/logrorate.conf的全局变量,也是weekly
    
        missingok
    
        rotate 10
    
        compress
    
        delaycompress
    
        size=1000M # 大小到达size开始转存
    
        notifempty
    
        create 664 www-data ymserver
    
        su root
    
        dateext       //这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
    
        compress      //是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行
    
    }
    

    然后去root的crontab配置一个0点执行的任务

    $ cat /etc/crontab
    wwwadm@host:/etc/logrotate.d$ sudo crontab -l -u root
    
    0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/web_roteate -fv  >/tmp/logro.log 2>&1
    

    因为logrotate的切割周期是weekly,每次切割都是根据上一个切割的时间来进行,如果距离上一次有一周时间,就会切割,但是我们设置了crontab的每天切割,既不会进入/etc/cron.daily/的每日切割,也不会每周切割。这样就能完美定制自己想要的切割日志时间

    值得注意的一个配置是:copytruncate

    copytruncate 如果没有这个选项的话,操作方式:是将原log日志文件,移动成类似log.1的旧文件, 然后创建一个新的文件。 如果设置了,操作方式:拷贝原日志文件,并且将其变成大小为0的文件。

    区别是如果进程,比如nginx 使用了一个文件写日志,没有copytruncate的话,切割日志时, 把旧日志log->log.1 ,然后创建新日志log。这时候nginx 打开的文件描述符依然时log.1,由没有信号通知nginx 要换日志描述符,所以它会继续向log.1写日志,这样就不符合我们的要求了。 因为我们想切割日志后,nginx 自动会向新的log 文件写日志,而不是旧的log.1文件

    解决方法有两个:

    1.向上面的nginx 切割日志配置,在postrotate里面写个脚本

    postrotate # 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行

    [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    
    endscript
    

    这样就是发信号给nginx ,让nginx 关闭旧日志文件描述符,重新打开新的日志文件描述,并写入日志

    2.使用copytruncate参数,向上面说的,配置了它以后,操作方式是把log 复制一份 成为log.1,然后清空log的内容,使大小为0,那此时log依然时原来的旧log,对进程(nginx)来说,依然打开的是原来的文件描述符,可以继续往里面写日志,而不用发送信号给nginx

    copytruncate这种方式操作的时候, 拷贝和清空之间有一个时间差,可能会丢失部分日志数据。

    nocopytruncate 备份日志文件不过不截断。

    手动日志滚动

    $ sudo logrotate -f /etc/logrotate.d/rsyslog
    

    值得一提的是,logrotate 命令使用 /etc/logrotate.d/rsyslog 这个配置文件,并通过了 -f 参数实行“强制滚动”。因此,整个过程将会是:

    ◈ 删除 syslog.7.gz,
    ◈ 将原来的 syslog.6.gz 命名为 syslog.7.gz,
    ◈ 将原来的 syslog.5.gz 命名为 syslog.6.gz,
    ◈ 将原来的 syslog.4.gz 命名为 syslog.5.gz,
    ◈ 将原来的 syslog.3.gz 命名为 syslog.4.gz,
    ◈ 将原来的 syslog.2.gz 命名为 syslog.3.gz,
    ◈ 将原来的 syslog.1.gz 命名为 syslog.2.gz,
    ◈ 但新的 syslog 文件不一定必须创建。
    你可以按照下面的几条命令执行操作,以确保文件的属主和权限正确:

    $ sudo touch /var/log/syslog
    $ sudo chown syslog:adm /var/log/syslog
    $ sudo chmod 640 /var/log/syslog
    

    你也可以把以下这一行内容添加到 /etc/logrotate.d/rsyslog 当中,由 logrotate 来帮你完成上面三条命令的操作:create 0640 syslog adm

    
    /var/log/syslog
    {
    rotate 7
    daily
    missingok
    notifempty
    create 0640 syslog adm           <==
    delaycompress
    compress
    postrotate
    /usr/lib/rsyslog/rsyslog-rotate
    endscript
    }
    

    下面是手动滚动记录用户登录信息的 wtmp 日志的示例。由于 /etc/logrotate.d/wtmp 中有 rotate 2 的配置,因此系统中只保留了两份 wtmp 日志文件。

    滚动前:

    $ ls -l wtmp*
    -rw-r----- 1 root utmp  1152 Mar 12 11:49 wtmp
    -rw-r----- 1 root utmp   768 Mar 11 17:04 wtmp.1
    

    执行滚动命令:

    $ sudo logrotate -f /etc/logrotate.d/wtmp
    

    滚动后:

    $ ls -l /var/log/wtmp*
    -rw-r----- 1 root utmp     0 Mar 12 11:52 /var/log/wtmp
    -rw-r----- 1 root utmp  1152 Mar 12 11:49 /var/log/wtmp.1
    -rw-r----- 1 root adm  99726 Feb 21 07:46 /var/log/wtmp.report
    

    需要知道的是,无论发生的日志滚动是自动滚动还是手动滚动,最近一次的滚动时间都会记录在 logrorate 的状态文件中。

    $ grep wtmp /var/lib/logrotate/status
    "/var/log/wtmp" 2020-3-12-11:52:57
    

    参考链接:
    https://www.cnblogs.com/276815076/p/7053640.html
    https://www.networkworld.com/article/3531969/manually-rotating-log-files-on-linux.html

    展开全文
  • 日志滚动log rotation在 Linux 系统上是再常见不过的一个功能了,它为系统监控和故障排查保留必要的日志内容,同时又防止过多的日志造成单个日志文件太大。 日志滚动的过程是这样的:在一组日志文件之中,编号最大的...
  • 如何利用logrotate工具自动切分滚动中的日志文件 在很多实际项目中,应用程序会持续写日志,如果程序代码中没有调用支持自动切分(如按filesize或date切割)的日志库,则日志文件会很快增长到G级别。单机操作大文件...
  • 可以使用”logrotate”来管理linux日志文件,它可以实现日志的自动滚动,日志归档等功能。 下面是nginx日志的lograte处理方式,本例中的截图的nginx日志指向到/mnt/nginx/logs/目录下。 lograte服务配置如下: 1、在...
  • 一:. df -h 查看硬盘剩余空间 size 是 硬盘的总容量,used 已用硬盘容量,avial 硬盘剩余容量,mounted on 硬盘...tmpfs 是临时文件存放地方,开机重启会自动清除 二:tail -f 滚动查看日志 退出ctrl+c ...
  • linux下的日志会定期进行滚动增加,我们可以在线对正在进行回滚的日志进行指定大小的切割(动态),如果这个日志是静态的。比如没有应用向里面写内容。那么我们也可以用split工具进行切割;其中Logrotate支持按...
  • 我们可以使用"logrotate"来管理linux日志文件,它可以实现日志的自动滚动,日志归档等功能。下面以nginx日志文件来讲解下logrotate的用法。 配置: 1、在/etc/logrotate.d目录下创建一个nginx的配置文件"nginx...
  • linux命令历史和 Tab 自动补全

    千次阅读 2014-04-20 19:54:07
    通过使用 [向上箭头] 和 [向下箭头] 键来上下滚动,你会发现许多前面已经键入过的命令。 我们可以再在 sneakers.txt (在 第 13.9.1 节 中创建的)文件中试验一下。不过,第一次,让我们在 shell 提示下键入: ...
  • Linux命令

    2019-05-10 16:37:01
    tab 自动匹配输入内容 ctrl c 回到命令行 tail -f 文件名 滚动查看文件内容 tail -n 20 文件名 查看文件内容后20行 kill -9 pid 杀掉某个pid的进程 ps -ef|grep ...
  • linux下的日志会定期进行滚动增加,我们可以在线对正在进行回滚的日志进行指定大小的切割(动态),如果这个日志是静态的。比如没有应用向里面写内容。那么我们也可以用split工具进行切割;其中Logrotate支持按时间...
  • shell实现日志滚动

    千次阅读 2018-01-26 14:51:29
    什么是日志滚动? 在日常linux的操作中,经常...linux发行版中也默认安装了logrotate这款上古神器来管理日志,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。 但是这里并不想去过多介绍logrotate这
  • 如何设置nginx日志滚动?...logrotate是linux内置的工具,其作用在于简化日志的管理,能够实现日志的自动滚动,可以支持定时滚动和按大小滚动 logrotate的命令格式如下 logrotate [-dv] [-f|--force]
  • Linux系统日志

    2018-05-17 09:18:53
    /var/log/messages 是linux系统总日志,系统中存有一个日志切割机制,日志的滚动,在增长到一定级别了,就会自动切割日志文件,防止它无限制的增加/etc/logrotate.conf //日志切割配置文件 #cat /etc/logrotate.conf...
  • Linux常用命令

    2019-10-26 20:53:25
    Linux下的快捷键 历史命令向上 / 下滚动: ctrl + p / n 删除光标后 / 前边的字符: ctrl + d / h 跳到行首: ctrl + a 跳到行尾: ctrl + e 目录结构: / :根目录 /bin :二进制命令 /dev:设备文件 /ect:安装...
  • linux学习笔记(一)

    2020-12-18 19:48:05
    linux学习笔记(一)命令解析器快捷键目录结构文件和目录操作 命令解析器 shell– unix操作系统 bash –Linux操作系统 本质:根据命令的名字,调用对应的可执行程序 快捷键 ctrl+p 向上滚动历史命令 ctrl+n 向下滚动...
  • BareTail 动态的查看日志文件,就像Linux上的tail tail -f nohup.out 功能: 实时文件查看 tail命令模式,自动滚动 支持2g以上大文件 自动滚动 彩色监控 多文件监控 支持unicode和UTF-8 支持Win32...
  • Linux服务器上我们用Logrotate来分割归档日志文件,结合crond我们可以指定每天在某个时间自动整理日志等文档。本文主要说明了Centos下Logrotate的使用和配置的方法。 配置文件 Logrotate的配置文件位于/etc/...
  • Linux自学笔记2

    2019-05-21 17:56:18
    less [option] filename less读文件 space: page down b(back) : page up g : go to the top of the file G : go to the bottom of the file 回车键 :向下滚动一行 ... -e 当文件显示结束后,自动离开 ...
  • linux基本命令less

    2019-04-12 22:21:42
    用途:文件过滤分页显示到屏幕 less格式: less [option] [file] ... [option]: -bn,--buffer=n: 设置缓冲区大小 n表示缓冲区的大小(单位1024Byte) 默认64k, -1表示没有限制 -c, --clear-screen: 全屏重绘 而不是...
  • 23.3.1 Linux文件系统概述 23.3.2 设备文件 23.3.3 /etc/mknod命令 23.3.4 安全考虑 23.3.5 find命令 23.3.6 secure程序 23.3.7 ncheck命令 23.3.8 安装和拆卸文件系统 23.3.9 系统目录和文件 23.4 作为root运行的...
  • 我们可以使用"logrotate"来管理linux日志文件,它可以实现日志的自动滚动,日志归档等功能。下面以nginx日志文件来讲解下logrotate的用法。配置:1、在/etc/logrotate.d目录下创建一个nginx的配置文件"ngi...

空空如也

空空如也

1 2 3 4 5 6
收藏数 117
精华内容 46
关键字:

linux文件自动滚动

linux 订阅