Perl RexEx 替换锁 Apache access_log

Perl RexEx 替换锁 Apache access_log

我想清理我的 apache 服务器日志,删除所有的 301、404 等等,在尝试使用 sed 并失败后,我使用了 Perl,效果很好,除了……然后 Apache 不再记录任何内容,直到服务重新启动。

知道为什么会这样吗?或者我能做些什么来克服这个挑战?我希望把这部分作为 cron 作业运行的 bash 脚本。

以下是我想要执行的几个示例。

perl -pi -e "s/(\d+.\d+.\d+.\d+) - - (.*) \+0000(.*)HTTP\/1.1\" \d{3} \d{1,8}(.*)/\1 - \2\3\4/" access_log
perl -pi -e "s/.*( 301 | 404 |index\.php\/|Googlebot| \/ |bingbot|Special\:CreateAccount|php\?title\=|POST \/index.php|xlsx.full.min.js|javascript.js| \/\?author\=|Baiduspider).*\n//" access_log

答案1

您无法编辑仍被 apache 保持打开状态的日志文件。perl-i标志使 perl 将日志文件重命名为临时名称,打开该文件,然后创建并打开一个新文件access_log。它将编辑的输出放入该新文件中,然后关闭临时文件(该临时文件仍是 apache 写入的文件)。但是,该文件不再出现在文件系统中,因为没有人以新名称打开它,并且当 apache 退出时,所有文件内容都将消失。

编辑日志的干净方法是重命名旧文件后,让 apache 使用新日志文件重新启动。

相关内容