log4net установлен из внешнего конфигурационного файла не работает - PullRequest
4 голосов
/ 22 июня 2011

У меня странная проблема с log4net.

В приложении ASP.NET я хочу настроить log4net внешне, поэтому у меня есть отдельный файл log4net.config, который я подключаю к своему веб-приложениюс этой строкой в ​​файле AssemblyInfo.cs, принадлежащей моему веб-приложению:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

Теперь, если я создаю экземпляр класса log4net logger обычным способом, подобным следующему:работает, а регистрация работает как обычно.Тем не менее, я поместил свой код регистрации в класс LogManager, который является частью отдельной сборки (Infrastructure) и повторно используется в ряде проектов.У него есть GetLogger, который выглядит следующим образом:

public static class LogManager
{
    public static ILog GetLogger()
    {
        var stack = new StackTrace();
        var frame = stack.GetFrame(1);
        return new log4net.LogManager.GetLogger(frame.GetMethod().DeclaringType);
    }
}

Так что я могу использовать это в своем коде asp.net:

public class MyClass
{
    private static readonly ILog _logger = LogManager.GetLogger();
    ....

Но ... Это не работает!Ведение журнала не производится. Не похоже, что файл конфигурации подключен правильно.Если я поместил свою конфигурацию log4net прямо в web.config, то этот LogManager работает нормально.

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Подводя итог тому, что сказал Бибху.Это все связано с log4net.Config.XmlConfigurator.

У вас есть для настройки log4net перед началом регистрации.Поэтому всякий раз, когда вы используете свой класс LogManager, хост-приложение (windows, web) должно настроить ведение журнала.

Либо это, либо вам нужно сделать это в вашем LogManager.

2 голосов
/ 22 июня 2011

Скажите приложению настроить log4net с помощью внешнего файла конфигурации.Для этого есть два места.Во-первых, global.asax и второй файл assemblyInfo.cs.Обратите внимание, что большую часть времени вы начинаете с файла global.asax со всем встроенным кодом.По какой-то причине, единственный способ, которым я мог заставить это работать, состоял в том, чтобы сломать global.asax, чтобы использовать выделенный код, а затем создать файл assemblyInfo.cs.В итоге получается, что это выглядит следующим образом.

global.asax:

<%@ Application Language="C#" Inherits="GlobalAsax" %>

global.asax.cs (in your App_Code folder):

using System;
using System.Web;

public class GlobalAsax : HttpApplication
{
    // you may have lots of other code here
    void Application_Start(object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure();
    }
}

Теперь, когда ваше приложение вызывает конфигурацию log4net, вы можете установить атрибут в информации о сборке, чтобы log4net знал, где искать файл конфигурации.

AssemblyInfo.cs (in your App_Code folder):

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

Флаг наблюдения указывает log4net следить за файлом конфигурации на предмет возможных изменений.Это полезно, если вы хотите изменить конфигурацию с регистрации всего на ошибки только во время тестирования.

Затем начните запись.

...