![使用 cron 或 logrotate 处理大量相同的日志](https://linux22.com/image/79595/%E4%BD%BF%E7%94%A8%20cron%20%E6%88%96%20logrotate%20%E5%A4%84%E7%90%86%E5%A4%A7%E9%87%8F%E7%9B%B8%E5%90%8C%E7%9A%84%E6%97%A5%E5%BF%97.png)
我们在服务器中部署了一个应用程序,在某些情况下,该应用程序会生成以下格式的一些日志。
process_name.hostname.common_text.log.{error/info/warning}.date.time
现在,由于这种格式,不存在一个日志,而是多个这样的日志都具有相同的内容process_name.hostname.common_text.{错误/信息/警告}部分,但由于日期和时间的差异,其余部分有所不同。但就 logrotate 而言,它将所有这些视为单独的日志,并且如果我说,它将保留每个日志的 1 个这样的副本
旋转 1
在 logrotateconf 中。
但就我而言,这些都是相同的日志,除了每个类别中最近的 1 个日志之外,我不想保留任何日志(错误/信息/警告)。我该怎么办?
我想编写一个每周在 cron 中运行的脚本。该脚本将检查每个类别中最近的文件(错误/信息/警告)使用时间戳(ls-ltr),然后删除其余此类日志。但是,如果我尝试将其放入脚本中,它会变得太复杂。
我正在寻找这样的东西。
ls -ltr |grep process_name.hostname.common_text.log.error |head -n -1
ls -ltr |grep process_name.hostname.common_text.log.info |head -n -1
ls -ltr |grep process_name.hostname.common_text.log.warning |head -n -1
上述 3 个命令将返回所有的名称process_name.hostname.common_text.log.{错误/信息/警告}.date.time日志(最近的日志除外)。
1)是否可以将上述每个命令的输出传递给执行或者参数在同一条线上,这样我就可以跑射频反对?
2)更好的方法是什么?因为,process_name 再次有 2 个不同的名称,因此,我必须运行 6 个命令,或者可能更多。
3)有没有办法可以在单行中 grep 三次,一次用于错误,一次用于信息,一次用于警告?
答案1
如果您使用-1
而不是-l
for ls,则只能获得文件名,并且可以将它们直接传递给 rm。我会使用这样的东西:
rm $(ls -1tr process_name.hostname.common_text.log.error* | head -n -1) \
$(ls -1tr process_name.hostname.common_text.log.info* | head -n -1) \
$(ls -1tr process_name.hostname.common_text.log.warning* | head -n -1)