Ten uproszczony przykład pokazuje, co mi przyszło do po graniu z NLog. W moim rozwiązaniu używam konfiguracji opartej na kodzie, aby zminimalizować duplikaty plików xml nlog.config dla każdego projektu asp.net. Działa z NLog v4.4.1.
Logger statyczny pomocnik: konfiguracja
private static readonly Logger DefaultLogger = LogManager.GetLogger("Application");
public static void Debug(Exception exception = null, string message = null, object data = null)
=> Write(DefaultLogger, LogLevel.Debug, message, exception, data);
private static void Write(
Logger logger,
LogLevel level,
string message = null,
Exception exception = null,
object data = null)
{
var eventInfo = new LogEventInfo()
{
Level = level,
Message = message,
Exception = exception,
Parameters = new[] { data, tag }
};
if (data != null) eventInfo.Properties["data"] = data.ToJson();
eventInfo.Properties["level"] = eventInfo.GetLevelCode(); // custom level to int conversion
logger.Log(eventInfo);
}
FileTarget:
var jsonFileTarget = new FileTarget()
{
Name = "file_json",
Layout = new JsonLayout()
{
Attributes =
{
new JsonAttribute("level", "${event-context:item=level}"),
new JsonAttribute("time", "${longdate}"),
new JsonAttribute("msg", "${message}"),
new JsonAttribute("error", "${exception:format=tostring}"),
new JsonAttribute("data", "${event-context:item=data}", false),
},
RenderEmptyObject = false,
},
FileName = $"{LogFile.Directory}/json_{LogFile.Suffix}", // use settings from static LogFile class
ArchiveFileName = $"{LogFile.Directory}/json_{LogFile.ArchiveSuffix}",
ArchiveAboveSize = LogFile.MaxSize
};
Wyjście dla niestandardowego obiektu:
{ "level": "10", "time": "2017-02-02 16:24:52.3078", "data":{"method":"get","url":"http://localhost:44311/"}}