2016-08-08 3 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

는 그런 다음 자동 로딩 (.NET 코어에 아직) 사용되는 XML 설정 파일을 사용하는 경우이가 ${aspnet-request}

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

에 필요한, C#으로도 NLog.Web을 등록해야합니다.

이 문제는 내부 로그에도 표시되어야합니다.

관련 문제