Log4net не записывает журнал в файл журнала

159

Я создал простой сценарий с использованием Log4net, но кажется, что мои приложения для журналов не работают, потому что сообщения не добавляются в файл журнала.

Я добавил следующее в файл web.config:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>        
</configSections>

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

В глобальном файле ASAX я добавил:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

И в методе Application_Start:

logger.Info("Starting the application...");

Почему тестовый журнал «Запуск приложения ...» не добавляется в файл журнала?

john84
источник

Ответы:

316

Ты звонишь

log4net.Config.XmlConfigurator.Configure();

где заставить log4net читать вашу конфигурацию? Например, в Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // Initialize log4net.
    log4net.Config.XmlConfigurator.Configure();
}
Андреас Паулссон
источник
4
Большое спасибо, вот и все, у меня была следующая строка: log4net.Config.BasicConfigurator.Configure (); Должен ли я назвать это, если я использую конфигурацию c # вместо web.config для настройки log4net? Требуется ли это каким-либо образом для вызова метода «Configure», потому что во многих руководствах я не нашел эту строку кода.
Джон84
9
Существует множество способов сообщить log4net, где искать конфигурацию, см. Logging.apache.org/log4net/release/manual/configuration.html . Вызов XmlConfigurator.Configure () заставит log4net искать конфигурацию в <app.exe> ​​.config или web.config. BasicConfigurator.Configure будет (согласно документации SDK): «Инициализирует систему ведения журнала log4net с помощью ConsoleAppender, который будет записывать в Console.Out.»
Андреас Паулссон
К вашему сведению - вы также можете использовать log4net.Config.BasicConfigurator, если вы НЕ хотите, чтобы он был основан на файлах. Вывод отправляется на консоль.
silverArc
1
Я делаю конфигурацию в AssemblyInfoфайле. Опубликовано как ответ ниже.
LCJ
Ага, нашел так много этих вопросов, и везде они не упоминают, где найти настоящие файлы журналов ... Это так очевидно, что все уже знают?
MrFox
50

Используйте эту страницу часто задаваемых вопросов : Часто задаваемые вопросы по Apache log4net

На 3/4 пути вниз рассказывается, как включить отладку log4net с помощью трассировки приложений. Это скажет вам, где ваша проблема.

Основы:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

И вы видите след в стандартном выводе

bechbd
источник
1
Спасибо, я проверил FAQ, но они не смогли решить мою проблему.
john84
1
Благодаря этому ответу я смог определить, что мой rootраздел ссылается на неправильный регистратор !!
Seebiscuit
отличный совет. Я обнаружил, что доступ для пользователя asp.net запрещен
Blue Clouds
если это не работает для кого-то, пожалуйста, попробуйте мой способ использовать это: <log4net> <internal> <Debug value = "true"> </ Debug> </ internal> </ log4net>
himanshupareek66
35

Как предложил @AndreasPaulsson, нам нужно его настроить. Я делаю конфигурацию в AssemblyInfoфайле. Я уточняю configuration file nameздесь.

// Log4Net Configuration.
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
LCJ
источник
9
что произойдет, если у меня есть это и log4net.Config.XmlConfigurator.Configure (); в процессе?
n00b
1
@ n00b, тогда мы можем прокомментировать эту строку, фактически только так, как она работала для меня "log4net.Config.XmlConfigurator.Configure ();", и еще одна вещь: я тоже добавил это в свои настройки web.config <добавить ключ = "log4net.Internal.Debug" value = "true" />
himanshupareek66
33

Также убедитесь, что для [log4net] .config выбрана опция «Копировать всегда».

введите описание изображения здесь

kokabi
источник
1
Это было исправление для меня. Я всегда забываю эту настройку.
Ju66ernaut
25

Убедитесь, что процесс (учетная запись), на котором работает сайт, имеет права на запись в выходной каталог.

В IIS 7 и более поздних версиях это настраивается в пуле приложений и обычно является идентификатором AppPool , который обычно не имеет разрешения на запись во все каталоги.

Проверьте свои журналы событий (приложение и безопасность), чтобы видеть, были ли выброшены какие-либо исключения.

Одед
источник
Спасибо за вашу помощь, также я подумал о проблемах с разрешениями, но также если я установил в папке права на чтение, запись, изменение и выполнение для всех, это не работает.
Джон84
@ john84 - вы получаете исключения? Вы смотрели журналы событий?
Одд
Также важно, как я только что обнаружил, что служба Windows работает под определенной учетной записью.
Боб Мак
Большое спасибо, что мне очень помогло.
Аббас
20

Вставка:

 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

в конце файла AssemblyInfo.cs

фаэтон
источник
Это было мое спасение. Создание настольного проекта Forms и размещение log4net.Config.XmlConfigurator.Configure (); в основном не помогало. Спасибо
Томас Гессе
это помогло мне. У меня была конфигурация в web.config, но log4net, похоже, не принимал сделанные изменения. Я добавил «Watch = true» к этому атрибуту, и anithing начал работать
хотя
3

Для меня я переместил расположение файлов журнала, и только когда я изменил имя файла на что-то другое, он снова запустился.

Кажется, если уже существует лог-файл с таким именем, ничего не происходит.

После этого я переименовываю старый файл и снова изменяю имя файла журнала в конфиге на прежнее.

kernowcode
источник
2

В моем случае log4net не регистрировал должным образом из-за пробела в имени моего проекта. Понял меня, почему один и тот же код прекрасно работал в другом проекте, но не в новом. Пространства. Простое пространство.

Итак, остерегайтесь пробелов в именах проектов. Я усвоил свой урок.

Zanussi
источник
1
Где у вас была эта проблема? Log4Net прекрасно работает в одном проекте, но не в другом ... не знаю почему. Tks
Паскаль
2

В моем случае мне пришлось дать IIS_IUSRSразрешение на чтение \ запись в файл журнала.

Rahatur
источник
1

Убедитесь, что следующий код строки должен быть в файле AssemblyInfo.cs.

[сборка: log4net.Config.XmlConfigurator (ConfigFile = "Web.config", Watch = true)]

а также проверьте эту строку в методе Application_start ().

log4net.Config.XmlConfigurator.Configure();
Праджакта Кале
источник
0

Ваш конфигурационный файл кажется правильным. Затем вы должны зарегистрировать свой файл конфигурации Log4net в приложении. Таким образом, вы можете использовать следующий код:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

После регистрации процесса, вы можете позвонить ниже определение для вызова журнала:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

log.Error("Sample log");
Махмут ЭФЕ
источник
0

Мне пришлось переместить Logger в пакет Nuget. Ниже код необходимо добавить в проект пакета NuGet.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

См. Https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/ для получения более подробной информации.

Гурунад Дуввуру
источник
Старайтесь избегать ссылок в качестве ответов. Они не всегда могут работать. Возможно, отредактируйте свой ответ, чтобы включить краткую информацию в ссылку.
Дерек С.
0

Есть несколько способов использовать log4net. Я нашел это полезным, когда я искал решение. Решение описано здесь: https://www.hemelix.com/log4net/

RotatingWheel
источник