无法使用日志轮换从选定的日志文件中搜索字符串

Posted

技术标签:

【中文标题】无法使用日志轮换从选定的日志文件中搜索字符串【英文标题】:Unable to search string from selected log files with log rotation 【发布时间】:2020-01-02 21:40:33 【问题描述】:

我有这种模式的日志文件 -

/mnt/internal-app/logs/internal-app.log_2019-08-20.log.gz
/mnt/internal-app/logs/internal-app.log_2019-08-21.log.gz
..
..
/mnt/internal-app/logs/internal-app.log_2019-08-25.log.gz
..

我想从某个日期范围内获取文件中某些文本的出现次数 - 例如20 到 21。

虽然以下对我有用,但要在 20 秒的整个范围内获取文件的出现 -

zgrep "search text" /mnt/internal-app/logs/internal-app.log_2019-08-23* 

试图只在 20 到 21 的范围内,我尝试了中给出的解决方案 我读了https://***.com/a/17000211/351903

为了使基本的正则表达式正常工作,我尝试了以下方法,但它没有给我任何结果 -

find . -regex "/mnt/internal-app/logs/internal-app.log_2019-08-23.*" -exec grep 'search text'  +

【问题讨论】:

假设您实际上有 8 月 23 日的数据,那么您可能需要像这样\/ 转义正斜杠 【参考方案1】:

您可以使用character class 更新您的模式以匹配 0 或 1:

/mnt/internal-app/logs/internal-app\.log_2019-08-2[01].*

Regex demo

【讨论】:

【参考方案2】:

除了@第四只鸟的回答

shell 允许以下匹配模式

[tmp]$ ls internal-app.log_2019-08-2[0123].log.gz
internal-app.log_2019-08-20.log.gz  internal-app.log_2019-08-22.log.gz
internal-app.log_2019-08-21.log.gz  internal-app.log_2019-08-23.log.gz
[tmp]$ ls internal-app.log_2019-08-20,1,2,3.log.gz
internal-app.log_2019-08-20.log.gz  internal-app.log_2019-08-22.log.gz
internal-app.log_2019-08-21.log.gz  internal-app.log_2019-08-23.log.gz
[tmp]$ ls internal-app.log_2019-08-20,23.log.gz
internal-app.log_2019-08-20.log.gz  internal-app.log_2019-08-23.log.gz

在 shell 文件名匹配和 pcre 正则表达式之间有不同的行为

在这种情况下,我想说使用 internal-app.log_2019-08-19,20.log.gz 会更容易、更准确 除了internal-app.log_2019-08-[12][09].log.gz

【讨论】:

以上是关于无法使用日志轮换从选定的日志文件中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Ansible 日志轮换周期?

如何使用 Gunicorn 执行日志轮换?

为啥在 gunicorn 上运行的烧瓶应用程序中使用日志轮换时同时在多个文件上写入日志?

日志轮换 - python 和 windows

Apache Artemis 日志记录以轮换日志文件

使用 Flask 和 RotatingFileHandler 进行原子日志文件轮换