More Related Content
PPTX
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう PDF
PDF
PPT
PPT
PDF
PPT
PPT
Scripting Layer for Android + Perl What's hot
PDF
PDF
最新PHP事情 (2000年7月22日,PHPカンファレンス) PDF
PDF
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for... PDF
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight) PDF
PDF
PPTX
PDF
15分でCakePHPを始める方法(Nseg 2013-11-09 ) PDF
PDF
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese) PDF
PPTX
KEY
PDF
PDF
PDF
PDF
Viewers also liked
PDF
Mojoliciousのログ出力を改造する in chiba.pm #3 KEY
Mojoliciousをウェブ制作現場で使ってみてる PPTX
Amon2 で造られた api サーバを引き継いで課金の実装をしました話 PPTX
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話 PDF
Mojolicious+redisでチャットを作った PDF
PDF
PDF
Mojoliciousでつくる! Webアプリ入門 PDF
PDF
ODP
PDF
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う PDF
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm PDF
PDF
PDF
Games::* - Perlで 「ゲーム」しよう #hokkaidopm PDF
PDF
PDF
PDF
Similar to Perl logging
PDF
KEY
PDF
PPT
CPANの依存モジュールをもう少し正しく検出したい PDF
KEY
PPT
PDF
ホームディレクトリに埋もれた便利なコードをさがせ! PPT
PDF
GNU awk (gawk) を用いた Apache ログ解析方法 PDF
PDF
PDF
Write good parser in perl PDF
PDF
PPT
ODP
PDF
ライブコーディング(?)で学ぶPerlオブジェクト指向 PDF
新しくプログラミング言語・・・Rubyでやってみた PDF
Perl logging
- 1.
Perl ロギングprint からLog::Dispatch の拡張まで2010/08/07 Hokkaido.pm #1By keroyon@cpan.orgHokkaido.pm #1 - 2.
概略ログのあれこれについて語ります。対象は Perl 入門者です。※後半は初級者向けかも何でログなのか必須知識の割には、あまり言及されないみたいなので。※ 定番サイト、定番本、グーグルで全滅ログ吐く方法すら分からないとあっては、Perl採用への道が遠退きそうなので。内容ログ出力のためのPerlの基礎知識モジュールを使ったログ出力業務要件に合わせたモジュールの拡張Hokkaido.pm #1 - 3.
- 4.
- 5.
- 6.
Data::Dumper はちょっと不便use utf8;useData::Dumper;BEGIN { binmode STDOUT, ':utf8'; }my $hoge = { key => '値' };print Dumper($hoge);↓$VAR1 = { 'key' => "\x{5024}"};Hokkaido.pm #1 - 7.
YAML::Syck だといい感じuse utf8;useYAML::Syck;use feature qw(say);BEGIN { $YAML::Syck::ImplicitUnicode = 1;binmode STDOUT, ':utf8';}say Dump($hoge);↓---key: 値※YAML も 0.71でUTF8文字化けしなくなったよ!Hokkaido.pm #1perlcriticrc[Variables::ProhibitPackageVars]add_packages = YAML::Syck - 8.
- 9.
処理の終了と開始とかsay '[info] 処理A開始' . Time::Piece::localtime->cdate; $ ./hoge.pl >> ~/info.log$ cat ~/info.log↓[info] 処理A開始 Sun Aug 1 13:29:31 2010※5.10 から Time::Piece がコア入りしたよ!Hokkaido.pm #1 - 10.
- 11.
STDERR warn carpuseutf8;BEGIN { binmode STDERR, ':utf8'; }say STDERR'なんかエラーだYO! ';warn 'なんかエラーだYO! '; # 行番号carp 'なんかエラーだYO! '; # スタックトレース$ ./hoge.pl 2>>warn.log >>debug.log$ ./hoge.pl >>all.log 2>&1※ うるさい時には、$Carp::Internal{'パッケージ名'}++Hokkaido.pm #1 - 12.
- 13.
exit die croakexit1; erronoを直指定。何を言ってるのか分かりづらいジョブネット組む時に使ったりするdie "うぎゃぁ~。銃でやられた! ";原因が分かりやすい。単に die すると 255 で固定croak "やられた!かくかくしかじか"; 死んだ経緯をしゃべる。スタックトレースつきHokkaido.pm #1 - 14.
- 15.
- 16.
- 17.
- 18.
- 19.
簡単な例:とりあえずファイルにuse Log::Dispatch;use Log::Dispatch::File;my$log = Log::Dispatch->new;$log->add(Log::Dispatch::File->new( name => 'file_debug',min_level => 'debug',max_level => 'debug', filename => 'debug.log', mode => 'append', newline => 1, ));$log->debug('[debug] デバッグ情報 [' . Time::Piece::localtime->cdate . ']');Log::Dispatch::Outputのサブクラスを指定Hokkaido.pm #1 - 20.
- 21.
- 22.
- 23.
コード部分初期化は、new -> addでなく、configure -> instanceuse utf8;use Log::Dispatch::Config;use Log::Dispatch::Configurator::YAML;BEGIN { binmode STDERR, ':utf8'; }my $log_config=Log::Dispatch::Configurator::YAML->new('./log_conf.yaml');Log::Dispatch::Config->configure($log_config);my $log = Log::Dispatch::Config->instance;#new じゃない$log->debug('デバッグ情報');$log->info('インフォ。');Hokkaido.pm #1 - 24.
設定ファイル(YAMLの例)screen_color: class: Log::Dispatch::Screen::Colormin_level: debug newline: 1 color: info: text: green warning: text: yellow error:text: reddispatchers: - file_debug - screen_colorfile_debug: class: Log::Dispatch::Filemin_level: debugmax_level: debug filename: debug.log mode: append newline: 1 format: [%d] [%p] %m at %F:%Lサブクラスの追加属性Hokkaido.pm #1 - 25.
- 26.
- 27.
簡単な例use Log::Dispatch;use Log::Dispatch::File;useLog::WarnDie; # 一回 use しといてmy $log = Log::Dispatch->new;$log->add( Log::Dispatch::Screen->new( name => 'screen',min_level => 'debug',));use Log::WarnDie$log; # インスタンスを与えてもう一回 usewarn 'warning!';die 'died…';Hokkaido.pm #1 - 28.
- 29.
- 30.
Log::Dispatch::Email とはL::D::Output のサブクラス。さらにそのEmail を継承したクラスが複数あり、ログをメールに出力してくれる。サブクラス達(多過ぎ!)Log::Dispatch::Email::EmailSendLog::Dispatch::Email::MIMELiteLog::Dispatch::Email::MailSendLog::Dispatch::Email::MailSenderLog::Dispatch::Email::MailSendmail欠点モダンじゃない日本語メールが文字化けして嫌な目にあうじゃあ、モダンで文字化けしないのを作ってしまおう!Hokkaido.pm #1 - 31.
- 32.
コンストラクタ:%p -> $selfへsub new { my $proto = shift; my $class = ref $proto || $proto; my %p = @_; my $self = $class->SUPER::new(%p); $self->{use_transport_smtp} = delete $p{use_transport_smtp}; $self->{host} = delete $p{host}; $self->{port} = delete $p{port}; $self->{ssl} = delete $p{ssl}; $self->{sasl_username} = delete $p{sasl_username}; $self->{sasl_password} = delete $p{sasl_password}; return $self;}※ 勝手に拡張したパラメータは、delete で即座に消すのが流儀らしいHokkaido.pm #1 - 33.
send_emailメソッドsub send_email { my$self = shift; my %p = @_; my $to_str = join ',', @{ $self->{to} }; my $email = _create_email({ from => $self->{from}, to => $to_str, subject => $self->{subject}, header_encode => $self->{header_encode} || 'MIME-Header-ISO_2022_JP', body_encode => $self->{body_encode} || 'iso-2022-jp', body => $p{message}, });… 省略 … sendmail( $email, $transport, { to => $self->{to} } );}※$self からパラメータを受け取り、実際にメールを送信するコードを記述します。例外処理とTransport::SMTPは省略してますHokkaido.pm #1 - 34.
_create_emailメソッドsub _create_email { my $opt = shift; my $enc1 = $opt->{header_encode}; my $enc2 = $opt->{body_encode}; my $email = Email::MIME->create( header => [ From => encode( $enc1, $opt->{from} ), To => encode( $enc1, $opt->{to} ), Subject => encode( $enc1, $opt->{subject} ), ], attributes => {content_type => 'text/plain',charset => $enc2, encoding => '7bit', }, body => encode( $enc2, $opt->{body} ), ); return $email;}Email::MIME->create して、return してるだけ。Hokkaido.pm #1 - 35.
使い方:Sendmailuse Log::Dispatch;use Log::Dispatch::Email::EmailSender;my$log =Log::Dispatch->new;$log->add( Log::Dispatch::Email::EmailSender->new(min_level => 'emerg',from => 'logger@example.com',to => [ qw( foo@example.com bar@example.org ) ],subject => 'Big error!',header_encode => 'MIME-Header-ISO_2022_JP',body_encode => 'iso-2022-jp‘ ));$log->emerg("Something bad is happening");Hokkaido.pm #1 - 36.
使い方:SMTPLog::Dispatch::Email::EmailSender->new(min_level => 'emerg',from => 'logger@example.com',to =>[ qw( foo@example.com bar@example.org ) ],subject => 'Big error!',header_encode => 'MIME-Header-ISO_2022_JP',body_encode => 'iso-2022-jp‘,use_transport_smtp => 1,host => [your smtp host], port => [your smtp port number],sasl_username => [your username],sasl_password => [your password],)Hokkaido.pm #1 - 37.
補足などインストール$ cpanf –mLog::Dispatch::Email::EmailSender$cpanf –mdi Log::Dispatch::Email::EmailSender欠点SSL オプションを使えない(gmailアカウント使えない)メール送信エラー時のリトライがない他のEmail::Sender::Transport::* に未対応添付ファイルとかHTMLメールとか送れないバグ報告、パッチ、要望などhttp://github.com/keroyonn/p5-Log-Dispatch-Email-EmailSenderhttp://rt.cpan.org/keroyon@cpan.orgHokkaido.pm #1 - 38.
- 39.
- 40.
- 41.
利用例:コード部分 #1use Log::Dispatch::Config::Watcher;useLog::Dispatch::Configurator::YAML;my $config = Log::Dispatch::Configurator::YAML->new('/path/to/log.yaml');Log::Dispatch::Config::Watcher->configure($config);my $log = Log::Dispatch::Config::Watcher->instance;$log->info('log message');test1();test2();test3();Hokkaido.pm #1 - 42.
利用例:コード部分 #2(つづき)sub test1{ $log->warn('sample warning.'); sleep 4;}#evalされた diesub test2 { eval { die 'die with expected exception'; }; warn $@ if $@;}# evalされてない diesub test3 { sleep 5; die 'die with unexpected exception.';}Hokkaido.pm #1 - 43.
利用例:設定ファイル #1dispatchers: - screenscreen: class: Log::Dispatch::Screenmin_level: debug format: '[%p] %F:%L %m [%D{%F %T.%6N%z}]' # DateTime::Format::Strptime newline: 1stderr: 1Hokkaido.pm #1 - 44.
利用例:設定ファイル #2(つづき)watch:watch_die: 1watch_only_unexpected_die:1watch_warn: 1die_level: criticalwarn_level: warning formats: start: '[%p] START:%j [%D{%F %T.%6N%z}]' end: '[%p] END:%j(%t) [%D{%F %T.%6N%z}]'end_with_die: '[%p] ABNORMALLY_ENDED:%j(%e) [%D{%F %T.%6N%z}]' die: '[%p] UNEXPECTED_DIE (%e) [%D{%F %T.%6N%z}]' warn: '[%p] PERL_WARNING (%e) [%D{%F %T.%6N%z}]'timeover: '[%p] TIMEOVER:%j(%t)‘%j … 関数の詳細説明%t … 関数の実行時間%e … 警告メッセージHokkaido.pm #1 - 45.
- 46.
実行結果素の $log->info()[info] ./log.pl:13log message [2010-07-30 15:34:16.316215+0900]監視対象: test1() warn -> sleep 4;[info] START:"sleep 4 seconds process" [2010-07-30 15:34:16.319123+0900][warn] ./log.pl:19 sample warning. [2010-07-30 15:34:16.320854+0900][notice] TIMEOVER:"sleep 4 seconds process"(=>00:00:04.005179167)[info] END:"sleep 4 seconds process"(=>00:00:04.005179167) [2010-07-30 15:34:20.324692+0900]非監視対象: test2() evalされた die[warning] PERL_WARNING (die with expected exception at ./log.pl line 25.)監視対象:test3() evalされない die[info] START:"sleep 5 seconds process" [2010-07-30 15:34:25.328754+0900][warning] TIMEOVER:"sleep 5 seconds process"(=>00:00:05.00351812)[critical] ABNORMALLY_ENDED:"sleep 5 seconds process"(die with unexpected exception. at ./log.pl line 30.) [2010-07-30 15:34:25.330754+0900]Hokkaido.pm #1 - 47.
- 48.
- 49.
補足などインストール$ cpanf –mLog::Dispatch::Config::Watcher$cpanf –mdi Log::Dispatch::Config::Watcher欠点main パッケージのメソッドにも main:: が必要拡張方法が美しくない$SIG{__WARN__} 書き換えによる不具合とか起こりそう(たぶん)重いバグ報告、パッチ、要望などhttp://github.com/keroyonn/p5-Log-Dispatch-Config-Watcherhttp://rt.cpan.org/keroyon@cpan.orgHokkaido.pm #1 - 50.
- 51.