2

私のロケール設定は 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 プラグマが必要です)。それがないと、アクセスログは正しく出力されますJúlが、アクセスログはゴミになりました。

では、アクセスログを修正するにはどうすればよいですか?

  • ローカライズされた日付文字列のゴミのない印刷、または
  • アクセス ログ メッセージを C ロケールに変換する

何か案が?

Ps: PSGI はバイト指向の仕様 (および MyApp が正しく処理している) であることはわかっていますが、この問題は MyApp の外部にあります。

4

1 に答える 1

2

openあなたのプラグマは広すぎると思います。あなたはそれが必要だと言いますが、詳細には名前を付けませんでした。明示的にのみ使用しているストリームに制限できるはずです。

それを理解するのが難しすぎる場合は、ログ メッセージが送信される STDERR ストリームのIO レイヤーを単純に整理します。

binmode STDERR, ':bytes';
于 2011-07-24T13:36:22.387 に答える