我想设置日志文件的完整路径和文件名(我使用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的初始化是在进入我设置属性的类的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"/>
答案 0 :(得分:3)
尝试
<file type="log4net.Util.PatternString" value="${ProgramData}\Logs\Application.log"/>
环境变量区分大小写,这就是$ {PROGRAMDATA}不起作用的原因。
答案 1 :(得分:0)
删除程序集属性应解决问题:
[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);