none
My.Application.Logを使用したファイルログ出力で、出力先ディレクトリが存在しない場合にエラー検知したい RRS feed

  • 質問

  • お世話になります。

    Visual Studio 2015でコンソールアプリを開発しております。

    言語: VB.NET
    フレームワーク: .NET Framework 4.5.2
    OS: Windows 7 Professional SP1 64bit


    ログ出力のため、DelimitedListTraceListenerを使用してApp.configに下記を記述し、ログファイルが正常に出力されております。

    App.config:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      </startup>
    
      <system.diagnostics>
        <sources>
          <source name="DefaultSource" switchName="DefaultSwitch">
            <listeners>
              <add name="EventLog" />
            </listeners>
          </source>
        </sources>
        <switches>
          <add name="DefaultSwitch" value="Information" />
        </switches>
        <sharedListeners>
          <add name="EventLog"
            type="System.Diagnostics.DelimitedListTraceListener, 
                  System, Version=2.0.0.0, 
                  Culture=neutral, PublicKeyToken=b77a5c561934e089"
             initializeData="log\APPNAME.log"/>
        </sharedListeners>
      </system.diagnostics>
    
    </configuration>
    参考URL:
    https://msdn.microsoft.com/ja-jp/library/system.diagnostics.delimitedlisttracelistener(v=vs.110).aspx


    上記のinitializeDataで指定したディレクトリが存在しない、またはアクセス権が無い場合にエラーメッセージを表示させたいのですが、手動でフォルダ名変更やフォルダ削除を行ってから、アプリケーションを実行してもログ書込みが行われないだけでエラーは発生しません。
    このようなログ書込み失敗時にエラー検知する方法はございますでしょうか。


    • 編集済み trhs 2016年11月2日 8:10
    2016年11月2日 8:05

回答

  • My.Application.Log.TraceSource.Listenersにリスナの一覧が登録されているようなので、起動直後にリスナの状態をみて書き込みできない状態になっていないか調べてみるとか

    Module Module1
    
        Sub Main()
            For Each listener As System.Diagnostics.TraceListener In My.Application.Log.TraceSource.Listeners
                If (TypeOf listener Is System.Diagnostics.TextWriterTraceListener) Then
                    Dim twl = CType(listener, System.Diagnostics.TextWriterTraceListener)
                    If (twl.Writer Is Nothing) Then 'ディレクトリがなかったりすると書き込み先のTextWriterが作られない
                        'twl.Writer = System.Console.Error
                        Throw New ApplicationException("リスナー書き込み先の作成が失敗しています")
                    End If
                End If
            Next
            My.Application.Log.WriteEntry("テスト")
        End Sub
    
    End Module


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク trhs 2016年11月4日 1:05
    2016年11月2日 8:58

すべての返信

  • DelimitedListTraceListenerクラスのログ出力部分を確認しましたが、ファイルを作成できなかった場合は諦めるようになっていました。どうしてもエラーを発生させたい場合はDelimitedListTraceListener相当のクラスを自作する必要があります。
    2016年11月2日 8:44
  • My.Application.Log.TraceSource.Listenersにリスナの一覧が登録されているようなので、起動直後にリスナの状態をみて書き込みできない状態になっていないか調べてみるとか

    Module Module1
    
        Sub Main()
            For Each listener As System.Diagnostics.TraceListener In My.Application.Log.TraceSource.Listeners
                If (TypeOf listener Is System.Diagnostics.TextWriterTraceListener) Then
                    Dim twl = CType(listener, System.Diagnostics.TextWriterTraceListener)
                    If (twl.Writer Is Nothing) Then 'ディレクトリがなかったりすると書き込み先のTextWriterが作られない
                        'twl.Writer = System.Console.Error
                        Throw New ApplicationException("リスナー書き込み先の作成が失敗しています")
                    End If
                End If
            Next
            My.Application.Log.WriteEntry("テスト")
        End Sub
    
    End Module


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク trhs 2016年11月4日 1:05
    2016年11月2日 8:58
  • gekka様

    教えていただいたコードで実現できました!

    本当にありがとうございました。

    2016年11月4日 1:04