我遇到了最新版log4net 1.2.12的奇怪问题 我的日志文件创建成功,没有问题,无论如何也始终在Exe文件的同一目录中创建(null)文件。
这是我的xml配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="DEBUG"/>
<acceptOnMatch value="false"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%-5.5level] %logger - %message%newline"/>
</layout>
</appender>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<threshold value="ALL"/>
<File type="log4net.Util.PatternString" value="%property{LogFileName}"/>
<param name="appendToFile" value="false"/>
<param name="maximumFileSize" value="20000KB"/>
<param name="maxSizeRollBackups" value="200"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%-5.5level] %logger - %message%newline"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingFile"/>
</root>
</log4net>
</configuration>
这就是我从我的主人那里打电话的方式:
class Program
{
/// <summary>
/// The logger
/// </summary>
private static ILog logger = LogManager.GetLogger(typeof(Program));
/// <summary>
/// The CMD line args
/// </summary>
public static Arguments CmdLineArgs = null;
/// <summary>
/// Main.
/// </summary>
/// <param name="args">The arguments.</param>
/// <returns></returns>
static int Main(string[] args)
{
try
{
CmdLineArgs = new Arguments();
Parser CmdLineParser = new Parser();
if (CmdLineParser.ParseArguments(args, CmdLineArgs))
{
log4net.GlobalContext.Properties["LogFileName"] = CmdLineArgs.LogFile;
log4net.Config.XmlConfigurator.Configure();
CmdLineArgs.PrintArguments(args);
CmdLineArgs.Check();
CmdLineArgs.PrintArguments();
}
else
{
CmdLineArgs.PrintArguments(args);
Console.WriteLine(CmdLineArgs.GetUsage());
Console.WriteLine(string.Format("Return Code: {0}", 2));
return 2;
}
logger.Info("Execution Terminated");
logger.Info(string.Format("Return Code: {0}", 0));
return 0;
}
catch (Exception ex)
{
if (logger.IsInfoEnabled)
{
logger.Fatal("Fatal Error:", ex);
}
else
{
Console.WriteLine(ex.ToString());
Console.WriteLine(string.Format("Return Code: {0}", 8));
}
logger.Info(string.Format("Return Code: {0}", 8));
return 8;
}
}
}
这完全适用于log4net 1.2.11和之前的版本,但是使用log4net 1.2.12创建了一个(null)文件。
我正在使用VS2012和.net 4.0 Framework。
答案 0 :(得分:2)
你可能有一行像
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
在AssemblyInfo.cs中。
当第一次log4net dll访问发生时,这将初始化log4net并创建你的(null)日志文件,在你的例子中它是在执行行时
private static ILog logger = LogManager.GetLogger(typeof(Program));
这将在调用Main方法之前和设置Logfile属性之前发生。
答案 1 :(得分:1)
我怀疑这是因为你在静态字段中得到ILog
的实例:在配置代码运行之前创建静态字段并设置日志文件名,因此创建一个空文件LogFileName
为空。
然后,当您设置日志文件名并调用Configure()
时,将创建第二个文件。
答案 2 :(得分:0)
尝试更改
<File type="log4net.Util.PatternString" value="%property{LogFileName}"/>
成为
<param name="file" type="log4net.Util.PatternString" value="%property{LogFileName}"/>