C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: ログの処理


(過去ログ 35 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■17938 / inTopicNo.1)  ログの処理
  
□投稿者/ tanaka (31回)-(2008/05/04(Sun) 20:43:51)

分類:[C#] 

ログ処理において現在以下のような処理をさせています。

その都度ファイルへ書き込み処理をしているので負荷等考えた場合あまりいい方法
ではないと思っているのですがなにかいい方法があればご意見お願い致します。
(起動時とかは特にログ数が多いです)

また現在は追記で書き込みしていますがやはり新しいログを最初のほうに書き込み
したいです。

ちなみに今考えてる方法はとりあえずファイルに書き込みをせず、リングバッファ
(string配列)に書き込み、上限数を設けて(例えば1000件までとか)オーバー分は
古いほうから削除していきファイルに書き込みさせた場合はbuttonを押して処理させる。

【現在】
・日付単位でファイルを生成し追記
・各クラスからはLog.Save("message");でコール
・コールされる度にファイルへの書き込み処理
・今後はフォーム等でログファイルの内容を表示させたい

// logData=ログの内容
public class Log
{
    public static void Save(string logData)
    {
        string logFile = string.Format("\\{0:yyyyMMdd}.log", DateTime.Now);
        StreamWriter sw = 
            new StreamWriter((new FileStream(logFile, FileMode.Append)),Encoding.Default);
        sw.Write(logData);
        sw.Close();
    }
}

引用返信 編集キー/
■17939 / inTopicNo.2)  Re[1]: ログの処理
□投稿者/ ネタ好き (201回)-(2008/05/04(Sun) 20:49:07)
No17938 (tanaka さん) に返信
今の情報から判断するに、単純にファイルバッファを使えばいいと思います。
あと、ログといっても色々なものがありますので、もっと情報を追加した方が答えてくれると思います。
引用返信 編集キー/
■17940 / inTopicNo.3)  Re[1]: ログの処理
□投稿者/ はつね (636回)-(2008/05/04(Sun) 21:23:38)
No17938 (tanaka さん) に返信
> その都度ファイルへ書き込み処理をしているので負荷等考えた場合あまりいい方法
> ではないと思っているのですがなにかいい方法があればご意見お願い致します。

ログの使い方にもよりますが、ログは極力バッファリングせず書き出していた方が
良いと思います。場合によってはバッファリングして書き出す前に問題が発生して
異常終了などがおこったときに、該当箇所が判明しやすいと考えるからです。


> また現在は追記で書き込みしていますがやはり新しいログを最初のほうに書き込み
> したいです。

それはビューワー側で工夫した方がログ出力側が簡単になります。
つまり、ログ出力絡みの問題が発生しづらくなります。

引用返信 編集キー/
■17941 / inTopicNo.4)  Re[2]: ログの処理
□投稿者/ tanaka (32回)-(2008/05/04(Sun) 21:58:03)
> ログの使い方にもよりますが、ログは極力バッファリングせず書き出していた方が
> 良いと思います。場合によってはバッファリングして書き出す前に問題が発生して
> 異常終了などがおこったときに、該当箇所が判明しやすいと考えるからです。
当方もその辺を考慮して現在の処理にしていました。ただこの場合ファイルのサイズが
大きくなってしまうかその対処として複数のファイルにすることになると思うのでそれも
どうなのかなと思ってます。ただログ数はそんなに無いはずですけど。

>>また現在は追記で書き込みしていますがやはり新しいログを最初のほうに書き込み
>>したいです。
> それはビューワー側で工夫した方がログ出力側が簡単になります。
> つまり、ログ出力絡みの問題が発生しづらくなります。
通常はビューワー側で対処するものなのでしょうか。
確かに将来的にはビューワー相当のものを作りますが現状はログファイルをテキストエディタで
参照しているのでちょっと不便を感じてます。
引用返信 編集キー/
■17943 / inTopicNo.5)  Re[3]: ログの処理
□投稿者/ ネタ好き (202回)-(2008/05/04(Sun) 22:10:27)
No17941 (tanaka さん) に返信
まずログがどういうものか定義するのが大事です。
そのようにして【何の情報】を【どういう条件】でログをするのかが重要となります。
ログは慎重将来を見据えてに定義しておかないと、後から何の情報なのかさっぱり分からなくなります。
その点ちゃんとメタ情報を定義しておくと、後からいくらでも加工できます。
引用返信 編集キー/
■17944 / inTopicNo.6)  Re[4]: ログの処理
□投稿者/ tanaka (33回)-(2008/05/04(Sun) 22:32:11)
No17943 (ネタ好き さん) に返信
> ■No17941 (tanaka さん) に返信
> まずログがどういうものか定義するのが大事です。
> そのようにして【何の情報】を【どういう条件】でログをするのかが重要となります。
> ログは慎重将来を見据えてに定義しておかないと、後から何の情報なのかさっぱり分からなくなります。
> その点ちゃんとメタ情報を定義しておくと、後からいくらでも加工できます。
ログは例外が発生した場合(try catch)と特定の処理を実行した時に残すようにしています。

