如何在创建日志文件之前初始化 log4net

本文关键字:初始化 log4net 文件 日志 创建 | 更新日期: 2023-09-27 18:35:34

我想设置日志文件的完整路径和文件名(我使用 log4net),我想使用 c:''ProgramData''Logs 文件夹。我使用环境变量#PROGRAMDATA#获取ProgramData文件夹的路径。

我想以另一种方式设置日志文件的路径:我在 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 的初始化是在我设置属性的类的 main 函数中输入之前完成的,因此它将始终在应用程序的文件夹中创建一个空文件:bin''Debug(null)''Logs''Application.log。设置属性后,一切正常,因为将在 c:''ProgramData''Logs 文件夹中创建另一个 Apllication.log 文件。

我的问题是,如何在创建空日志文件之前/在输入设置属性的类的 main 函数之前设置属性的值,或者还有什么其他解决方案?

在 App.config 中使用如下所示的环境变量不起作用。

<file type="log4net.Util.PatternString" value="${PROGRAMDATA}'Logs'Application.log"/>

如何在创建日志文件之前初始化 log4net

尝试

<file type="log4net.Util.PatternString" value="${ProgramData}'Logs'Application.log"/>

环境变量区分大小写,这就是 ${PROGRAMDATA} 不起作用的原因。

删除程序集属性应该可以解决问题:

[assembly: log4net.Config.XmlConfigurator(Watch=true)]

如果你想让 log4net 监视 app.config 的配置更改,请使用以下代码(我更喜欢将 log4net 配置放在单独的 log4net.config 文件中,以便于重用):

log4net.GlobalContext.Properties["ProgramDataPath"] = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
FileInfo configFile = new FileInfo(Process.GetCurrentProcess().MainModule.FileName + ".config");
log4net.Config.XmlConfigurator.ConfigureAndWatch(configFile);