ログ ファイル (log4net を使用) のフル パスとファイル名を設定し、c:\ProgramData\Logs フォルダーを使用したいと考えています。環境変数 #PROGRAMDATA# を使用して ProgramData フォルダーのパスを取得します。
次の方法でログ ファイルのパスを設定したいと思います。App.config でプロパティを使用し、ログを記録するクラスでこのプロパティの値を設定します。
私の App.config ファイル:
<configuration>
...
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<!-- Pattern to output the caller's file name and line number -->
<conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
</layout>
</appender>
<appender name="AppRollingFile" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%property{ProgramDataPath}\Logs\Application.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<maximumFileSize value="1000KB" />
<maxSizeRollBackups value="5" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%-5level][%d{yy-MM-dd HH:mm:ss,fff}] %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="AppRollingFile" />
</root>
</log4net>
</configuration>
そして、プロパティを設定したコード:
static void Main(string[] args)
{
log4net.GlobalContext.Properties["ProgramDataPath"] = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
log4net.Config.XmlConfigurator.Configure();
私の問題は、プロパティの値が設定される前に空のログ ファイルが作成されることです (その後、プロパティは null になります)。log4net の初期化は、プロパティを設定したクラスのメイン関数に入る前に行われるため、常にアプリケーションのフォルダー (bin\Debug(null)\Logs\Application.log) に空のファイルが作成されます。プロパティを設定した後、別の Apllication.log ファイルが c:\ProgramData\Logs フォルダーに作成されるため、すべて正常に動作します。
私の質問は、空のログ ファイルが作成される前/プロパティを設定するクラスのメイン関数に入る前に、プロパティの値を設定するにはどうすればよいか、または他にどのような解決策があるかということです。
以下に示すように、App.config で環境変数を使用しても機能しませんでした。
<file type="log4net.Util.PatternString" value="${PROGRAMDATA}\Logs\Application.log"/>