将STDERR的CGI错误输出重定向到文件(python和perl)

时间:2009-11-23 06:31:27

标签: python perl cgi stderr hostmonster

我正在将网站移动到Hostmonster并询问服务器日志的位置,以便我可以自动扫描它以查找CGI错误。我被告知,“我们很抱歉,但我们没有cgi错误转到您可以访问的任何文件。”

出于组织原因,我坚持使用Hostmonster和这个糟糕的策略,所以作为一种解决方法,我想我可能会修改CGI脚本以将STDERR重定向到自定义日志文件。

我有很多脚本(269)所以我需要在Python和Perl中使用一种简单的方法将STDERR重定向到自定义日志文件。

明确或隐含地解释文件锁定的东西会很好,因为如果多个脚本同时出现故障,理论上可以由多个脚本同时写入共享的CGI错误日志文件。

(我想使用共享错误日志,以便我可以每晚通过电子邮件将其内容发送给自己,然后将其归档或删除。)

我知道我可能需要修改每个文件(grrr),这就是为什么我要寻找一些优雅的东西,只需几行代码。感谢。

7 个答案:

答案 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附加到文件名。但这不会解决多个程序问题,因为一个程序的多个副本可能同时运行。对于每个程序组,我通常只有几个输出文件。