我的区域设置是 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)。没有它,访问日志会正确打印Júl
,访问日志中出现了垃圾。
那么,如何修复我的访问日志?
- 对于本地化日期字符串的无垃圾打印输出,或者
- 将访问日志消息转换为 C 语言环境
任何想法?
Ps:我知道,PSGI 是面向字节的规范(并且 MyApp 正确处理它),但这个问题不在 MyApp 之外。
我认为你的open
pragma 太宽泛了。你说你需要它,但没有透露细节。您应该能够将其限制为仅明确使用的流。
如果这太难弄清楚,只需理顺IO layer http://perldoc.perl.org/PerlIO.html对于日志消息所在的 STDERR 流:
binmode STDERR, ':bytes';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)