Я уверен, что мне не хватает чего-то простого.Я пытаюсь включить ведение журнала 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 не имеет никаких дополнений.
Может кто-нибудь сказать, что мне не хватает?
РЕДАКТИРОВАТЬ: Этоэто то, что я пропустил, как определено из ответа ZRT:
- Мне нужен элемент
logger
в log4net.config / app.config. - Мне нужно было ссылаться на регистратор по имени, например,
LogManager.GetLogger("IntegrationLogger");
.
Как только я добавил эти две вещи, log4net начал работать.Единственным недостатком является то, что все журналы помечены «IntegrationLogger» вместо класса, в котором создается журнал, но это, по крайней мере, начало регистрации.