Perl plackup访问日志-区域设置和打开pragma-编码问题

Perl plackup访问日志-区域设置和打开pragma-编码问题,perl,plack,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)

我的区域设置是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;};
有问题的行是
打开pragma
。(我需要在MyApp中打开pragma)。如果没有它,访问日志将正确地打印
Júl
,访问日志也随之变得垃圾

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

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


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

我认为你的
开放的
pragma太宽泛了。你说你需要它,但没有说出细节。您应该能够将其限制为仅明确使用的流

如果这太难理解,只需理顺日志消息所在的STDERR流的顺序:

binmode STDERR, ':bytes';