Symfoware

Symfowareについての考察blog

TextWriterTraceListenerで、ファイルの内容が出力されない

はまったのでメモ。

C#でログファイルを出力するのは、TraceSourceを使用するのがおしゃれみたいです。
テキストファイルにログを出力するサンプルを作成してみました。


  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. public class Sample {
  5.     public static void Main(string[] args) {
  6.     
  7.         TraceSource log = new TraceSource("Log", SourceLevels.All);
  8.         TextWriterTraceListener listener = new TextWriterTraceListener("test.log", "LogFile");
  9.         log.Listeners.Add(listener);
  10.         log.TraceEvent(TraceEventType.Error, 0, "重大なエラーが発生しました");
  11.         log.Flush();
  12.     }
  13. }




何度実行しても、test.logというファイルは出力されるのですが、
ファイルに内容が出力されない。

使うの、諦めようかと思っていた時・・・

ASP.NETでTraceListenerでログをファイル出力する
http://d.hatena.ne.jp/sodomojo/20110728/1311815591


実は、サンプルのプログラムは普通のテキストエディタで作成し、
csc.exeでコンパイルして実行していました。

C# バッチファイルでソースをコンパイルする

「Trace」というキーワードで調べたところ、

TextWriterTraceListener クラス
http://www.weblio.jp/content/TextWriterTraceListener


C# でトレースを有効にするには、コードのコンパイル時に /d:TRACE フラグをコンパイラのコマンド ラインに追加するか、#define TRACE をファイルの最上部に挿入します。




なるほど。そういうことなら


  1. #define TRACE
  2. using System;
  3. using System.Diagnostics;
  4. using System.IO;
  5. public class Sample {
  6.     public static void Main(string[] args) {
  7.     
  8.         TraceSource log = new TraceSource("Log", SourceLevels.All);
  9.         TextWriterTraceListener listener = new TextWriterTraceListener("test.log", "LogFile");
  10.         log.Listeners.Add(listener);
  11.         log.TraceEvent(TraceEventType.Error, 0, "重大なエラーが発生しました");
  12.         log.Flush();
  13.     }
  14. }




#define TRACEをソースの先頭に書いて再度コンパイル&実行すると、
ちゃんとファイルの内容が出力されました。

わからんって。





ログの文字コード



ついでなので、ログファイルの文字コードがUTF-8で出力されるので、
MS932で出力できるか試してみます。

こちらを参考にしました。
http://dobon.net/vb/dotnet/programing/tracelisteners.html
http://dobon.net/vb/dotnet/file/writefile.html



  1. #define TRACE
  2. using System;
  3. using System.Diagnostics;
  4. using System.IO;
  5. public class Sample {
  6.     public static void Main(string[] args) {
  7.     
  8.         TraceSource log = new TraceSource("Log", SourceLevels.All);
  9.         TextWriterTraceListener listener = new TextWriterTraceListener("test.log", "LogFile");
  10.         
  11.         StreamWriter sw = new StreamWriter("test.log", true, System.Text.Encoding.GetEncoding(932));
  12.         //自動的にフラッシュされるようにする
  13.         sw.AutoFlush = true;
  14.         //スレッドセーフラッパを作成
  15.         TextWriter tw = TextWriter.Synchronized(sw);
  16.         //名前を LogFile としてTextWriterTraceListenerオブジェクトを作成
  17.         TextWriterTraceListener twtl = new TextWriterTraceListener(tw, "LogFile");
  18.         //リスナコレクションに追加する
  19.         log.Listeners.Add(twtl);
  20.         
  21.         log.TraceEvent(TraceEventType.Error, 0, "重大なエラーが発生しました");
  22.         log.Flush();
  23.     }
  24. }








独自形式のログ出力



How does System.TraceListener prepend message with process name?
http://stackoverflow.com/questions/2826211/how-does-system-tracelistener-prepend-message-with-process-name

こちらを参考に、独自形式のログ出力方法を調べてみます。



  1. #define TRACE
  2. using System;
  3. using System.Diagnostics;
  4. using System.IO;
  5. public class Sample {
  6.     public static void Main(string[] args) {
  7.     
  8.         TraceSource log = new TraceSource("Log", SourceLevels.All);
  9.         
  10.         StreamWriter sw = new StreamWriter("test.log", true, System.Text.Encoding.GetEncoding(932));
  11.         //自動的にフラッシュされるようにする
  12.         sw.AutoFlush = true;
  13.         //スレッドセーフラッパを作成
  14.         TextWriter tw = TextWriter.Synchronized(sw);
  15.         //名前を LogFile としてTextWriterTraceListenerオブジェクトを作成
  16.         //TextWriterTraceListener twtl = new TextWriterTraceListener(tw, "LogFile");
  17.         
  18.         //独自のロガーを設定
  19.         MyLogger twtl = new MyLogger(tw, "LogFile");
  20.         
  21.         //リスナコレクションに追加する
  22.         log.Listeners.Add(twtl);
  23.         
  24.         log.TraceEvent(TraceEventType.Warning, 0, "独自のメッセージ");
  25.         log.Flush();
  26.     }
  27. }
  28. public class MyLogger : TextWriterTraceListener {
  29.     public MyLogger(TextWriter file, string name) :base(file, name) {
  30.     }
  31.     public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) {
  32.         WriteLine(message);
  33.     }
  34. }




TextWriterTraceListenerを継承したクラスを作成。
TraceEventをoverrideして、出力するメッセージを変更します。

実行してみると、狙い通りの出力が得られました。


独自のメッセージ


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2012/12/24(月) 17:39:39|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<C# 固定長ファイルの読み込み | ホーム | C# 日付の置換、フォーマットの位置を指定する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1058-1c61dd2c
この記事にトラックバックする(FC2ブログユーザー)