【ログのフォーマット】
yyyy/MM/dd HH:mm:ss.fff EorI クラス名:メッセージ内容
----------------------- ---- -------- --------------
      @      A   B      C

@:日時
A:E=エラー時
 :I=特定の処理時
B:ログを出力したクラス名
C:エラー内容又は特定処理時の変数データや処理結果


引用返信 編集キー/
■17945 / inTopicNo.7)  Re[5]: ログの処理
□投稿者/ ネタ好き (203回)-(2008/05/04(Sun) 22:54:35)
No17944 (tanaka さん) に返信
ログの仕様はちゃんとさだまっていますね。
それならば話しは早いですね。
まず考えられる手段はDataTable化して管理する事です。
そうすればドキュメントが紛失してもコードを読めばはっきりと分かりますし、
XML化も可能となり柔軟性が確保できます。さらに、ビューワーなどを作るのも容易となります。
一方テキストファイルの場合は、パーサーやフォーマット処理を作らないといけないのでちょっと面倒です。
ただしDataTableはメモリを食うという弱点がありますので、その辺の判断はtanaka さんにお任せします。
現状のテキストファイルの場合、処理年月日毎に分けるのが簡単でいいと思います。
この場合ログ専用のフォルダを作って、そこへ書き込めばいいと思います。
他にはLog4NETというものがあります。
参照http://www.atmarkit.co.jp/fdotnet/vblab/extcompo_01/log4net_01.html
今思いつくのはこんなところです。
ところで、Cは詳細なフォーマットは考えておられますか?
人間の可読性とプログラム処理の容易さは違いますので注意が必要です。
引用返信 編集キー/
■17946 / inTopicNo.8)  Re[6]: ログの処理
□投稿者/ tanaka (34回)-(2008/05/04(Sun) 23:25:39)
No17945 (ネタ好き さん) に返信
ご回答ありがとうございます。色々参考にしながら検証・検討してます。

> ところで、Cは詳細なフォーマットは考えておられますか?
> 人間の可読性とプログラム処理の容易さは違いますので注意が必要です。
特に決まったフォーマットではないですがとりあえず以下のようにしています。
もっと詳細フォーマットを考えるべきなのでしょうか。

【エラーの場合】
try catch              →メソッド名:例外メッセージをそのまま
処理中の範囲チェックやタイムアウト等→メソッド名:関係する変数値等

【特定の処理】
メソッド名:○○○処理終了しました。(例)
引用返信 編集キー/
■17947 / inTopicNo.9)  Re[7]: ログの処理
□投稿者/ ネタ好き (204回)-(2008/05/04(Sun) 23:31:32)
2008/05/04(Sun) 23:34:55 編集(投稿者)

No17946 (tanaka さん) に返信
もう少し詳細にした方がいいと思います。
もしテキストベースで処理をするのならば、改行やスペースなど色々と文字列の扱いが複雑になるからです。
あと、例外メッセージをそのまま表示するのは止めた方がいいと思います。
開発関係者だけに分かるようにした方がよいでしょう。
何故ならば、そこがセキュリティホールになりえますし、ソフトクラックの餌食となりやすいからです。
それに、デバッグ情報を取り除いたリリースモードではエラー行などは表示されませんので、メリットも危険に見合ったものでありません。
引用返信 編集キー/
■17948 / inTopicNo.10)  Re[5]: ログの処理
□投稿者/ やじゅ (342回)-(2008/05/04(Sun) 23:34:05)
やじゅ さんの Web サイト
No17944 (tanaka さん) に返信

