10

C# アプリでは、ファイルを に書き込みますEnvironment.GetFolderPath(Environment.SpecialFolder.MyDocuments)。log4net ログファイルもそこに移動する必要があるため、application.conf次のように定義しました。

<appender name="LogFile" type="log4net.Appender.RollingFileAppender">
  <appendToFile value="true"/>
  <file value="%USERPROFILE%\My Documents\MyApp\log.txt"/>
  ...snip...
</appender>

これは、英語以外の Windows を搭載した PC で実行するまでは機能します。そのため、SpecialFolder.MyDocumentsはフォルダを指しますMijn Documentenが、ログは引き続き に移動しMy Documentsます。ファイルが 2 つの場所にあるため、混乱が生じます。

ログを「実際の」マイ ドキュメント フォルダに書き込みたいと考えています。どうすればいいですか?

  • のような環境変数を見つけようとしましたが%USERPROFILE%、マイ ドキュメントには存在しないようです。
  • マイ ドキュメントの実際の場所を定義するレジストリ キーがありますが、からはアクセスできませんapplication.conf
  • File次のように、プログラムでアペンダーのパラメーターをオーバーライドしようとしました。

    public static void ConfigureLogger()
    {
        XmlConfigurator.Configure();
    
        Hierarchy hierarchy = (Hierarchy)log4net.LogManager.GetRepository();
        foreach (var appender in hierarchy.Root.Appenders)
        {
            if (appender is FileAppender)
            {
                var fileAppender = appender as FileAppender;
                var logDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyApp");
                var pathElements = fileAppender.File.Split(Path.DirectorySeparatorChar);
                var logFileName = pathElements.Last();
                var fullLogFilePath = Path.Combine(logDirectory, logFileName);
                fileAppender.File = fullLogFilePath;
            }
        }
    }
    

    これも機能しません。ロガーの内部を調べると、Fileプロパティは喜んで を報告しますMijn Documentenが、その間、ログはまだ に移動しMy Documentsます。

アイデアが尽きた!

4

3 に答える 3

10

行を変更する

<file value="%USERPROFILE%\My Documents\MyApp\log.txt"/>

<file type="log4net.Util.PatternString" value="%envFolderPath{MyDocuments}\MyApp\log.txt" />
于 2013-08-21T18:49:41.583 に答える
1

少なくとも2つのアプローチがあるようです。最も単純なものは一種のハックです:

  1. log4net config でルート パスを示すカスタム環境変数を指定します。

    <file value="%MYAPP_USER_ROOTFOLDER%\MyApp\log.txt"/>

  2. 起動時、ロギングを初期化する前に、次の環境変数の値を設定します。

    Environment.SetEnvironmentVariable("MYAPP_USER_ROOTFOLDER", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));

より複雑ですが推奨されるアプローチについては、http: //marc.info/? l=log4net-user&m=110142086820117 &w=2 とhttp://ziqbalbh.com/articles/log4net-another-way-to-change-で説明しています。実行時のログファイルの場所/

于 2013-08-21T18:48:03.153 に答える