漢字でコンソール出力
投稿:2019-02-22
Mojoliciousのモードが「development」で、
コントローラーの中から「$self->app->log->debug("たこルカは俺の嫁")」とやって、
ディレクトリ「log」がない場合はコンソールに表示されます。
ところがWindowsでは文字化けします。
Mojo::Logのソースを読むと決め打ちでutf8でエンコードしているのが分かりました。
Windowsのコンソールはcp932なので文字化けする訳です。
ディレクトリpluginを作成して、プラグインLogEncode.pmを作ります。
このモジュールはstartupで読み込みます。
ファイル出力時はutf8にエンコードしてコンソール出力時は環境に合わせた文字コードにエンコードします。
package LogEncode; use Mojo::Base "Mojolicious::Plugin"; use Carp 'croak'; use Encode::Locale; use Fcntl ':flock'; use Sub::Install; sub register { my ($self, $app, $conf) = @_; Sub::Install::install_sub({ code => sub { my ($self, $msg) = @_; return unless my $handle = $self->handle; flock $handle, LOCK_EX; if ($self->path) { $handle->print(Encode::encode 'UTF-8' => $msg) or croak "Can't write to log: $!"; } else { $handle->print(Encode::encode console_out => $msg) or croak "Can't write to log: $!"; } flock $handle, LOCK_UN; }, into => "Mojo::Log", as => "append", }); $app->log->debug("漢字対応ログ"); } 1;
アプリケーションのstartupの中で実行します。
# 自家製プラグインをロード push @{$self->plugins->namespaces}, "Myapp::Plugin"; # アルファベット順なのでログのエンコード出力プラグインが最初にロードされる $self->log->debug("----------"); $self->log->debug("load plugin:"); my $is_encode = "plugin"; for (sort grep {/\.pm$/} $self->app->home->child("plugin")->list_tree->each) { my $pluginname = $_->basename; $pluginname =~ s/\.pm$//i; $self->app->log->debug("$is_encode: $pluginname"); $self->plugin($pluginname); $is_encode = "プラグイン"; } $self->log->debug("----------");
[2019-02-22 21:19:22.06035] [16943] [debug] ---------- [2019-02-22 21:19:22.06047] [16943] [debug] load plugin: [2019-02-22 21:19:22.06179] [16943] [debug] plugin: LogEncode [2019-02-22 21:19:22.06578] [16943] [debug] 漢字対応ログ [2019-02-22 21:19:22.06596] [16943] [debug] プラグイン: MyAccount [2019-02-22 21:19:22.09713] [16943] [debug] プラグイン: PpDateStamp [2019-02-22 21:19:22.25559] [16943] [debug] プラグイン: PpDirectory [2019-02-22 21:19:22.25663] [16943] [debug] プラグイン: PpDownload [2019-02-22 21:19:22.25747] [16943] [debug] プラグイン: PpDraft [2019-02-22 21:19:22.25829] [16943] [debug] プラグイン: PpGoogleMap [2019-02-22 21:19:22.25908] [16943] [debug] プラグイン: PpPagedate [2019-02-22 21:19:22.26018] [16943] [debug] プラグイン: PpParser [2019-02-22 21:19:22.26116] [16943] [debug] プラグイン: PpPassPhrase [2019-02-22 21:19:22.27845] [16943] [debug] プラグイン: PpRemark [2019-02-22 21:19:22.27929] [16943] [debug] プラグイン: PpSourceCode [2019-02-22 21:19:22.28017] [16943] [debug] プラグイン: PpTable [2019-02-22 21:19:22.28146] [16943] [debug] プラグイン: PpTemplate [2019-02-22 21:19:22.28247] [16943] [debug] プラグイン: PpTitle [2019-02-22 21:19:22.28336] [16943] [debug] プラグイン: PpUpdate [2019-02-22 21:19:22.28451] [16943] [debug] プラグイン: PpWrap [2019-02-22 21:19:22.28532] [16943] [debug] プラグイン: QuoteLessDumper [2019-02-22 21:19:22.28681] [16943] [debug] { dumper => "漢字を表示" } [2019-02-22 21:19:22.28691] [16943] [debug] ----------