注意:My.Application.Logは、.NET Framework 2.0以降のVB.NETでのみ使用できます。それ以外では、TraceSourceを使用します。TraceSourceに関して詳しくは、「TraceSourceを使用してトレースを行う」をご覧ください。
My.Application.Logを使うことにより、ログへの書き込みなどのトレースをより簡単に行うことができます。
Log.WriteEntryメソッドで文字列のメッセージを書き込むことができます。また、Log.WriteExceptionメソッドで例外情報を書き込むことができます。書き込み先のログファイルのパスは、デフォルトでは、
C:\Documents and Settings\username\Application Data\CompanyName\ProductName\ProductVersion\ProductName.log
のような場所になります(注)。また、Visual Studioの出力ウィンドウにも出力されます。
注:ログファイルのパスは変更することができます。ファイル名には日付やバージョンなどが付加される場合があります。これらに関しては、後述します。
また、書き込み先のファイルのパスは、
My.Application.Log.DefaultFileLogWriter.FullLogFileName
で取得できます。
以下にこれらのメソッドを使用した具体的な例を示します。
'メッセージを書き込む My.Application.Log.WriteEntry("テストです。") '例外情報を書き込む '通常はTry...Catch...のCatch内や、UnhandledExceptionイベントハンドラで使用する My.Application.Log.WriteException(New Exception("エラーです。"))
上のコードを実行した結果、下記のように出力されます。
DefaultSource Information: 0 : テストです。 DefaultSource Error: 2 : エラーです。
ログファイルへの出力では、書き込まれるメッセージはファイルの末尾に追加されていきます。追加書き込みしないようにしたり、ログファイルのサイズを制限したりする方法は、後述します。
My.Application.Logについて、もう少し詳しく説明しましょう。
My.Application.LogはTraceSourceクラスの機能を使っており、TraceSourceをより簡単に扱うためのものと考えてよいでしょう。TraceSourceについては、「TraceSourceを使用してトレースを行う」で説明しています。これ以降は、TraceSourceに関する知識があるものとして進めます。
My.Application.Logで使用しているTraceSourceオブジェクトは、Log.TraceSourceプロパティで取得できます。
Log.WriteEntryメソッドは、TraceSource.TraceEventメソッドを呼び出しているだけです。Log.WriteEntryメソッドを呼び出したときにメッセージの種類を省略すると、TraceEventType.Informationになります。メッセージのIDを省略すると、メッセージの種類によって以下のような数字が使用されます。
| メッセージの種類 | 既定のID |
|---|---|
| Information | 0 |
| Warning | 1 |
| Error | 2 |
| Critical | 3 |
| Start | 4 |
| Stop | 5 |
| Suspend | 6 |
| Resume | 7 |
| Verbose | 8 |
| Transfer | 9 |
Log.WriteEntryメソッドもまた、TraceSource.TraceEventメソッドを呼び出しています。このとき、メッセージを例外のメッセージ(Exception.Messageプロパティ)とします。メッセージの種類を省略して呼び出すと、TraceEventType.Errorになります。
My.Application.Logには既定で、2つのリスナが登録されています。1つはTraceSourceでの既定で登録されているDefaultTraceListenerで、もう1つはFileLogTraceListenerです。
FileLogTraceListenerは、テキストファイルにログを出力するためのリスナです。このクラスがMicrosoft.VisualBasic.Logging名前空間にあることを考えると、このクラスはMy.Application.Logのためのリスナといえそうです。
My.Application.LogのDefaultFileLogWriterプロパティにより、FileLogTraceListenerオブジェクトにアクセスすることができます。
My.Application.LogはTraceSourceを使っていますので、「TraceSourceを使用してトレースを行う」で説明したのと同じ方法で、アプリケーション構成ファイルに設定を記述できます。ただし、My.Application.LogではTraceSourceの名前は「DefaultSource」となります。
実は、Visual Studioでは、メニューの「プロジェクト」-「新しい項目の追加」でアプリケーション構成ファイルを追加したときに(または別の方法で追加されたときも)、その中身は次のようになっており、すでにMy.Application.Logの設定に関する記述が書かれています。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<sources>
<!-- このセクションでは、My.Application.Log のログ構成を定義します。 -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog"/>
<!-- アプリケーション イベント ログに書き込むには、以下のセクションのコメントを解除します -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"/>
<!-- アプリケーション イベント ログに書き込むには、以下のセクションのコメントを解除して、APPLICATION_NAME をアプリケーション名に置き換えます -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
</configuration>
あとはこれをちょっと変更してあげればよいだけです。
これ以降は、このアプリケーション構成ファイルを変更することにより、様々な設定を実際に変更してみます。
ログの保存場所を変更するには、FileLogTraceListener.Locationプロパティを変更します。Locationプロパティに指定できるLogFileLocation列挙体のメンバの意味は、次のとおりです(ヘルプから抜粋)。
| LogFileLocation列挙体のメンバ名 | 説明 |
|---|---|
| CommonApplicationDirectory | すべてのユーザーが共有するアプリケーション データのパスを使用します。 |
| Custom | CustomLocationに空以外の文字列が指定されている場合、そのパスが使用されます。それ以外の場合は、ユーザーのアプリケーション データのパスが使用されます。 |
| ExecutableDirectory | アプリケーションを開始した実行可能ファイルのパスを使用します。 |
| LocalUserApplicationDirectory | ユーザーのアプリケーション データのパスを使用します。 |
| TempDirectory | 現在のシステムの一時フォルダのパスを使用します。 |
ログの保存場所を任意の場所に設定するには、FileLogTraceListener.LocationプロパティをCustomにして、CustomLocationプロパティに保存場所のパスを指定します。
例えば、ログが「C:\」に作成されるようにするには、先に紹介したアプリケーション構成ファイルのsharedListeners要素内のadd要素を次のように変更します。
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"
location="Custom"
customlocation="C:\"/>
ログのファイル名を変更するには、FileLogTraceListener.BaseFileNameプロパティを変更します。ただし、拡張子には必ず「.log」が付きます。
下の例では、ログファイル名を「test.log」に変更しています。
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"
basefilename="test"/>
通常は、ログは1つのファイルに保存され、次々とファイルの末尾に書き込まれていきます。アプリケーション開始時にログファイルが存在していても、これに追加保存されます。
ログファイルを開くときに追加書き込みしないで、上書きで保存するようにするには、FileLogTraceListener.Appendプロパティをfalseにします。
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"
append="false"/>
FileLogTraceListener.LogFileCreationScheduleプロパティをDailyにすることにより、ログファイルを日付別に作成することができます。週別に作成するには、Weeklyを指定します。LogFileCreationScheduleを変更すると、ファイル名の最後に日にちが付加されます。
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"
logfilecreationschedule="Daily"/>
FileLogTraceListener.MaxFileSizeプロパティにより、ログファイルの最大サイズを指定することができます。最大サイズを超えた場合は、ログへの書き込みが無視されます。最大サイズを超えたときに例外がスローされるようにするには、DiskSpaceExhaustedBehaviorプロパティをThrowExceptionに変更します。
また、FileLogTraceListener.ReserveDiskSpaceプロパティにより、確保すべき空きディスク容量を指定できます。空きディスク容量が指定した値よりも少なくなるときの挙動は、MaxFileSizeプロパティの場合と同じです。
FileLogTraceListener.Delimiterプロパティにより、区切り文字列を変更できます。既定の区切り文字列は、タブ文字です。
例えば、Delimiterプロパティを「,」に変更したとき、ログファイルには次のように出力されるようになります。
DefaultSource,Information,0,テストです。 DefaultSource,Error,2,エラーです。
デフォルトでは、FileLogTraceListenerは自動的にフラッシュしませんので、My.Application.Log.WriteEntryメソッドなどを呼び出してもすぐにはログに書き込まれません。バッファ内のデータをフラッシュしてログに書き込むには、Flashメソッドを呼び出します。
'FileLogTraceListenerだけをフラッシュ My.Application.Log.DefaultFileLogWriter.Flush() 'すべてのリスナをフラッシュ My.Application.Log.TraceSource.Flush()
このように明示的にFlashメソッドを呼び出さなくても自動的にフラッシュされるようにするには、FileLogTraceListener.AutoFlushプロパティをTrueにします。
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"
autoflush="true"/>