- ベストアンサー
細かいレベルの逐次出力はどうすればいいですか
C++の科学計算プログラムですが、出力モードによって、ログの粒度を変更したいと思っています。「通常モード」ならエラーと警告のみをログファイルに出力し、「計算経過チェックモード」なら、かなり細かく途中経過をログファイルに出力しようと思っています。ここで、「かなり細かく」というのは、例えばforループ内で逐次変化するパラメータを、処理ループ毎に出力する、といったレベルです。こんな細かいレベルのものの出力処理を、いちいちソースに埋め込んだらとても大変で可読性も思いっきり下がってしまうので、何か他の方法を探しています。なにか良い方法はありますでしょうか?ソースは恐らく5万行を超えると思います。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
myprintf(level, format, ...) みたいなメソッドを作って、このメソッドのなかで、levelが出力モード以上なら実際に出力する、みたいなことをするのが普通だと思います。あるいは、条件コンパイルでmyprintfをいろいろ定義し直してコンパイル時に処理してもいいでしょう。 もしくは、(本質的にやってることは同じですが)loggingクラスみたいなのを作ってもいいですが。 Pythonの、loggingモジュールとかが参考になりますか? http://www.python.jp/doc/release/lib/module-logging.html もしかしたら、myprintfをいたるところに埋め込むこと自体が可読性を下げるのでは?と思われているのかもしれませんが、デバック出力用の文字列は、ある意味、適切につけられたコメントみたいなものなんで、ソースの可読性はないときよりも良くなると思います。
その他の回答 (1)
- fatbowler
- ベストアンサー率48% (26/54)
「出力モードによって、ログの粒度を変更する」のは何の問題もないと思います。 ログ出力メソッドの中で判断するか、時間やリソースの制約がある場合は インライン関数か関数マクロを使う方法もあります。 あらかじめ、出力するログごとにレベルをつけておくのが一般的ですが、 ループの途中で出力する/しないが変更になる場合も、例えば「監視対象Aの ログ出力」というメソッドを用意して、Aの値によって出力する/しないを 判断すれば問題ないでしょう。 あと、「何か他の方法」とはソース内に(該当箇所に)ログ出力コードを埋め込まず、 他の方法で監視するということでしょうか? 監視対象をグローバルにしておけば、タイマーイベントか何かきっかけさえあれば 可能かもしれませんが、5万行もあるシステムのローカル変数をグローバルに 変更するのは、ちょっと現実的ではありませんね。 ログは所詮1行埋め込むだけなので、そう可読性は下がらないと思いますが。
お礼
早速のご回答、どうもありがとうございました。 あまり知識がなく申し訳ありませんが、「監視対象Aのログ出力」メソッドを使って、「100回のループで同じワーニングメッセージを出すのはうっとおしいので、最初の1回だけ出力させる」ことも簡単にできますか? あと、「何か他の方法」とは、おっしゃるとおりの意図でしたが、あまり可読性は下がらないとのことで、安心しました。 (このヘンが、経験不足で予想できないのです。。)
お礼
早速のご回答、ありがとうございました。 logging機能は、なるほど便利そうですね。 C++でも無いか、探してみます。 可読性のことですが、おっしゃる通りあまり心配しなくてもいいのかも知れません。 ほとんど経験が無いので、ごちゃごちゃするだけだとしか思えませんでした。