• ベストアンサー

細かいレベルの逐次出力はどうすればいいですか

C++の科学計算プログラムですが、出力モードによって、ログの粒度を変更したいと思っています。「通常モード」ならエラーと警告のみをログファイルに出力し、「計算経過チェックモード」なら、かなり細かく途中経過をログファイルに出力しようと思っています。ここで、「かなり細かく」というのは、例えばforループ内で逐次変化するパラメータを、処理ループ毎に出力する、といったレベルです。こんな細かいレベルのものの出力処理を、いちいちソースに埋め込んだらとても大変で可読性も思いっきり下がってしまうので、何か他の方法を探しています。なにか良い方法はありますでしょうか?ソースは恐らく5万行を超えると思います。

  • aneja
  • お礼率93% (379/405)

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

myprintf(level, format, ...) みたいなメソッドを作って、このメソッドのなかで、levelが出力モード以上なら実際に出力する、みたいなことをするのが普通だと思います。あるいは、条件コンパイルでmyprintfをいろいろ定義し直してコンパイル時に処理してもいいでしょう。 もしくは、(本質的にやってることは同じですが)loggingクラスみたいなのを作ってもいいですが。 Pythonの、loggingモジュールとかが参考になりますか? http://www.python.jp/doc/release/lib/module-logging.html もしかしたら、myprintfをいたるところに埋め込むこと自体が可読性を下げるのでは?と思われているのかもしれませんが、デバック出力用の文字列は、ある意味、適切につけられたコメントみたいなものなんで、ソースの可読性はないときよりも良くなると思います。

aneja
質問者

お礼

早速のご回答、ありがとうございました。 logging機能は、なるほど便利そうですね。 C++でも無いか、探してみます。 可読性のことですが、おっしゃる通りあまり心配しなくてもいいのかも知れません。 ほとんど経験が無いので、ごちゃごちゃするだけだとしか思えませんでした。

その他の回答 (1)

  • fatbowler
  • ベストアンサー率48% (26/54)
回答No.2

「出力モードによって、ログの粒度を変更する」のは何の問題もないと思います。 ログ出力メソッドの中で判断するか、時間やリソースの制約がある場合は インライン関数か関数マクロを使う方法もあります。 あらかじめ、出力するログごとにレベルをつけておくのが一般的ですが、 ループの途中で出力する/しないが変更になる場合も、例えば「監視対象Aの ログ出力」というメソッドを用意して、Aの値によって出力する/しないを 判断すれば問題ないでしょう。 あと、「何か他の方法」とはソース内に(該当箇所に)ログ出力コードを埋め込まず、 他の方法で監視するということでしょうか? 監視対象をグローバルにしておけば、タイマーイベントか何かきっかけさえあれば 可能かもしれませんが、5万行もあるシステムのローカル変数をグローバルに 変更するのは、ちょっと現実的ではありませんね。 ログは所詮1行埋め込むだけなので、そう可読性は下がらないと思いますが。

aneja
質問者

お礼

早速のご回答、どうもありがとうございました。 あまり知識がなく申し訳ありませんが、「監視対象Aのログ出力」メソッドを使って、「100回のループで同じワーニングメッセージを出すのはうっとおしいので、最初の1回だけ出力させる」ことも簡単にできますか? あと、「何か他の方法」とは、おっしゃるとおりの意図でしたが、あまり可読性は下がらないとのことで、安心しました。 (このヘンが、経験不足で予想できないのです。。)

