本文转自:https://github.com/NLog/NLog/issues/1366
In the previous versions of NLog it was easily possible to map custom log properties to custom database columns using LogEventInfo
and ${event-properties}
layout renderer:
LogEventInfo evt = new LogEventInfo(logLevel, "", message);
evt.Properties["custom"] = "some data";
log.Log(evt);
I cannot make this work using ASP.NET Core and NLog.Extensions.Logging.NLogLogger
.
I am using standard ASP.NET Core logging infrastructure and NLog.Extensions.Logging
package. At the runtime, my Microsoft.Extensions.Logging.ILogger
contains additional NLog.Extensions.Logging.NLogLogger
instance, configured to write all the events to the database. I want to pass some dictionary-like object to Microsoft.Extensions.Logging.ILogger.Log()
to make this information available to NLog layout renderers. Is it supported?
Hi @dr-noise May be you can use the state parameter of Log method to send the dictionary but you should have to write your own ILogger implementation to write it in NLog logger.
Actually we can't handle this scenario because the ILogger interface is part of .NET Core and we can't extend the method signature
Thanks @phenixdotnet I'll have deeper look into this, I thought that state
parameter already supported by the NLog.Extensions.Logging.NLogLogger
.
For example, NLogLogger
can check if state
is instance of Dictionary<string, string>
(or Dictionary<object, object>
) and push all data from there to the underlying LogEventInfo.Properties
.
I think we should do something about this is the near future. The aspnet logging is prepared for structural logging, but NLog not.
Related http://nlog.userecho.com/topics/21-make-structural-logging-possible/