![跟踪“在过去一小时内从日志文件中写入的行”是否可能?](https://linux22.com/image/921692/%E8%B7%9F%E8%B8%AA%E2%80%9C%E5%9C%A8%E8%BF%87%E5%8E%BB%E4%B8%80%E5%B0%8F%E6%97%B6%E5%86%85%E4%BB%8E%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E4%B8%AD%E5%86%99%E5%85%A5%E7%9A%84%E8%A1%8C%E2%80%9D%E6%98%AF%E5%90%A6%E5%8F%AF%E8%83%BD%EF%BC%9F.png)
我正在尝试使用 grep 在日志文件中寻找模式,但我需要日志文件的最后一小时。tail -n XX 不起作用。有人知道这是否可行吗?某种跟踪“过去一小时内从日志文件中写入的行”
如果有任何命令或程序,我将不胜感激。
多谢
答案1
假设您的日志具有以下结构:
219.369.42.449 - - [05/Mar/2020:11:05:17 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:11:06:37 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:12:01:14 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:12:07:23 +0200] "log line"
我们可以使用以下方式获取从第一次出现到文件05/Mar/2020:11
末尾的所有行:$
sed
sed -n '/05\/Mar\/2020:11/,$p' "/path/to/file.log"
该选项
-n
将抑制的正常输出sed
,但该标志p
将打印文件的匹配部分。请注意,如果没有显示任何与之匹配的记录
05/Mar/2020:11
,sed
则不会提供任何输出。
我们可以借助以下命令自动执行上述操作date
:eval
COMMAND="sed -n '/$(LANG=C date --date='1 hour ago' "+%d\/%b\/%Y:%H")/,\$p'"
eval $COMMAND \"/path/to/file.log\"
sed
在这种情况下,在表达式中使用双引号和变量不会提供所需的输出。- 因此我们首先将命令构建为字符串,然后通过将其转换为真实命令
eval
。 LANG=C
(LANG=en_us_88591
) 代表获取所需的日期格式,因为,例如,在我的情况下,这个环境变量的默认值是bg_BG.UTF-8
。
您可以根据以上两行创建一个脚本 - 该脚本的示例:
modsecurity-whitelist-rule-generator.bash
- 解析事件在 ModSecutitymodsec_audit.log
中他们的唯一标识,然后为 ModSecutity 生成白名单规则。
答案2
tail 没有命令或选项可以跟踪过去一小时的变化。您必须在日志中 grep 时间戳,或者继续tail -f
运行,当需要检查某些内容时只需向后滚动即可。这样做的好处是,您还可以捕获 61 分钟前发生的事件。
答案3
每 5 分钟运行一次命令时,还要复制一份日志文件。然后,您可以从制作的倒数第 12 个副本中进行差异分析,以获取当前更改。
答案4
利用 @pa4080 用来获取一小时前的日期命令。将其传递给 awk 脚本,该脚本查找包含正确年、月、日以及匹配的小时和更高的分钟或更高的小时的第一行。从第一行到文件末尾的输出。
我的 awk 不是那么强大,否则我会为你编写它。希望其他人能成为你的 awk 大师。