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...");

Чому в файл журналу не додається тестовий журнал "Запуск програми ..."?

Відповіді:


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 (); Я називаю це, якщо для налаштування log4net використовую конфігурацію c # замість web.config? Чи потрібен цей "Налаштувати" -методичний виклик, оскільки в багатьох навчальних посібниках я не знайшов цей рядок коду.
john84

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."
Андреас Полссон

FYI - ви також можете використовувати log4net.Config.BasicConfigurator, якщо ви НЕ хочете, щоб він базувався на файлі. Вихід надсилається на консоль.
сріблоАрк

1
Я роблю конфігурацію у AssemblyInfoфайлі. Опубліковано як відповідь нижче.
LCJ

Арге, знайшли стільки цих запитань і скрізь вони не згадують, де знайти фактичні файли журналів ... Це так очевидно, що всі вже знають?
MrFox

50

Використовуйте цю сторінку FAQ: Apache log4net Часті питання

Приблизно на 3/4 шляху вниз він говорить про те, як увімкнути налагодження log4net за допомогою трасування додатків. Це підкаже, де ваша проблема.

Основи:

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

І ви бачите слід у стандартному виході


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)]

9
що станеться, якщо у мене є це і log4net.Config.XmlConfigurator.Configure (); на навантаження?
n00b

1
@ n00b, тоді ми можемо коментувати цей рядок, насправді лише таким чином він працював на мене "log4net.Config.XmlConfigurator.Configure ();", і ще одне: я додав це також у свої налаштування web.config <<ключ = "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

Також переконайтесь, що вибрано параметр «Копіювати завжди» для [log4net] .config

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


1
Це було виправданням для мене. Я завжди забуваю цей параметр.
Ju66ernaut

25

Переконайтеся, що процес (акаунт), під яким працює сайт, має привілеї писати у вихідний каталог.

У IIS 7 і вище це налаштовано в пулі додатків і, як правило, є ідентифікатором AppPool , який зазвичай не має дозволу писати у всі каталоги.

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


Дякую за вашу допомогу, також я думав про проблеми з дозволом, але також якщо я встановив у папці читання, запис, модифікацію та виконання дозволів для всіх, хто це не працює.
john84

@ john84 - ви отримуєте винятки? Ви подивилися журнали подій?
Одід

Також важливо, як я нещодавно з’ясував, що служба Windows працює під певним обліковим записом.
Боб Мак

Велике спасибі, що мені дуже допомогло.
Аббас

20

Вставити:

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

наприкінці файлу AssemblyInfo.cs


Це був мій порятунок. Робота проекту настільних форм і розміщення log4net.Config.XmlConfigurator.Configure (); в основному не допомагало. Спасибі
Томаш Гессе

це мені допомогло. У мене була конфігурація в web.config, але log4net, здавалося, не підбирав зроблені зміни. Я додав «Годинник = True» для цього атрибута і anithing почав працювати
ALBE

3

Для мене я перемістив розташування журналів, і тільки коли я змінив ім'я файлу на щось інше, він запустився знову.

Здається, якщо вже існує логічний файл з такою ж назвою, нічого не відбувається.

Згодом я перейменував старий файл і змінив ім'я файлу журналу в конфігурації знову на те, що було.


2

У моєму випадку, log4net не здійснював належний журнал через наявність пропуску у назві мого проекту. Мені здали гайки, чому той самий код працював чудово в іншому проекті, а не в новому. Пробіли. Простий простір.

Отже, остерігайтеся пробілів у назвах проектів. Я засвоїв свій урок.


1
Де у вас виникло це питання? Log4Net чудово працює в одному проекті, але не в іншому ... не знаю чому. Tks
Паскаль

2

У моєму випадку мені довелося дати IIS_IUSRSдозвіл Read \ write на файл журналу.


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 Package. Нижче код потрібно додати в проект пакету NuGet.

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

Докладніші відомості див. У https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-isissue-when-moved-it-to-a-nuget-package/ .


Намагайтеся уникати посилань як відповідей. Вони можуть не завжди працювати. Можливо, відредагуйте свою відповідь, щоб включити резюме інформації у посилання.
Дерек К.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.