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

質問
-
お世話になります。
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
回答
-
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
すべての返信
-
DelimitedListTraceListenerクラスのログ出力部分を確認しましたが、ファイルを作成できなかった場合は諦めるようになっていました。どうしてもエラーを発生させたい場合はDelimitedListTraceListener相当のクラスを自作する必要があります。
-
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