如何打印所有(压缩、滚动和当前)Apache 日志文件的内容

如何打印所有(压缩、滚动和当前)Apache 日志文件的内容

Apache 生成日志文件(即httpd.log)。在给定时间之后,日志文件将被翻转(即转换为httpd.log-20210627)。当日志文件再次翻转时,先前翻转的版本将被压缩(即转换为httpd.log-20210620.gz)。

作为 root,我可以列出所有这些文件。

[root@server user]# ls -latr /var/log/httpd/localhost/httpd.log*
-rw-r--r-- 1 root root  9364779  6. Jun 03:48 /var/log/httpd/localhost/httpd.log-20210606.gz
-rw-r--r-- 1 root root  8407071 13. Jun 03:27 /var/log/httpd/localhost/httpd.log-20210613.gz
-rw-r--r-- 1 root root  7099637 20. Jun 03:35 /var/log/httpd/localhost/httpd.log-20210620.gz
-rw-r--r-- 1 root root 91551338 27. Jun 03:45 /var/log/httpd/localhost/httpd.log-20210627
-rw-r--r-- 1 root root 49229622 30. Jun 17:28 /var/log/httpd/localhost/httpd.log
[root@server user]# 

使用bash,我想以非特权用户的身份(即:使用sudo,而不是在 root shell 中)按时间顺序打印所有日志文件的内容,这样我就可以例如通过 grep 浏览它们。

打印当前日志文件的内容很容易,因为它有一个固定的文件名:

sudo cat /var/log/httpd/localhost/httpd.log

打印压缩日志文件的内容几乎同样简单,因为我可以编写一个与所有相关压缩文件匹配的模式并用它zcat来打印未压缩的内容:

sudo su - -c "zcat /var/log/httpd/localhost/httpd.log-*.gz"

但到目前为止,我还不知道如何打印已滚动但尚未压缩的日志文件的内容。这是因为我不知道实际的文件名,并且像这样的模式/var/log/httpd/localhost/httpd.log*也会匹配所有压缩文件。

根据文档,当我启用时,我可以使用更复杂的模式extglob

如果extglob使用内置命令启用了 shell 选项shopt,则可以识别几个扩展模式匹配运算符。[]

[…]

+(pattern-list)

匹配给定模式的一个或多个出现。

根据答案是,如果我想extglob在单个命令中启用,我需要使用子 shell。事实上,这在 root shell 中按预期工作。执行shopt -s extglob然后cat /var/log/httpd/localhost/httpd.log-+([0-9]) )打印相关日志文件的内容。

然而,在 root shell 之外,我收到一个错误:

[user@server ~]$ sudo su - -c "( shopt -s extglob ; cat /var/log/httpd/localhost/httpd.log-+([0-9]) )"
-bash: -c: line 0: syntax error near unexpected token `('
-bash: -c: line 0: `( shopt -s extglob ; cat /var/log/httpd/localhost/httpd.log-+([0-9]) )'
[user@server ~]$ 

这与我尝试在cat /var/log/httpd/localhost/httpd.log-+([0-9])未启用的情况下在 root shell 中执行时遇到的错误相同extglob。我不确定为什么这不起作用,因为extglob在给定的情况下启用似乎有效:

[user@server ~]$ sudo su - -c "( shopt -s extglob ; shopt extglob )"
extglob         on
[user@server ~]$ 

extglob因此,当我需要写入模式时,我想知道如何在 root shell 之外打印文件名未知的文件的内容。但这可能是一个坐标-问题,所以我的实际问题是:

如何在 root shell 之外打印所有 Apache 日志文件的内容。

答案1

zgrep

您可以使用zgrep搜索压缩和非压缩日志的文件夹。

手册页写道zgrep

Zgrep 在压缩或 gzip 文件上调用 grep。所有指定的选项都直接传递给 grep。如果未指定文件,则标准输入将在必要时解压缩并提供给 grep。否则,给定的文件将在必要时解压缩并提供给 grep。

我尝试使用当前日志、旧日志和压缩日志重新创建您的示例:

saaru >ls -o
total 12
-rw-r--r-- 1 ba 25 Jun 30 23:06 httpd.log
-rw-r--r-- 1 ba 66 Jun 30 23:07 httpd.log-20210530.gz
-rw-r--r-- 1 ba 29 Jun 30 23:07 httpd.log-20210630

文件内容如下:

saaru >cat httpd.log
This is the current log

saaru >cat httpd.log-20210630
This is the rolled over log

saaru >zcat httpd.log-20210530.gz
This is the compressed log.

使用以下命令,您可以在日志中找到单词“压缩”:

saaru >zgrep "compressed" httpd.log*
httpd.log-20210530.gz:This is the compressed log.

或者查找所有不包含该词的日志行:

saaru >zgrep -v "compressed" httpd.log*
httpd.log:This is the current log
httpd.log:
httpd.log-20210530.gz:
httpd.log-20210630:This is the rolled over log
httpd.log-20210630:

zcat

如果你不想搜索,而只想显示 所有cat文件,你可以使用zcat-f旗帜

saaru >zcat -f httpd.log*
This is the current log

This is the compressed log.

This is the rolled over log

进一步阅读

这里是一篇文章所有不同的z*命令。

相关内容