plackup访问日志 - locale和open pragma - 编码问题

时间:2011-07-24 10:40:48

标签: perl plack

我的语言环境设置为utf8,因此,在启动plackup时,日期字符串也已本地化。因此,我得到如下控制台访问日志:

$ plackup a.psgi 
HTTP::Server::PSGI: Accepting connections at http://0:5000/
127.0.0.1 - - [24/júl/2011:12:15:44 +0200] "GET / HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7) AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1 Safari/534.48.3"
                   ^- garbage

我的部分a.psgi:

use 5.014;
use warnings;
use utf8;
use open qw(:std :utf8); #the problem....
use Encode;

use Plack::Builder;

use MyApp;
my $runner = MyApp->new(...);
my $app = sub {
    $runner->run(shift);
};

builder {$app;};

有问题的行是open pragma。 (我需要在MyApp中使用open pragma)。如果没有它,acccess日志就会正确打印Júl,访问日志就会变成垃圾。

那么,如何修复我的访问日志?

  • 用于本地化日期字符串的无垃圾打印输出,或
  • 将访问日志消息转换为C语言环境

有什么想法吗?

Ps:我知道,PSGI是面向字节的规范(MyApp正确处理它),但这个问题不在MyApp中。

1 个答案:

答案 0 :(得分:2)

我认为你的open pragma过于宽泛。你说你需要它,但没有说明细节。您应该可以将其限制为仅使用明确的流。

如果难以弄清楚,只需理清日志消息所在的STDERR流的IO layer

binmode STDERR, ':bytes';