我最终采用的解决方案类似于以下,靠近我所有脚本的顶部:
珀尔:
open(STDERR,">>","/path/to/my/cgi-error.log")
or die "Could not redirect STDERR: $OS_ERROR";
Python:
sys.stderr = open("/path/to/my/cgi-error.log", "a")
显然在 Perl 中,您不需要在重新打开 STDERR 句柄之前关闭它。
通常我还是会关闭它作为最佳实践,但正如我在问题中所说,我有 269 个脚本,我正试图最大限度地减少更改。(此外,重新打开打开的文件句柄似乎更 Perlish,听起来很糟糕。)
万一其他人将来有类似的东西,这就是我要立即更新所有脚本的方法:
珀尔:
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";%' {} \;
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")%' {} \;
我发布这些命令的原因是我花了很多语法按摩才能使这些命令正常工作(例如,将无法更改为无法,将 #!/usr/bin/perl 更改为仅 /usr/ bin/perl,因此 shell 不会将 ! 解释为历史字符,使用 $OS_ERROR 而不是 $! 等)
感谢所有评论的人。由于没有人同时回答 Perl 和 Python,我不能真正“接受”任何给定的答案,但我确实给了那些引导我走向正确方向的答案。再次感谢!