Chi*_*ael 5 python perl cgi hostmonster stderr
我正在将一个网站移至 Hostmonster 并询问服务器日志的位置,以便我可以自动扫描它以查找 CGI 错误。有人告诉我,“我们很抱歉,但我们没有将 cgi 错误转到您有权访问的任何文件。”
由于组织原因,我坚持使用 Hostmonster 和这个糟糕的政策,因此作为一种解决方法,我想也许我会修改 CGI 脚本以将 STDERR 重定向到自定义日志文件。
我有很多脚本 (269),所以我需要在 Python 和 Perl 中使用一种简单的方法将 STDERR 重定向到自定义日志文件。
显式或隐式地考虑文件锁定的东西会很棒,因为如果多个脚本同时失败,共享的 CGI 错误日志文件理论上可以同时由多个脚本写入。
(我想使用共享错误日志,以便我可以每晚将其内容通过电子邮件发送给自己,然后将其存档或删除。)
我知道我可能需要修改每个文件 (grrr),这就是为什么我要寻找一些优雅的东西,它只会是几行代码。谢谢。
我最终采用的解决方案类似于以下内容,位于所有脚本的顶部附近:
珀尔:
open(STDERR,">>","/path/to/my/cgi-error.log")
or die "Could not redirect STDERR: $OS_ERROR";
Run Code Online (Sandbox Code Playgroud)
Python:
sys.stderr = open("/path/to/my/cgi-error.log", "a")
Run Code Online (Sandbox Code Playgroud)
显然,在 Perl 中,您不需要在重新打开 STDERR 句柄之前关闭它。
通常情况下,我都会将其关闭作为最佳实践,但正如我在问题中所说,我有 269 个脚本,并且我正在努力最大程度地减少更改。(另外,重新打开打开的文件句柄似乎更糟糕,尽管听起来很糟糕。)
如果将来其他人有类似的情况,我将立即执行以下操作来更新所有脚本:
珀尔:
find . -type f -name "*.pl" -exec perl -pi.bak -e 's%/usr/bin/perl%/usr/bin/perl\nopen(STDERR,">>","/path/to/my/cgi-error.log")\n or die "Could not redirect STDERR: \$OS_ERROR";%' {} \;
Run Code Online (Sandbox Code Playgroud)
Python:
find . -type f -name "*.py" -exec perl -pi.bak -e 's%^(import os, sys.*)%$1\nsys.stderr = open("/path/to/my/cgi-error.log", "a")%' {} \;
Run Code Online (Sandbox Code Playgroud)
我发布这些命令的原因是,我花了相当多的语法调整才能使这些命令正常工作(例如,将 Couldn't 更改为 Could not,将 #!/usr/bin/perl 更改为 /usr/ bin/perl 因此 shell 不会将 ! 解释为历史字符,使用 $OS_ERROR 而不是 $! 等)
感谢所有发表评论的人。由于没有人同时回答 Perl 和 Python,我无法真正“接受”任何给出的答案,但我确实给那些引导我走向正确方向的答案投票。再次感谢!