2 using System.Collections.Generic;
5 using System.Diagnostics;
9 public class CTraceLogListener : TraceListener
11 public CTraceLogListener( StreamWriter stream )
13 this.streamWriter = stream;
16 public override void Flush()
18 if( this.streamWriter != null )
22 this.streamWriter.Flush();
24 catch( ObjectDisposedException )
29 public override void TraceEvent( TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message )
31 if( this.streamWriter != null )
35 this.tイベント種別を出力する( eventType );
37 SanitizeUsername( ref message );
38 this.streamWriter.WriteLine( message );
40 catch( ObjectDisposedException )
45 public override void TraceEvent( TraceEventCache eventCache, string source, TraceEventType eventType, int id, string format, params object[] args )
47 if( this.streamWriter != null )
51 this.tイベント種別を出力する( eventType );
53 string message = string.Format(format, args);
54 SanitizeUsername( ref message );
55 this.streamWriter.WriteLine( message );
57 catch( ObjectDisposedException )
62 public override void Write( string message )
64 if( this.streamWriter != null )
68 this.streamWriter.Write( message );
70 catch( ObjectDisposedException )
75 public override void WriteLine( string message )
77 if( this.streamWriter != null )
81 this.streamWriter.WriteLine( message );
83 catch( ObjectDisposedException )
88 private string SanitizeUsername(ref string message)
90 string userprofile = System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
92 // もしユーザー名の情報が出力に存在する場合は、伏字にする
93 if (message.Contains(userprofile))
95 char delimiter = System.IO.Path.DirectorySeparatorChar;
96 string[] u = userprofile.Split(delimiter);
97 int c = u[u.Length - 1].Length; // ユーザー名の文字数
98 u[u.Length - 1] = "*".PadRight(c, '*');
99 string sanitizedusername = string.Join(delimiter.ToString(), u);
100 message = message.Replace(userprofile, sanitizedusername);
106 protected override void Dispose( bool disposing )
108 if( this.streamWriter != null )
112 this.streamWriter.Close();
117 this.streamWriter = null;
119 base.Dispose( disposing );
124 private StreamWriter streamWriter;
126 private void tイベント種別を出力する( TraceEventType eventType )
128 if( this.streamWriter != null )
132 var now = DateTime.Now;
133 this.streamWriter.Write( string.Format( "{0:D4}/{1:D2}/{2:D2} {3:D2}:{4:D2}:{5:D2}.{6:D3} ", new object[] { now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond } ) );
136 case TraceEventType.Error:
137 this.streamWriter.Write( "[ERROR] " );
140 case ( TraceEventType.Error | TraceEventType.Critical ):
143 case TraceEventType.Warning:
144 this.streamWriter.Write( "[WARNING] " );
147 case TraceEventType.Information:
153 this.streamWriter.Write( "[INFO] " );
155 catch( ObjectDisposedException )
160 private void tインデントを出力する()
162 if( ( this.streamWriter != null ) && ( base.IndentLevel > 0 ) )
166 for( int i = 0; i < base.IndentLevel; i++ )
167 this.streamWriter.Write( " " );
169 catch( ObjectDisposedException )