Skip to content

Instantly share code, notes, and snippets.

@suma
Forked from odasatoshi/gist:3793055
Created September 28, 2012 08:42
Show Gist options
  • Save suma/3798687 to your computer and use it in GitHub Desktop.
Save suma/3798687 to your computer and use it in GitHub Desktop.
jubatusにおけるLOGレベルガイドライン(素案)
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