NET Framework 2.0以降でログ書き込みならTraceSourceクラスを使うとか。
TraceSource.Flush で、一気に書き込みだったかな。
引用返信 編集キー/
■17949 / inTopicNo.11)  Re[3]: ログの処理
□投稿者/ はつね (637回)-(2008/05/05(Mon) 10:25:06)
はつね さんの Web サイト
No17941 (tanaka さん) に返信
> 当方もその辺を考慮して現在の処理にしていました。ただこの場合ファイルのサイズが
> 大きくなってしまうかその対処として複数のファイルにすることになると思うのでそれも
> どうなのかなと思ってます。ただログ数はそんなに無いはずですけど。

ファイルサイズを問題にするのであれば日付事に別ファイルとなるようにファイル名や
過去ログファイルの移動なども考慮すると良いと思います。
IISのw3cなログがどのようにファイルを分けているかも参考になるかも。


> 通常はビューワー側で対処するものなのでしょうか。
> 確かに将来的にはビューワー相当のものを作りますが現状はログファイルをテキストエディタで
> 参照しているのでちょっと不便を感じてます。

ログの構造は簡単にして、人の見易さはビューワーで対応するものだと考えています。
なぜならば、見易さは調べる人や調べたい事によって変わるからです。

引用返信 編集キー/
■17955 / inTopicNo.12)  Re[8]: ログの処理
□投稿者/ tanaka (35回)-(2008/05/05(Mon) 22:20:35)
No17947 (ネタ好き さん) に返信
> 2008/05/04(Sun) 23:34:55 編集(投稿者)
> 
> ■No17946 (tanaka さん) に返信
> もう少し詳細にした方がいいと思います。

> もしテキストベースで処理をするのならば、改行やスペースなど色々と文字列の扱いが複雑になるからです。
今はテキストにしていますが今後ビューワ作成などを考えた場合csv形式の方がいいのかと思っているの
ですがログに残す場合どちらがいいのでしょうか。可読性でテキストにしてます。

> あと、例外メッセージをそのまま表示するのは止めた方がいいと思います。
> 開発関係者だけに分かるようにした方がよいでしょう。
> 何故ならば、そこがセキュリティホールになりえますし、ソフトクラックの餌食となりやすいからです。
> それに、デバッグ情報を取り除いたリリースモードではエラー行などは表示されませんので、メリットも危険に見合ったものでありません。
とても参考になりました。この点は改善してきます。

引用返信 編集キー/
■17956 / inTopicNo.13)  Re[4]: ログの処理
□投稿者/ ネタ好き (205回)-(2008/05/05(Mon) 22:36:25)
2008/05/05(Mon) 23:01:50 編集(投稿者)

No17941 (tanaka さん) に返信
人間の可読性と機械の可読性は違いますので大変奥深い問題です。
CSVにした場合、説明文のコンマや数値のコンマをどうするのかが問題となってきます。
私は端末のログ解析の仕事をした事があるのですが、その際それが問題となって大変困ったことがあります。
見た目はエラーが無いのに、売り上げ金額などの処理結果が予想と違うのです。
その原因はログのフォーマット変更によりコンマがデータに紛れ込んだせいでした。
今掲示板を読んでいる時は冷静で、なおかつその点に注目しているので「すぐ分かる事」だと思うでしょうが、
システム全体として他人と一緒に作業していると意外と困ります。
ですから、区切り文字ではなく区切り文字列がいいでしょう。
しかし区切り文字列は見た目が悪いです。
従って、使用されない非表示の区切り文字列を使えばいいと思います。
そうすれば人間も機械も良いかと思います。


もしくは、いっそうの事ログを専用の管理ソフトを使って「見るものだと」という仕様にすれば楽かもしれませんね。

追記
見えても我慢できる程度の文字列にするのも手です。
例えば(@_@)とか、終劇とかねw
引用返信 編集キー/
■17965 / inTopicNo.14)  Re[5]: ログの処理
□投稿者/ tanaka (36回)-(2008/05/06(Tue) 20:51:30)
No17956 (ネタ好き さん) に返信
> 2008/05/05(Mon) 23:01:50 編集(投稿者)

ネタ好き様ありがとうございます。

CSVにした際の問題点とても参考になりました。
現在は区切りはスペースでやってますがご指摘のように何か別の文字列
にする案も検討してみたいと思います。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -