2016-08-08 45 views
0

Ich habe eine funktionierende Konfiguration von NLog. Ich benutze NLog.configNLog programmgesteuert konfigurieren

<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> 

und es funktioniert gut. Aber jetzt muss ich NLog programmgesteuert konfigurieren. So versuche ich

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; 

Interne Logger funktioniert gut, aber gemeinsame Logger nicht. Was habe ich bei der Konfiguration verpasst?

Antwort

0

Soweit ich den Quellcode von NLog verstanden habe, wird LogLevel.Trace nicht als Mindestloglevel verwendet, wenn Sie in der Struktur LoggingRule nicht den Mindestprotokolliergrad angeben. Aber das habe ich erwartet. Eigentlich scheint es, als wäre es ein Fehler in der Quelle: Es gibt keinen EnableLoggingForLevels Anruf (all LoggingRule have EnableLoggingForLevels call but this). Also, das Update meines Problems ist nur ein Parameter in Konstruktor:

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

statt

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

Nun sind alle Ausnahme protokolliert werden und der Code funktioniert.

0

Sie müssen NLog.Web auch in C# registrieren, wird diese benötigt für ${aspnet-request} usw.

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

Wenn die XML-Konfigurationsdatei verwendet, dann auto Laden verwendet wird (noch nicht in .NET-Core).

Dieses Problem sollte auch im internen Protokoll sichtbar sein.