Плохая конфигурация NLog?

Итак, я пробую NLog, но он продолжает падать. Позвольте мне пройти через то, что у меня есть до сих пор.

Мой файл NLog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets>
      <target name="file" xsi:type="File"
            layout="${longdate} ${logger} ${message}"
            fileName="${basedir}/Logs/${shortdate}.log" />
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="file" />
    </rules>
</nlog>

Затем я создаю свой объект следующим образом:

private static Logger logger = LogManager.GetCurrentClassLogger();

И затем, когда я хочу что-то записать, я делаю это так:

try
{   
    // Do something
}
catch (Exception ex)
{
    logger.Fatal("ERROR {0}", ex);
    return null;
}

Но я получаю следующие ошибки:

System.TypeInitializationException was unhandled
Message="The type initializer for 'Rhs.CMSSites.Services.GetBlogFeeds' threw an exception."
Source="GetBlogFeeds"
TypeName="Rhs.CMSSites.Services.GetBlogFeeds"
StackTrace:
   at Rhs.CMSSites.Services.GetBlogFeeds.Main(String[] args)
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.NullReferenceException
   Message="Object reference not set to an instance of an object."
   Source="GetBlogFeeds"
   StackTrace:
        at Rhs.CMSSites.Services.GetBlogFeeds.UserDetails(String UserName) in C:\Dev\Rhs.CMSSites.Services\GetBlogFeeds\GetBlogFeeds\Program.cs:line 217
        at Rhs.CMSSites.Services.GetBlogFeeds..cctor() in C:\Dev\Rhs.CMSSites.Services\GetBlogFeeds\GetBlogFeeds\Program.cs:line 25
   InnerException: 

Любые идеи?

Изменить

Вероятно, нужно было упомянуть об этом раньше, но это приложение командной строки. GetBlogFeeds — это имя класса.

Изменить2

Хорошо, я был абсолютным идиотом. Я вызывал метод UserDetails() (который пытается использовать метод NLog) до создания экземпляра класса регистратора. Я собираюсь проголосовать за вас обоих. Спасибо и извините.


person Piers Karsenbarg    schedule 29.12.2010    source источник


Ответы (2)


Я предполагаю (и это именно так), что это не имеет никакого отношения к NLog, а скорее то, что TypeInitializationException настолько серьезен и/или не происходит в контексте этого try ... catch, что NLog не имеет возможности зарегистрировать Это.

Если вы поставите точку останова на этот оператор logger.Fatal, остановится ли выполнение там, когда вы запустите его с подключенным отладчиком?

Что на самом деле происходит в ctor класса для GetBlogFeeds - из трассировки стека видно, что вы вызываете UserDetails для конкретного пользователя, что кажется немного странным в классе ктор.

person AakashM    schedule 29.12.2010

Почему вы возвращаете null, когда происходит исключение?

Основываясь на опубликованном исключении из-за нулевого исключения, это также, конечно, может быть связано с тем, что вы пытаетесь зарегистрировать весь объект исключения вместо его сообщения.

Убедитесь, что вы согласны с этим ответом, чтобы отметить его как ответ. Если у вас есть дополнительные вопросы относительно опубликованной ошибки, я могу ответить на них. Без дополнительной информации (например), где именно происходит ошибка в вашем коде, я не могу предоставить дополнительную информацию.

Я только что указал на два странных поведения.

person Security Hound    schedule 29.12.2010
comment
Возвращение null только временно, пока я пытаюсь заставить это работать. - person Piers Karsenbarg; 30.12.2010
comment
За исключением того, что вся проблема заключается в возврате, попробуйте изменить метод на void, чтобы увидеть, не падает ли он по-прежнему. Как сказал AskashM, у вас есть другие проблемы. Помимо того, что вы возвращаете null, это плохая практика, если вы не проверяете его позже и избегаете фактического использования нулевого значения (которым вы являетесь) на основе этого нулевого исключения. - person Security Hound; 30.12.2010