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
— Лениэль Маккаферри,

Ответы:


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.
— user3885927

Я поставил галочку на этот ответ и обнаружил, что мне нужно настроить его с помощью `[assembly: log4net.Config.XmlConfigurator (Watch = true)]`
— Дэвид Сэвидж

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()метод.


Для записи, оба метода работали у меня в консольном приложении.
— ярость

Подтверждаю решение выше - мне пришлось вызвать log4net.Config.XmlConfigurator.Configure (); в моем коде (который использует app.config для эффективной работы log4net. Строки, которые выводятся на печать, - это строки, следующие после выполнения метода Configure ().
— Луиза Роси,

19

Вот мой контрольный список для случаев, когда log4net оказывается непокорным:

  • убедитесь, что файл log4net.config копируется в папку bin \ при сборке (в компиляторе установлено «Копировать, если новее»)
    • при работе с установленным кодом убедитесь, что файл log4net.config используется для поездки (в компиляторе установлено значение «Content»)
  • убедитесь, что пользователь, от имени которого запускается процесс, имеет права на запись в папку, в которую должны быть записаны журналы
  • если сомневаетесь, дайте неразборчивые разрешения для c: \ temp \ и получите все для входа туда ()
  • запустите Sysinternal / Dbgview.exe, чтобы узнать, говорит ли это вам что-нибудь

3
«убедитесь, что файл log4net.config скопирован в папку bin \ при сборке (в компиляторе установлено« Копировать, если новее »)» -> спасти меня! Большое спасибо!
— Хоанг Нгуен Хуу,

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).
— Shelby115

@ Shelby115, большое спасибо! Я пытался поместить свои записи log4Net в ELMAH. У меня в web.config все было правильно. У меня уже был log4net.Config.XmlConfigurator.Configure (); в моем global.asax.cs, но он не работает. Пришел к этому сообщению SO и добавил строку в assemblyInfo.cs на основе Кирка. Это все еще не сработало !. Прочитав ваш комментарий, я удалил предыдущую запись из global.asax.cs, и она начала работать. Я потратил на это несколько часов, и ваш комментарий мне очень помог. Еще раз спасибо!
— user3885927

Запись в global.asax.cs нормально работала для файловых приложений, но не для приложений ELMAH. Способ Кирка сработал для приложения ELMAH (мне пришлось удалить его из global.asax.cs)
— user3885927

Вы также можете убедиться, что 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.

Если файла журнала нет, то, возможно, учетная запись, под которой запущено приложение, не имеет разрешения на запись в папку. Вы можете запустить Process Monitor из SysInternals, чтобы узнать, записан ли файл и куда.

Также запустите VS в режиме отладки, чтобы увидеть, не выбрасываются ли какие-либо исключения (Отладка-> Исключения-> Исключения CLR, отметьте Выброшено).


0

В моем случае я забыл установить для свойств файла log4Net.config значение «Content», чтобы файл не был включен в развертывание. Так что обратите на это внимание:

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 и т. д.
— Оладипо Оласемо,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.