DOBON.NET

My.Application.Logを使用してトレースする、ログに書き込む

注意: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

で取得できます。

以下にこれらのメソッドを使用した具体的な例を示します。

VB.NET
コードを隠すコードを選択
'メッセージを書き込む
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
Information0
Warning1
Error2
Critical3
Start4
Stop5
Suspend6
Resume7
Verbose8
Transfer9

Log.WriteEntryメソッドもまた、TraceSource.TraceEventメソッドを呼び出しています。このとき、メッセージを例外のメッセージ(Exception.Messageプロパティ)とします。メッセージの種類を省略して呼び出すと、TraceEventType.Errorになります。

FileLogTraceListenerについて

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すべてのユーザーが共有するアプリケーション データのパスを使用します。
CustomCustomLocationに空以外の文字列が指定されている場合、そのパスが使用されます。それ以外の場合は、ユーザーのアプリケーション データのパスが使用されます。
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メソッドを呼び出します。

VB.NET
コードを隠すコードを選択
'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"/>

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。
共有する

この記事への評価

この記事へのコメント

この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。