【问题标题】:How to exclude ".gz" files in logrotate如何在 logrotate 中排除“.gz”文件
【发布时间】:2018-08-13 06:35:20
【问题描述】:

我使用的是logrotate 3.12.3 版。如何告诉logrotate 排除已旋转/压缩的文件?

例如,如果我将/var/log 中的所有文件旋转为

"/var/log/*" {
   compress
   missingok
   dateext
   rotate 4
   size=5000k
}

压缩文件后,如何告诉logrotate 不要旋转已旋转/压缩的文件?例如:

/var/log/file1

logrotation 后变成

/var/log/file1.20211212.gz

我试过了

tabooext + .gz

在定义之上,但它似乎没有生效。

来自man logrotate

包含文件或目录

读取作为参数给出的文件,就好像它被包含在包含指令出现的地方一样。如果给定目录, 里面的大部分文件 在继续处理包含文件之前,按字母顺序读取目录。唯一被忽略的文件是 不规则文件 文件(例如目录和命名管道)和名称以禁忌扩展名之一结尾的文件,如 tabooext 指令。

如果像下面这样工作,那就太好了。

/var/log/*[!".gz"] {
}

谢谢。

编辑

也许做一些类似的事情

/var/log/*[!.][!g][!z] {
..
}

但它会跳过名为 /var/log/test1gz 的文件。如何将. 字符与通配符匹配?

【问题讨论】:

    标签: linux gzip logrotate


    【解决方案1】:

    尝试找出所有不接受*.gz 的全局可能性。因为您有三个字母(.gz),所以有 2^3 = 8 可能的组合(3 个字符,2 个状态 x!x),减去一个是 *.gz

    其他七种可能性如下:

    • 所有没有扩展点为倒数第三但以gz 结尾的文件(例如filegz

      /var/log/*[!.]gz
      
    • 所有两个字母扩展名不是以g 开头但以z 结尾的文件(例如file.7z

      /var/log/*.[!g]z
      
    • 所有两个字母扩展名以g 开头但不以z 结尾的文件(例如file.gg

      /var/log/*.g[!z]
      
    • 所有不以.gz 结尾但以z 结尾的文件(例如file.ezz

      /var/log/*[!.][!g]z
      
    • 所有不以.gz 结尾但以g 作为倒数第二个字母的文件(例如file.cgi

      /var/log/*[!.]g[!z]
      
    • 所有两个字母扩展名不是gz的文件(例如file.hh

      /var/log/*.[!g][!z]
      
    • 最后,所有未在.gz 之前完成的文件(例如file.txt

      /var/log/*[!.][!g][!z]
      

    所以这给了我们:

    /var/log/*[!.]gz
    /var/log/*.[!g]z
    /var/log/*.g[!z]
    /var/log/*[!.][!g]z
    /var/log/*[!.]g[!z]
    /var/log/*.[!g][!z]
    /var/log/*[!.][!g][!z]
    {
      ...
    

    可以用python生成组合:

    import itertools as it
    
    suffix = '.gz'
    states = ([x, '![%c]' % x] for x in suffix)
    for res in it.product(*states):
        print ''.join(res)
    

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      您无需指定完整的文件夹。您也可以定义一个文件。因此,首先您应该为每个服务创建子文件夹,以便更好地了解。您可以在那里放置您的日志。您不应该将它放在完整的日志文件夹中,因为还有一些旋转脚本。

      例如:

      /var/log/yum.log {
          missingok
          notifempty
          size 30k
          yearly
          create 0600 root root
      }
      

      【讨论】:

      • 我很少有程序可以将日志写入 /var/log(或者说 /var/log/custom)目录。在进程重新启动时,这些进程中的每一个都通过将时间戳附加到其名称来创建一个新日志。我想定义一个可以排除已经旋转的文件的 glob。如果有办法匹配 dot 看起来我可以用 *[!.][!g][!z] 定义一个 glob 来告诉文件不以“.gz”结尾。
      猜你喜欢
      • 2015-11-23
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2015-03-21
      • 2018-11-07
      • 2018-03-16
      • 2019-05-29
      相关资源
      最近更新 更多