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*
命令。