Log4Net XmlConfigurator.Configure () зависает, когда строка подключения неверна. Ошибка в Log4Net?

Мне потребовалось много времени, чтобы отследить проблему конфигурации Log4Net, когда строка подключения к базе данных была неправильной, потому что при вызове XmlConfigurator.Configure () в коде вместо выдачи исключения он просто зависал.

Было бы легко выяснить это быстро, если бы я сразу понял, что он зависает в этой конкретной строке кода, но я звонил в службу wcf, которая использует поведение, использующее log4net, и, конечно же, она была правильно настроена в среде разработки. но не в постановочной среде, поэтому на отслеживание потребовалось больше времени.

Меня действительно беспокоит, что он просто завис, вместо того, чтобы генерировать исключение о том, что логин не работает. Это какая-то ошибка в log4net?


person BVernon    schedule 15.08.2014    source источник
comment
Если кто-то не принесет с собой хрустальный шар, вам нужно будет предоставить дополнительную информацию. Файлы конфигурации и код, который вы используете для вызова, возможно, реализация службы и т. Д.   -  person Tim    schedule 16.08.2014
comment
@ Тим Ложь. См. Ответ ниже. :)   -  person BVernon    schedule 09.01.2018


Ответы (1)


Нет, это не ошибка, это задокументированное поведение:

log4net - это оптимальная и безотказная система ведения журналов.

Под отказом мы подразумеваем, что log4net не будет генерировать неожиданные исключения во время выполнения, что может привести к сбою вашего приложения. Если по какой-либо причине log4net выдает неперехваченное исключение, отправьте электронное письмо в список рассылки [email protected]. Неперехваченные исключения рассматриваются как серьезные ошибки, требующие немедленного внимания.

Если вы хотите проверить правильность своей конфигурации, в документации предлагается такой код:

Чтобы предотвратить тихий сбой log4net, log4net поддерживает способ оценки того, был ли он настроен, а также для оценки сообщений, генерируемых при запуске, начиная с 1.2.11. Чтобы проверить, правильно ли был запущен и настроен log4net, можно проверить свойство log4net.Repository.ILoggerRepository.Configured и перечислить сообщения конфигурации следующим образом:

if(!log4net.LogManager.GetRepository().Configured)
{
    // log4net not configured
    foreach(log4net.Util.LogLog message in 
             log4net.LogManager.GetRepository()
                    .ConfigurationMessages
                    .Cast<log4net.Util.LogLog())
    {
        // evaluate configuration message
    }
}
person stuartd    schedule 18.08.2014
comment
Спасибо. +1 за объяснение, но кое-что я до сих пор не понимаю. Чем вызвать тупик «лучше», чем выбросить неперехваченное исключение? По крайней мере, я мог игнорировать неперехваченное исключение в моем собственном приложении, и это не сломало бы его. Но я не могу ничего (разумно практичного) сделать с тупиком. Мне кажется, что на самом деле это хуже, чем неперехваченное исключение, не так ли? - person BVernon; 18.08.2014
comment
Я начал отмечать этот ответ, потому что он здесь единственный, но я просто не могу. Если неперехваченные исключения обрабатываются как серьезные ошибки, требующие немедленного внимания, как вы говорите, то возникновение тупика следует рассматривать как в 10 раз более серьезную проблему. - person BVernon; 01.12.2014
comment
В своем вопросе вы говорите, что проблема заключалась в неправильной строке подключения к базе данных. Как это может вызвать тупик? - person stuartd; 01.12.2014
comment
Вы спрашиваете, почему XmlConfigurator.Configure () вызывает тупик, если строка подключения неверна? Я, очевидно, не могу ответить на этот вопрос, потому что я не писал Log4Net. - person BVernon; 02.12.2014
comment
Я понимаю, что тупиковая ситуация возникает, когда конфликтуют две операции с базой данных при доступе к тому же ресурсу, что, если строка подключения недействительна, очевидно, невозможно. Log4net пытается установить SqlConnection таким же образом, как и любой другой код, поэтому он будет ждать истечения времени ожидания подключения, установленного в строке подключения, до сбоя (или 15 секунд, что по умолчанию). Это заблокирует текущий поток, как и все SqlConnections. - person stuartd; 02.12.2014
comment
Хотя термин «тупик» не относится к операциям с базой данных, я использовал этот термин несколько более широко, чем следовало бы. Я просто имел в виду, что мой код ожидает возврата метода Log4Net, а этого никогда не происходит. Я не имел в виду, что выполнялись какие-либо операции с базой данных. - person BVernon; 02.12.2014
comment
Итак, 3 года спустя я получил положительный отзыв по этому вопросу и сейчас просматриваю комментарии, и я думаю, если я правильно помню, проблема заключалась в том, что кто-то думал, что параметр тайм-аута в строке cxn был в миллисекундах. Я, к сожалению, не сразу понял, что кто-то установил тайм-аут на 15000 (что, я не знаю, почему они это сделали, поскольку, если они хотели 15 секунд, это все равно по умолчанию). Так что просто хотел поблагодарить за вашу помощь и извиниться за то, что разочаровался в вас, когда «тупик» был полностью нашей ошибкой. - person BVernon; 09.01.2018