【问题标题】:How do I stop Apache from inserting unwanted line breaks in its error log?如何阻止 Apache 在其错误日志中插入不需要的换行符?
【发布时间】:2010-09-18 02:18:35
【问题描述】:

我的 Perl/FastCGI 应用广泛使用“print STDERR”将各种调试信息记录到 Apache 错误日志文件中。

我自己经常插入换行符,但 Apache(或者可能是 FastCGI?)仍然觉得需要插入额外的换行符,通常就在我格式化输出的中间。

我怎样才能阻止这种情况发生?

这是一个例子:

[Sun Sep 19 12:51:49 2010] [warn] mod_fcgid: stderr: request OK: client / index :0.035902 wallclock secs ( 0.030 usr  0.000 sys +  0.000 cusr  0.000 csys =  0.030 CPU)
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: REQUEST pid:3569   ctr:4   time: 15   path:/client/index
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: REQUEST: /client/index   log: 9473
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 1--45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 2--45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 3--45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 4--45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 5--45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 6--45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 7--45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 8--45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 9--4
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 5678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 10-45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 11-45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 12-45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 13-45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 14-45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 15-45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 16-45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 17-45678901234567890123456789012345678901234567890
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 18-4567890123456789012345678901234567890123456789
[Sun Sep 19 12:51:52 2010] [warn] mod_fcgid: stderr: 0

每行应包含 51 个字符,包括一个 \n,不包括 apache 的序言。每一行都是在它自己的 print() 调用中输出的,所以这不是一次转储大量文本的结果。

似乎每 504 个字符发生一次,从每个 FastCGI 请求的开头开始。如果我连续有一堆请求打印的信息很少,我永远不会看到换行符。

【问题讨论】:

    标签: perl apache fastcgi


    【解决方案1】:

    为什么不直接使用Log4Perl呢?

    你能举一些不需要的换行符的例子吗?你确定错误日志真的有额外的换行符还是其他东西,比如你的终端,包装了它们?

    这听起来有点像缓冲输出。如果取消缓冲 STDERR 会发生什么?

     {
     my $old = select(STDERR);
     $|++;
     select( $old );
     }
    

    【讨论】:

    • Log4Perl 看起来不错,正是我需要的。但是我正在使用一个使用 print STDERR 的大型代码库,我现在无法更改它。我在上面添加了一个示例和更多信息。感谢您的提示。
    • PS 它没有被终端包装
    • $| 的好建议,但我试过了,它根本没有任何区别。我还在每个请求的开头尝试了 $|=1 。我认为缓冲在 FastCGI 中,但我找不到它的文档。
    猜你喜欢
    • 2019-09-27
    • 2013-12-05
    • 2019-03-12
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多