没有日志记录和存储库根目录有 appender 但 Logger 没有 appender
No logging and repository root has appender but Logger has no appender
我确信我遗漏了一些基本的东西。我正在尝试启用 log4net 日志记录作为 XUnit 集成测试的一部分,但没有日志文件被写入磁盘。
我已经尝试使用配置文件和编程方式指定日志配置:
配置文件:
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file value="mylog.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
</log4net>
程序化
private void ConfigureAppender()
{
var layout = new PatternLayout("%date [%thread] %level %logger - %message%newline");
var appender = new RollingFileAppender {Name = "file", File = "c:\temp\mylog.log", AppendToFile = true, RollingStyle = RollingFileAppender.RollingMode.Size, MaxSizeRollBackups = 5, MaximumFileSize = "10MB", StaticLogFileName = true, Layout = layout};
var repository = LogManager.GetRepository() as Hierarchy;
repository.Root.AddAppender(appender);
repository.Root.Level = Level.Info;
repository.Configured = true;
repository.RaiseConfigurationChanged(EventArgs.Empty);
}
然后我尽可能早地在程序执行中获取记录器,使用类似这样的东西(我也试过 [assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
):
var fileInfo = new FileInfo("log4net.config");
if (!fileInfo.Exists) throw new Exception();
XmlConfigurator.Configure(fileInfo);
var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
log.Fatal("This is a test");
两种方式都没有记录。无论我是通过配置还是以编程方式定义日志记录,当我检查日志对象时,我都会在底部看到屏幕截图。请注意以下几点:
- 级别设置已从配置定义中选取。
- 存储库根目录具有配置定义中定义的两个附加程序。
- Logger 实例本身没有附加程序。
有人可以告诉我我缺少什么吗?
编辑:
这是我错过的,根据 Z.R.T. 的回答确定:
- 我需要 log4net.config/app.config 中的
logger
元素。
- 我需要按名称引用记录器,例如
LogManager.GetLogger("IntegrationLogger");
.
一旦我添加了这两个东西,log4net 就开始工作了。唯一的缺点是所有日志都标有 "IntegrationLogger" 而不是生成日志的 class ,但这至少开始了日志记录。
log4net.config - 如果较新则设置复制或始终复制
<log4net>
<appender name="SomeRollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="..\logs\loginfo.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<logger name="SomeLogger">
<level value="INFO" />
<appender-ref ref="SomeRollingLogFileAppender" />
<appender-ref ref="console" />
</logger>
</log4net>
Log.cs
public class Log
{
private static readonly ILog someLogger = LogManager.GetLogger("SomeLogger");
static Log()
{
if (!UnitTestDetector.IsRunningFromNUnit)
{
XmlConfigurator.Configure(new FileInfo("log4net.config"));
}
else
{
var testDir = TestContext.CurrentContext.TestDirectory;
XmlConfigurator.Configure(new FileInfo(Path.Combine(testDir,"log4net.config")));
}
}
public static void Info(string msg)
{
someLogger.Info(msg);
}
}
static class UnitTestDetector
{
static UnitTestDetector()
{
foreach (Assembly assem in AppDomain.CurrentDomain.GetAssemblies())
{
if (assem.FullName.ToLowerInvariant().StartsWith("nunit.framework"))
{
IsRunningFromNUnit = true;
break;
}
}
}
public static bool IsRunningFromNUnit { get; } = false;
}
Program.cs
[TestFixture]
class Program
{
static void Main()
{
Log.Info("test");
Console.ReadLine();
}
[Test]
public void Test()
{
Log.Info("test");
}
}
我确信我遗漏了一些基本的东西。我正在尝试启用 log4net 日志记录作为 XUnit 集成测试的一部分,但没有日志文件被写入磁盘。
我已经尝试使用配置文件和编程方式指定日志配置:
配置文件:
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file value="mylog.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
</log4net>
程序化
private void ConfigureAppender()
{
var layout = new PatternLayout("%date [%thread] %level %logger - %message%newline");
var appender = new RollingFileAppender {Name = "file", File = "c:\temp\mylog.log", AppendToFile = true, RollingStyle = RollingFileAppender.RollingMode.Size, MaxSizeRollBackups = 5, MaximumFileSize = "10MB", StaticLogFileName = true, Layout = layout};
var repository = LogManager.GetRepository() as Hierarchy;
repository.Root.AddAppender(appender);
repository.Root.Level = Level.Info;
repository.Configured = true;
repository.RaiseConfigurationChanged(EventArgs.Empty);
}
然后我尽可能早地在程序执行中获取记录器,使用类似这样的东西(我也试过 [assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
):
var fileInfo = new FileInfo("log4net.config");
if (!fileInfo.Exists) throw new Exception();
XmlConfigurator.Configure(fileInfo);
var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
log.Fatal("This is a test");
两种方式都没有记录。无论我是通过配置还是以编程方式定义日志记录,当我检查日志对象时,我都会在底部看到屏幕截图。请注意以下几点:
- 级别设置已从配置定义中选取。
- 存储库根目录具有配置定义中定义的两个附加程序。
- Logger 实例本身没有附加程序。
有人可以告诉我我缺少什么吗?
编辑: 这是我错过的,根据 Z.R.T. 的回答确定:
- 我需要 log4net.config/app.config 中的
logger
元素。 - 我需要按名称引用记录器,例如
LogManager.GetLogger("IntegrationLogger");
.
一旦我添加了这两个东西,log4net 就开始工作了。唯一的缺点是所有日志都标有 "IntegrationLogger" 而不是生成日志的 class ,但这至少开始了日志记录。
log4net.config - 如果较新则设置复制或始终复制
<log4net>
<appender name="SomeRollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="..\logs\loginfo.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<logger name="SomeLogger">
<level value="INFO" />
<appender-ref ref="SomeRollingLogFileAppender" />
<appender-ref ref="console" />
</logger>
</log4net>
Log.cs
public class Log
{
private static readonly ILog someLogger = LogManager.GetLogger("SomeLogger");
static Log()
{
if (!UnitTestDetector.IsRunningFromNUnit)
{
XmlConfigurator.Configure(new FileInfo("log4net.config"));
}
else
{
var testDir = TestContext.CurrentContext.TestDirectory;
XmlConfigurator.Configure(new FileInfo(Path.Combine(testDir,"log4net.config")));
}
}
public static void Info(string msg)
{
someLogger.Info(msg);
}
}
static class UnitTestDetector
{
static UnitTestDetector()
{
foreach (Assembly assem in AppDomain.CurrentDomain.GetAssemblies())
{
if (assem.FullName.ToLowerInvariant().StartsWith("nunit.framework"))
{
IsRunningFromNUnit = true;
break;
}
}
}
public static bool IsRunningFromNUnit { get; } = false;
}
Program.cs
[TestFixture]
class Program
{
static void Main()
{
Log.Info("test");
Console.ReadLine();
}
[Test]
public void Test()
{
Log.Info("test");
}
}