Я уверен, что упускаю что-то базовое. Я пытаюсь включить ведение журнала 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");
В любом случае журналов нет. Независимо от того, определяю ли я ведение журнала через конфигурацию или программно, я вижу снимок экрана внизу, когда проверяю объект журнала. Обратите внимание на следующее:
Может кто-нибудь сказать мне, что мне не хватает?
Обновлено: Это то, что я пропустил, как определено из ответа Z.R.T.:
logger
в файле log4net.config / app.config.LogManager.GetLogger("IntegrationLogger");
.Как только я добавил эти две вещи, log4net начал работать. Единственным недостатком является то, что все журналы помечены как «IntegrationLogger» вместо класса, в котором создается журнал, но это, по крайней мере, позволило начать ведение журнала.
У меня нет - отличный отзыв. День уже поздно, так что завтра я проверю это первым делом.
На самом деле я просто попробовал - скопировал содержимое дословно из ссылки, которую вы предоставили в моем app.config, переместил содержимое log4net в app.config и обновил экземпляр FileInfo, чтобы использовать app.config, запустил его и ... нет . Ни mylog.log, ни log4net.txt. :( Тем не менее, хорошее предложение.
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