関連するQ&A

  • 1行ずつではなくまとめてファイル出力したいのですが

    Cは初心者です。というかプログラム自体ずぶの素人です。 パラメーター1パラメーター2パラメーター3を使って計算をし、結果として パラメーター1,パラメーター2,パラメーター3,数値2,数値3,数値4,数値5,数値6,数値7 というような形式で1行ファイル出力をし、 パラメーターを変えて(for文)またファイル出力をし、とかなりの回数繰り返す計算をしております。 (元々AWKで動いていた自作プログラムの移植です) 現在、 #include <fstream> ofstream file1("c:\\data.csv",ios_base::app |ios_base::out) ; file1 << parameter1 << "," << parameter2 << ~中略~ << "," << value1 << "," << value2 << "," << ~中略~ "\n" ; のようにファイル出力しているのですが、ファイルサイズがでかくなってくると、もの凄く遅くなります。 ひょっとして、ファイルオープン→ファイル末尾まで開く→1行書き込む→ファイルクローズ→ の繰り返しで、だからファイルが大きくなると遅くなるのではないかという気がしているのですが、 何行も(1000行とか1万行とか5万行とか)一気に出力する方法はないでしょうか? まず、どうやってデータを溜め込み、次にどういう出力方法があるのか、教えていただけないでしょうか。 parameter1~Value7(本当は倍以上ありますが)をそれぞれ全て配列にし、ファイルをオープンして閉じずにfor文で書き込む、なんてのも考えたのですが、どうしたら良いか判らずギブアップです。 もうちょっとスマートに、file1のところを配列にするとか、file1にどんどんデータを書き加えて巨大な一文にしてしまうとか、何か方法はないでしょうか? なお、cはマイクロソフトが只で配っているVisual Studio の VisualC++ Express Editionを、よく判らないまま使用しております。 先週ダウンロードしましたので、おそらく最新版だと思います。 ポインタの辺りは、理屈は解りましたがスラスラ使いこなせるということはなく、他人のソースを見てもよく判らない状態です。 というか、どこまで書き換えて良い文字で、どこまでが標準関数(?)等の書き換えられない文字かもよく解っていないレベルです。 よろしくお願いいたします。

  • 再度 PHPのSYSLOG出力方法

    いつもお世話になっています。 昨日PHPでSYSLOGの出力方法について質問させて頂いたものです。 (1)ループ外でopenlog,closelog、ループ内でsyslogする (2)ループ内でopenlog,syslog,closelogをやる ひとつの処理で複数ファイルに出力する場合、 (2)の方法でいっぺんにまとめて出そうと思い、 openlog("goo_gn_syslogtest" ,LOG_CONS | LOG_NDELAY, LOG_LOCAL5); syslog(LOG_INFO, "test\ntest2"); closelog(); と$messageに改行コードを入れると、ログ内に test#012test2 と書かれていました。 設定で、$messageの後は改行がされる事になっています。 一行一行出力するsyslogに対してはまとめて出力する事は不可能なのでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP
  • ループ内でsyslog出力

    いつもお世話になっております。 標題についてご教授願えないでしょうか。 今までfwrite等でファイルに出力していた内容を SYSLOGにて出力する事となりました。 その際、これまでfor(i=0; ・・・)等のループ内で ファイル出力して、ループを抜けたらfclose()としていた処理で、 同様の処理が出来るが教えて頂きたいです。 纏めと、ループ内のfwriteをsyslogに変更 openlogとcloselogはループ外

    • ベストアンサー
    • PHP
  • 処理結果(標準出力と標準エラー出力)をファイルと画面の両方に出力する方

    処理結果(標準出力と標準エラー出力)をファイルと画面の両方に出力する方法はありますか? 当方 処理結果(標準出力と標準エラー出力)をファイルに出力する際に iroirona_command > log.log 1>&2 ・・・ファイルに出力されるが画面には表示されない。 iroirona_command ・・・画面には表示されるがファイルには出力されない。 と書いて標準出力と標準エラー出力を出力させているのですが、 ファイルと画面の2つの出力先に出力したいと考えています。 可能なのでしょうか? 環境 Windows XP SP3

  • mod_plsql使用時のDBMS_OUTPUT.PUT_LINEの出力先

    DBMS_OUTPUT.PUT_LINEを使用してデバッグメッセージを出力しようとしましたが、肝心の出力先がわからず困り果てています。 内部で使用しているApacheの設定ファイルへの記述ではないか、と当たりをつけてはみたものの、情報が少なく解決には至りませんでした。 現在Apacheのlogsディレクトリに出力されているファイルは、access.logとerror.log(とsslのログ)です。 見るべき情報ソース、パラメータの名前、設定値等ご存知の方はいらっしゃいませんでしょうか。

  • 振幅スペクトルから音圧レベルへの変換

    先日、マイクロホンを用いて音の計測を行いました。 マイクロホンのAC出力に対し、FFT処理を施し、振幅スペクトル[dBV]を得ました。 その値(例えば-40[dBV])を音圧レベル[SPL]に変換する際に 20log(x)=-40 x=10^(-40/20) =0.01 20log(0.01/(20*10^-6))≒54[SPL] という計算を行ったのですが、この計算式に自信がありません。 この分野にお詳しい方がいましたら、ご指摘して頂けると非常に助かります。 どうぞよろしくお願いいたします。

  • Perlからsyslog経由でログを出力したい

    皆さん、こんにちは。 Perlからsyslog経由でログを出力しようと考えています。 2点質問がありますのでご存知でしたらご教授ください。 (1)Perlスクリプトからsyslog経由でログ出力する方法 いろいろ方法は考えられるかと思いますが、 よく使われるエレガントな方法をご教授していただけるとありがたいです。 通常はやはりloggerを使うのでしょうか? (2)syslog経由で任意のファイルに出力する方法 syslogで、あるプログラムからのログにおいて、 このレベルはこのファイルという分け方はできますか? できなければ別の手段はありませんか? syslog-ngであればこのようなことができるのでしょうか? もしできれば方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • vbsで同一ファイルに出力するには

    お世話になります。 vbsでログ出力プログラムを作成しています。 このプログラムは同時に複数のプログラムから呼び出されます。 同時書込みの試験をしていた所、2番目に実行したログ出力プログラムでログ出力に 失敗してしまいました。 ###試験方法### ファイルのオープンとクローズの間にmsgboxを実行し、オープン中を維持した状態で、 ログ出力プログラムを実行し、追記処理を行いました。 ###質問内容### 同時書込みは可能でしょうか。 可能な場合、その方法をご教授頂けますでしょうか。 よろしくお願いいたします。

  • ファイル出力(ログ)

    javascriptが持っている変数をログ用にファイル出力したいのですが、 何か方法ありますでしょうか。 作っている時だけ出力できればいいので、どんな方法でも良いのですが。 宜しくお願いします。

  • rdコマンドでログ出力方法

    バッチファイルのrdコマンドでログを出力させたいのですが、ログが出力されません エラー出力は出力されるのですが、標準出力が出力されず、困っています 以下フォルダ構成 -sample.bat -test -log.txt 以下、バッチのサンプルです sample.bat rd /s /q test >> log.txt testフォルダは削除されるのですが、ログに処理内容が記述されず困っています。 また、エラー出力 rd /s /q test2 >> log.txt 2>&1 とするとエラー結果がlog.txtに出力されます。 正常に処理されたときの出力方法ご存知の方いらっしゃいましたらご教授ください よろしくお願いいたします

専門家に質問してみよう