我正在将网站移动到Hostmonster并询问服务器日志的位置,以便我可以自动扫描它以查找CGI错误。我被告知,“我们很抱歉,但我们没有cgi错误转到您可以访问的任何文件。”
出于组织原因,我坚持使用Hostmonster和这个糟糕的策略,所以作为一种解决方法,我想我可能会修改CGI脚本以将STDERR重定向到自定义日志文件。
我有很多脚本(269)所以我需要在Python和Perl中使用一种简单的方法将STDERR重定向到自定义日志文件。
明确或隐含地解释文件锁定的东西会很好,因为如果多个脚本同时出现故障,理论上可以由多个脚本同时写入共享的CGI错误日志文件。
(我想使用共享错误日志,以便我可以每晚通过电子邮件将其内容发送给自己,然后将其归档或删除。)
我知道我可能需要修改每个文件(grrr),这就是为什么我要寻找一些优雅的东西,只需几行代码。感谢。
答案 0 :(得分:4)
对于Perl,只需关闭并重新打开STDERR
即可指向您选择的文件。
close STDERR;
open STDERR, '>>', '/path/to/your/log.txt'
or die "Couldn't redirect STDERR: $!";
warn "this will go to log.txt";
或者,您可以查看文件句柄多路复用器,如File::Tee。
答案 1 :(得分:3)
Python:cgitb。在脚本的顶部,在其他导入之前:
import cgitb
cgitb.enable(False, '/home/me/www/myapp/logs/errors')
('errors'是Web服务器用户具有写访问权限的目录。)
答案 2 :(得分:3)
在Perl中尝试CGI::Carp
BEGIN {
use CGI::Carp qw(carpout);
use diagnostics;
open(LOG, ">errors.txt");
carpout(LOG);
close(LOG);
}
use CGI::Carp qw(fatalsToBrowser);
答案 3 :(得分:2)
蟒:
import sys
sys.stderr = open('file_path_with_write_permission/filename', 'a')
答案 4 :(得分:2)
我最终使用的解决方案类似于以下内容,靠近我所有脚本的顶部:
的Perl:
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似乎只是重新打开打开的文件句柄,听起来很糟糕。)
如果将来有其他人有类似的东西,这就是我要一次更新所有脚本的目的:
的Perl:
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改为just / usr / bin / perl所以shell不会解释!作为历史字符,使用$ OS_ERROR而不是$!等。)
感谢所有评论的人。由于没有人为Perl和Python做出回答,我无法真正“接受”任何给定的答案,但我确实对那些导致我正确方向的人投了票。再次感谢!
答案 5 :(得分:0)
Python有你可能想要查看的sys。 stderr 模块。
>>>help(sys.__stderr__.read)
Help on built-in function read:
read(...)
read([size]) -> read at most size bytes, returned as a string.
If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was requested
may be returned, even if no size parameter was given.
您可以将其输出存储在字符串中,并将该字符串写入文件。
希望这有帮助
答案 6 :(得分:0)
在我的Perl CGI程序中,我通常有
BEGIN {
open(STDERR,'>>','stderr.log');
}
在shebang line和“use strict; use warnings;”之后。如果需要,您可以将$ 0附加到文件名。但这不会解决多个程序问题,因为一个程序的多个副本可能同时运行。对于每个程序组,我通常只有几个输出文件。