2016-08-08 5 views
0

У меня есть рабочая конфигурация NLog. Я использую NLog.configКонфигурирование программного обеспечения NLog

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogFile="e:\InternalLog.txt" throwExceptions="true"> 
    <targets> 
    <target name="database" xsi:type="Database"> 
     <connectionStringName>DB.Log</connectionStringName> 
     <commandText> 
     insert into dbo.Log (
      Logged, Level, Message, Username, Url, Logger, CallSite, Exception, Stacktrace, remoteAddress 
     ) values (
      @Logged, @Level, @Message, @Username, @Url, @Logger, @CallSite, @Exception, @Stacktrace, @RemoteAddress 
     ); 
     </commandText> 
     <parameter name="@logged" layout="${date}" /> 
     <parameter name="@level" layout="${level}" /> 
     <parameter name="@message" layout="${message}" /> 
     <parameter name="@username" layout="${identity}" /> 
     <parameter name="@url" layout="${aspnet-request:serverVariable=HTTP_URL}${aspnet-request:queryString}" /> 
     <parameter name="@remoteAddress" layout="${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}" /> 
     <parameter name="@logger" layout="${logger}" /> 
     <parameter name="@callSite" layout="${callsite}" /> 
     <parameter name="@exception" layout="${exception:format=tostring}" /> 
     <parameter name="@stacktrace" layout="${stacktrace:format=DetailedFlat}" /> 
    </target> 
    </targets> 
    <rules> 
    <logger name="*" writeTo="database" /> 
    </rules> 
</nlog> 

и он отлично работает. Но теперь мне нужно настроить NLog программно. Поэтому я стараюсь

var config = new LoggingConfiguration(); 
var dbTarget = new DatabaseTarget { 
    ConnectionString = connectionString, 
    DBProvider = "sqlserver", 
    Name = "database", 
    CommandText = 
     @"insert into dbo.Log (
      Logged, Level, Message, Username, Url, Logger, CallSite, Exception, Stacktrace, remoteAddress 
     ) values(
      @Logged, @Level, @Message, @Username, @Url, @Logger, @CallSite, @Exception, @Stacktrace, @RemoteAddress 
     );" 
}; 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@logged", "${date}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@level", "${level}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@message", "${message}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@username", "${identity}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@url", "${aspnet-request:serverVariable=HTTP_URL}${aspnet-request:queryString}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@remoteAddress", "${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@logger", "${logger}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@callSite", "${callsite}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@exception", "${exception:format=tostring}")); 
dbTarget.Parameters.Add(new DatabaseParameterInfo("@stacktrace", "${stacktrace:format=DetailedFlat}")); 
config.AddTarget("database", dbTarget); 
var rule = new LoggingRule("*", dbTarget); 
config.LoggingRules.Add(rule); 
LogManager.Configuration = config; 
InternalLogger.LogFile = internalLogFile; 

Внутренний регистратор работает нормально, но обычный регистратор этого не делает. Что я пропустил при настройке?

ответ

0

Как я понял исходный код NLog, если вы не указали минимальный уровень журнала в LoggingRule, то структура LogLevel.Trace не будет использоваться как минимальный уровень журнала. Но я ожидал, что так и будет. На самом деле, похоже, что это ошибка в источнике: нет EnableLoggingForLevels звонок (all LoggingRule have EnableLoggingForLevels call but this). Таким образом, исправление моей проблемы является только один параметр в конструкторе:

var rule = new LoggingRule("*", LogLevel.Trace, dbTarget); 

вместо

var rule = new LoggingRule("*", dbTarget); 

Теперь все исключения будут регистрироваться и код работает отлично.

0

Вы должны зарегистрироваться NLog.Web также в C#, это необходимо для ${aspnet-request} и т.д.

var extensionAssembly = Assembly.LoadFrom("nlog.web"); 
ConfigurationItemFactory.Default.RegisterItemsFromAssembly(extensionAssembly); 

При использовании файла XML конфигурации, то используется автоматическая загрузка (пока не в .NET Ядра).

Эта проблема также должна быть видна во внутреннем журнале.