-
-
Save suma/3798687 to your computer and use it in GitHub Desktop.
jubatusにおけるLOGレベルガイドライン(素案)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
0. ログ出力の目的 | |
- システム情報の通知 | |
- 運用におけるエラー、異常の通知 | |
- システムの不正な動きの報告(セキュリティ) | |
- デバッグ | |
1. 利用するライブラリ | |
http://code.google.com/p/google-glog/ | |
google-glog を利用する。 | |
stderrにもログを同時出力するには、google::SetStderrLoggingを呼ぶと良い。 | |
google::LogToStderrを呼び出した場合はログファイルに出力されず、stderrのみになる(ただし追加したLogSinkには出力される)。 | |
2. ログレベル | |
Jubatusは通常モードとデバッグモードのログレベルが存在する。 | |
通常モードでのJubatusで利用するログレベルは、以下の三種類とする。 | |
- ERROR | |
クライアントもしくは、システム操作者が何かしらの変更点を加えないと、システムが正しく動作しない場合 | |
cf. サーバで例外を返した場合 | |
LOG(ERROR) << "Exception : " << exp_str; | |
- WARNING | |
システムとしては動作しているが、正しい結果を返していない可能性がある場合 | |
そのうちエラーが発生する可能性がある状態の場合 | |
cf. 機械学習などアルゴリズム内でINF, NaNなどの異常値が返っている場合 | |
分散環境で起動しているにも関わらず、サーバが一台しかない場合 | |
分散環境でノードが落ちた場合 | |
LOG(WARN) << "classify returns" << ret_val; | |
- INFO | |
開始時、設定変更時、保存データロード時など、Jubatusクラスタ全体が大きく変化するときに記録する。 | |
LOG(INFO) << "jubaclassifier sta" << ret_val; | |
代表的な例 | |
- 起動:バージョン, 引数(ZK, インスタンス名, モード), プロセス実行user, group | |
- サーバ準備 | |
- 設定ロード | |
- (ログの外部出力準備) | |
- ZKへIPアドレス登録完了(分散環境向け準備完了) | |
- TCP (RPCサーバ) listen 完了:port番号 | |
- 準備完了 | |
- 設定変更(設定の動的更新に対応する場合) | |
- プロセス終了 | |
デバッグモードのログレベルは、以上に加え | |
- DLOG | |
状態が変わるとき | |
他のサーバとのやりとりが発生したとき | |
- すべてのモデルの更新を伴う処理を記録 | |
- 他のサーバへの要求が発生した場合 | |
- 他のサーバから要求を受けた場合 | |
- ZKとのやりとり | |
c.f. 各サーバのupdate時、MIXプロトコルの開始時、終了時、master_lock取得時、他のサーバからの受信時 | |
4. バックトレースログの出力 | |
SIGSEGVのようなシグナル(セグメンテーションフォールト)によって終了するとき、ログを出力するにはglogの初期化時にglog::InstallFailureSignalHandlerを呼び出すと良い。ただし、glogはSIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, SIGTERMのシグナルをハンドラに登録するため、Jubatusでこれらのシグナルを処理したい場合はInstallFailureSignalHandlerを先に呼び出すように注意する。 | |
glog::InstallFailureWriterを使うと、バックトレースの出力先をカスタマイズできる。 | |
x. 実装レベルの問題/ログ収集 | |
問題 | |
分散環境でログ収集するのが困難 | |
解決(ログ収集)方法 | |
glogの出力をfluentdやApache BookKeeperへ出力する | |
fluentd/Apache BookKeeperへの繋ぎ込み | |
- ログ出力先の設定方法:ZK? | |
- 実装: https://gist.github.com/1710721 | |
-- LogSinkを使うとき、LogSink::sendで時間のかかる処理をすると、ロガー呼び出し側はブロックされるので要注意 | |
zookeeper(c-client library)ログの収集が難しい問題 | |
- FILE*へログ出力をしているため、これをglog等へリダイレクトすることが難しい | |
- Linux(GNU C: glibc)であればfmemopenというものが利用できそうである | |
-- マルチスレッドのファイル出力をうまく取得するのは厳しい(FILE*のストリーム位置変更・行取得・取得済みデータの削除の3操作fprintfと競合しないて実行できることが求められる) | |
-- fmemopenはC標準関数ではないためMac OS X(darwin)/Solarisなどで互換性がない | |
TODO: waf configureにデバッグオプションをつける(NDEBUGマクロを定義しない) | |
x. 基礎用語説明 | |
ログの種類(どんなとき出力するか) | |
- fatal: システムがダウンせざるを得ないとき | |
- error: 管理者が対処する必要のあるとき | |
- warning: 警告 | |
- info: いつもの通常の情報 | |
- verbose: 冗長な通常より多くの情報。トラブルシュート時などに利用 | |
- trace: 関数のIN/OUT | |
ログで何を出力するか | |
>ポイント2 http://www.atmarkit.co.jp/im/cits/serial/soxfw/06/01.html |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment