log4net не працює


123

Привіт, у мене є така конфігурація в моєму web.config

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

але log4net не працює. Мій проект чудово поєднується, і я не отримую жодних помилок налагодження. Рядки, де я кажу, log.debug("somemessage")виконуються нормально, але я не можу знайти mylog.logфайл, тож де це?


Не забудьте перевірити це теж: stackoverflow.com/a/24617269/114029
Leniel Маккаферрі

Відповіді:


298

Один елемент із цього виду - переконатися, що ви додали XmlConfiguratorатрибут до збірки, розмістивши у своєму рядку наступний рядок AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

Інакше log4net ніколи не активується.


5
Цей метод використовується для роботи в моєму проекті, але він перестав працювати як - то. Мені довелося використовувати цей метод stackoverflow.com/a/1479343/193634, щоб знов працювати.
Росді Касім

Я просто спробував це знову, і він працює чудово. Швидше за все, ви не посилаєтесь / завантажуєте збірку, що містить, AssemblyInfoяк тільки ви думали.
Кірк Волл

Для тих, хто використовує прилад ELMAH, це шлях. У мене був 'log4net.Config.XmlConfigurator.Configure ();' в global.asax.cs, і він працював чудово для файлового додатка, але не для додатків ELMAH.
користувач3885927

Я поставив галочку на цю відповідь і виявив, що мені потрібно переробити її за допомогою "[Assembly: log4net.Config.XmlConfigurator (Watch = true)]`
David Savage

49

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

По-перше, ви насправді телефонували

XmlConfigurator.Configure()

де-небудь у вашому коді? Якщо фрагмент xml вище знаходиться у файлі конфігурації програми, цей виклик виконає трюк. Якщо фрагмент XML знаходиться у власному файлі, вам потрібно буде використовувати .Configure(string)перевантаження, яке сприймає шлях до файлу. Без цього виклику (або, мабуть, атрибут рівня складання, згаданий Кірком Воллом), тоді log4net взагалі не буде вести журнал.

Якщо ви вважаєте, що це все зроблено, і log4net повинен вести журнал, то, можливо, вам слід поставити повністю кваліфікований шлях для файлу журналу, поки ви налагоджуєте далі. Це дозволить вам бути впевненим, де має бути файл .


33

Є ще одна маленька готча, дивіться тут: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

[assembly: log4net.Config.XmlConfigurator]метод не працює з app.config. Якщо ви налаштували log4net з app.config, ви повинні використовувати log4net.Config.XmlConfigurator.Configure()метод.


Тільки для запису, обидва способи працювали для мене в консольному додатку.
rageit

Я підтверджую рішення вище - мені довелося викликати log4net.Config.XmlConfigurator.Configure (); в моєму коді (який використовує app.config для ефективного функціонування log4net. Рядки, які ефективно надруковані, - це ті, що виконуються після виконання методу Configure ().
luisa rosi

19

Ось мій контрольний список, коли log4net виявляється непокірним:

  • переконайтесь, що файл log4net.config під час створення копіюється у папку bin \ (встановлено на "Копіювати, якщо новіше" у компіляторі)
    • працюючи з встановленим кодом, переконайтеся, що log4net.config прийшов для проїзду (у компіляторі встановлено значення "Вміст")
  • переконайтеся, що користувач, що запускається як має права запису в папку, куди слід записувати журнали
  • якщо ви сумніваєтесь, дайте розбірливі дозволи на c: \ temp \ і дозвольте все, щоб увійти туди ()
  • запустіть Sysinternal / Dbgview.exe, щоб побачити, чи це вам щось говорить

3
"переконайтеся, що файл log4net.config під час створення копіюється у папку bin \ (встановлено" Копіювати, якщо новіше "у компіляторі)" -> збережіть мій день! Думає стільки!
Hoang Nguyen Huu

8

Додавання проекту ASP.NET MVC

log4net.Config.XmlConfigurator.Configure();

до Global.asax.cs також допомагає:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}

1
У мене виникло дуже дивне питання з цим на виробництві та на комп'ютері мого начальника, лісоруби працювали нормально так, але не до того, як відповідь Кірка зробила це на моєму комп’ютері. Я просто подумав, що я повідомлю людей у ​​випадку, якщо у них є подібні проблеми (проект MVC btw).
Shelby115

@ Shelby115, багато спасибі! Я намагався розмістити свої записи log4Net в ELMAH. У web.config у мене все правильно. У мене вже було "log4net.Config.XmlConfigurator.Configure ();" в моєму global.asax.cs, але він не працює. Прийшов до цієї публікації SO і додав рядок до AssemblyInfo.cs на базі Кірка. Це все ще не вийшло !. Прочитавши ваш коментар, я видалив попередній запис із global.asax.cs і він почав працювати. Я витратив на це кілька годин, і ваш коментар був великою допомогою. Знову дякую!
користувач3885927

Запис у global.asax.cs працював чудово для файлового додатка, але не для додатків ELMAH. Шлях Кірка працював для додатка ELMAH (я спеціально повинен був видалити його з global.asax.cs)
користувач3885927

Ви також можете переконатися, що log4net має дозволи на запис у каталог, налаштований для файлів журналу.
Оладіпо Оласемо

@ Shelby115 Данг, треба любити це, коли ти забудеш рішення і власний коментар вирішує твою проблему. Хороший показник також є перехід на сторінку з вже схваленою вами відповіддю.
Shelby115

7

Ось такі кроки, в результаті яких мій файл файлів працює:

  • -Check AssemblyInfo.cs містить такий атрибут. [збірка: log4net.Config.XmlConfigurator] . Це завантажує log4net.
  • Перевірте, чи в каталозі журналу є дозволи на запис.
  • Перевірте, чи реєстратор має вказаний формат. Це робиться, перевіряючи, що кожен елемент у вашій конфігурації має вказаний елемент компонування . Наприклад:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • Нарешті, спробуйте увімкнути внутрішній журнал log4net, щоб увімкнути консольний журнал та перевірити консоль. Для цього додайте <add key="log4net.Internal.Debug" value="true"/>до свого appSettings.

<add key = "log4net.Internal.Debug" value = "true" /> Це допомогло мені вирішити проблему. Спасибі
Раві Хамбхаті

Дозволи довідників - це те, що мене отримало
Омар Хімада

6

У мене був досвід, коли системи лісозаготівень виходять з ладу без винятку. Я припускаю, що це має сенс, тому що якщо реєстратор реєструє помилки, то як він може зареєструвати помилку, яку він не може виконати.

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

З метою тестування ви можете вручну створити файл на диску, який слід записати, та відкрити дозволи для кожного, хто може писати на нього. Якщо реєстратор починає писати до нього, то ви знаєте, що це заснований на дозволі, а не на конфігурації.


2

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

Скопіюйте файл конфігурації у вихідний каталог

Клацніть правою клавішею миші файл log4net.config, виберіть властивість, а потім виберіть «Копіювати у вихідний каталог», щоб скопіювати XXXX


1

Я спробував усе вищесказане, але нічого не вийшло. Додавання цього рядка в розділ app.config configSections працювало на мене.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

Переконайтеся в тому, що Versionі PublicKeyTokenправильно


0
<param name="File" value="mylog.log" />

говорить "написати mylog.log у фактичну папку". Це означає, що якщо ваш веб-переглядач знаходиться під IIS, то журнал записується на C: \ inetpub \ wwwroot \ appname \ mylog.log.

Якщо файлу журналу немає, можливо, обліковий запис, під яким працює програма, не має дозволу на запис у папку. Ви можете запустити Монітор процесів від SysInternals, щоб побачити, чи і де записаний файл.

Також запустіть VS в режимі налагодження, щоб побачити, чи викинуті будь-які винятки (Debug-> Exceptions-> CLR Exceptions, check Thrown).


0

У моєму випадку я забуваю встановити властивості файлу log4Net.config як "Вміст", щоб файл не був включений до розгортання. Тож зверніть на це увагу:

Compile action : Content

0

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

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));

-7

Також через кілька годин я зрозумів, чому це не працює для мене ...

я мав:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

але має бути:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

Тому переконайтеся, що ILog знаходиться на першому рядку ....


1
Це, безумовно, не причина. Не має значення, коли ви ініціалізуєте об’єкт ILog до тих пір, як це зробите перед тим, як зробити виклик методам реєстрації, тобто _log.Info; _log.error тощо
Oladipo Olasemo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.