Ошибка конструкции WindsorContainer и проблема с ведением журнала

Я использую Castle Windsor и запускаю его с помощью файла конфигурации (и действительно хочу сохранить все там), который также содержит средство ведения журнала.

Когда я получаю сообщение об ошибке от виндзора при инициализации (из-за неправильной конфигурации, отсутствия зависимостей и т. д.), у меня не инициируется регистратор и, следовательно, я не могу нигде записать ошибку... Вот мой код:

    private static ILogger m_Logger { get; set; } 

    static void Main(string[] args)
    {
        try
        {
            // Windsor has missing dependencies
            var container = new WindsorContainer("windsor.xml");
            // Did not make it here...
            var logger = container.Resolve<ILogger>();
            m_Logger.Debug("Testing 123");
        }
        catch (Exception)
        {
            // Logger was not initialized, null reference exception!
            m_Logger.Debug("Testing 123");
        }
    }

Каковы мои варианты здесь?

Спасибо, Нир.


person nirpi    schedule 07.08.2012    source источник
comment
Какой тип приложения вы используете? АСП.НЕТ? Выиграть формы? Как вы развертываете свое приложение. На вашем сервере? На клиентских машинах?   -  person Steven    schedule 07.08.2012
comment
Когда вы неправильно настроили свое приложение, вы должны это выяснить во время тестирования или стейджинга, но, тем не менее, вам не нужно отлавливать и логировать, так как ваше приложение не запустится и вы сможете увидеть трассировку стека при локальном доступе к сервису.   -  person Steven    schedule 07.08.2012
comment
@ Стивен Неправда. По крайней мере, в некоторых ситуациях вы просто где-то получаете null.   -  person jpmc26    schedule 20.01.2018


Ответы (2)


Вы можете записать в журнал событий Windows:

catch (Exception ex)
{
    const string Source = "MySource";
    const string Log = "MyNewLog";

    // Create the source, if it does not already exist.
    if(!EventLog.SourceExists(Source))
    {
        EventLog.CreateEventSource(Source , Log);
    }

    // Create an EventLog instance and assign its source.
    EventLog myLog = new EventLog();
    myLog.Source = Source;

    string eventMessage = string.Empty;

    while (ex != null)
    {
        eventMessage += string.Format("{0}\n{1}\n{2}\n\n",
            ex.GetType().FullName,
            ex.Message,
            ex.SackTrace);
    }

    myLog.WriteEntry(eventMessage);
}
person Steven    schedule 07.08.2012
comment
Я бы очень хотел, чтобы это было в журнале или, по крайней мере, имело возможность записать его в журнал событий через средство log4net Windsor. Как-нибудь обойти это? - person nirpi; 07.08.2012
comment
Что ж, если ваш регистратор настроен неправильно, его невозможно использовать. Если он настроен правильно, вы можете просто вызвать фасад регистрации log4net. Нет проблем сделать это внутри корня вашей композиции. - person Steven; 07.08.2012

Это действительно съедает все ожидания от использования контейнера IOC в первую очередь. В любом случае вы можете создать свой регистратор (например, log4net) вручную в блоке catch и зарегистрировать его.

...
catch (Exception)
{
    // Create logger here
    m_Logger = new Log4NetLogger(); // Assuming 'windsor.xml' configured to inject a Log4NetLogger
    m_Logger.Debug("Testing 123");
}
person Ε Г И І И О    schedule 26.03.2013