My.Application.Logを使用したファイルログ出力で、ログ出力先を変更しても、デフォルトの場所にフォルダが自動生成される

回答済み My.Application.Logを使用したファイルログ出力で、ログ出力先を変更しても、デフォルトの場所にフォルダが自動生成される

  • 2012年4月24日 11:26
     
      コードあり

    いつもお世話になっております。

    VB.NET 2010 で .NET Framework 4.0 のコンソールアプリケーションを作成しています。
    OSは、Windows 7 (Professional SP1 32bit) です。

    アプリログとしてファイルログを出力する必要があり、

    My.Application.Logを使用することになりました。

    そこでMSDNのヘルプを参考にapp.config を修正し、

    ログがファイルログに出力されることを確認しました。

    参考URL:

    http://msdn.microsoft.com/ja-jp/library/yhx0xwks.aspx

    app.config→sharedListeners→add name="FileLogListener"の中で

    type=…(略)…location="Custom" customlocation="c:\temp\"とすることで、

    ログファイルの出力先ディレクトリが設定でき、実際に"c:\temp\"配下にログが出力されることを確認しました。

    しかし、上記のようにログ出力先ディレクトリを設定しても、

    デフォルトのログ出力先であるフォルダが生成されてしまうことが分かりました。

    ※デフォルトのログ出力先フォルダ例

    C:\Users\ユーザ名\AppData\Roaming\ConsoleApplication1\ConsoleApplication1\1.0.0.0

    #ここにはログは出力されず、空っぽのフォルダのみ生成されます。

    ログ出力先は変更しており、上記フォルダは不要であるため、

    自動で生成されないようにしたいと考えておりますが、その方法を見つけることができませんでした。

    上記フォルダが生成されないようにするような方法はありますでしょうか?

    フリーソフトは導入の制限が厳しく、log4netも使用できない状況であるため、

    できればMy.Application.Logを使用してログファイルの出力を実現したいと考えております。

     恐れ入りますが、実現方法についてご教示いただけますと幸いです。

    以下は、app.configの内容と、ログを出力するコードを記述したModule1.vbの内容です。

    app.config:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.diagnostics>
            <sources>
                <!-- このセクションでは、My.Application.Log のログ構成を定義します。 -->
                <source name="DefaultSource" switchName="DefaultSwitch">
                    <listeners>
                      <add name="FileLogListener" />
                        <!-- アプリケーション イベント ログに書き込むには、以下のセクションのコメントを解除します -->
                        <!--<add name="EventLog"/>-->
                    </listeners>
                </source>
            </sources>
            <switches>
                <add name="DefaultSwitch" value="Information" />
            </switches>
            <sharedListeners>
              <add name="FileLogListener"
                  type="Microsoft.VisualBasic.Logging.FileLogTraceListener, 
              Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, 
              PublicKeyToken=b03f5f7f11d50a3a"
                  initializeData="FileLogListenerWriter"
                  location="Custom"
                  customlocation="c:\temp\" />
                <!-- アプリケーション イベント ログに書き込むには、以下のセクションのコメントを解除して、APPLICATION_NAME をアプリケーション名に置き換えます -->
                <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
            </sharedListeners>
        </system.diagnostics>
    </configuration>
    

    Module1.vb:

    Module Module1
    
        Sub Main()
            My.Application.Log.WriteEntry("ログのテスト", TraceEventType.Information)
    
        End Sub
    
    End Module
    

すべての返信

  • 2012年4月24日 13:23
     
     

    VB の My の仕様はさっぱりですが、VB 側で独自にリスナーを登録するような処理がないのであれば、app.config の source/listeners に add する前に、remove または clear を入れて、デフォルトリスナーを削除すれば解決しそうです。

    参考:http://msdn.microsoft.com/ja-jp/library/zh3a61fw.aspx

  • 2012年4月25日 9:00
     
     回答済み コードあり

    ご返信くださり誠にありがとうございます。

    しかし、上記のapp.configを以下のように書き換えて再実行しましたところ、

    <source name="DefaultSource" switchName="DefaultSwitch">
        <listeners>
            <clear/>
            <add name="FileLogListener" />
        </listeners>
    </source>
    

    残念ながら、変更前と同じくC:\Users\ユーザ名\AppData\Roaming配下にフォルダが自動生成されていましました。

    #removeの方も同様でした。

    また「Microsoft Visual Studio 2005 Express Edition 使用時の既知の問題」という以下のURLの記事にて、

    上記と似た現象について記述がありました。

    http://www.microsoft.com/japan/msdn/vstudio/express/support/knownIssues/

    --

    3.8   ユーザーにファイル I/O アクセス許可がない場合、My.Application.Log.WriteEntry が例外をスローすることがある」

    (略)

    ログ ファイルは D:\temp に作成されますが、ディレクトリ D:\Documents and
    Settings\<ユーザー名>\Application Data\Microsoft\WindowsApplication1\1.0.0.0
    が存在しない場合、このディレクトリも作成されます。

    (略)

    この問題を解決するには

    1) app.config を使用して既定の FileLogTraceListener を削除し、別の TraceListener を使用するよう My.Application.Log を再構成します。
    (略)

    --

    使用しているのはExpress Edition では無いのですが、

    デフォルトのFileLogListenerを使用する以上はフォルダが自動生成されてしまうようにも読み取れます。

    ひとまず、別のTraceListenerを使用する方向で進めていこうと思います。

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