2015-11-09 4 views
0

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

Это мой NLog конфигурационный файл:

<nlog autoReload="true" 
     throwExceptions="true" 
     internalLogLevel="Debug" internalLogFile="c:\temp\nlog-internal.log"> 

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

Я также попытался обернуть метод Logger.Log внутри try-catch, чтобы убедиться, что он его не проглатывает, но оператор Logger.Log выполнен успешно.

Есть ли что-нибудь еще, чтобы поймать исключение в приложении. Я просто хочу подготовить кэш журнальных событий, которые не регистрируются, а затем вернуться к SQL Server, когда соединение снова будет доступно.

EDIT:

  1. Я использую последнюю версию NLog (v4.0).
  2. Я также подтвердил, что LogManager.ThrowException верен на времени выполнения тоже.

ответ

2

Write метод DatabaseTarget заворачивают в Try/улова, который будет только вновь бросить определенные типы исключений (StackOverflow, ThreadAbort, OutOfMemory и NLogConfiguration). Другие исключения, как вы заметили, будут записываться только во внутренний журнал.

Было бы довольно тривиально реализовать custom target, где вы подклассифицируете этот и переопределите этот метод, если это опция для вас.

protected override void Write(AsyncLogEventInfo[] logEvents) 
{ 
    var buckets = SortHelpers.BucketSort(logEvents, c => this.BuildConnectionString(c.LogEvent)); 

    try 
    { 
     foreach (var kvp in buckets) 
     { 
      foreach (AsyncLogEventInfo ev in kvp.Value) 
      { 
       try 
       { 
        this.WriteEventToDatabase(ev.LogEvent); 
        ev.Continuation(null); 
       } 
       catch (Exception exception) 
       { 
        if (exception.MustBeRethrown()) 
        { 
         throw; 
        } 

        // in case of exception, close the connection and report it 
        InternalLogger.Error("Error when writing to database {0}", exception); 
        this.CloseConnection(); 
        ev.Continuation(exception); 
       } 
      } 
     } 
    } 
    finally 
    { 
     if (!this.KeepConnection) 
     { 
      this.CloseConnection(); 
     } 
    } 
}