NLog custom LayoutRenderer - json: cannot work

I am new to NLog, and basically it is very easy to set up.

The problem I am facing is setting up a custom LayoutRenderer

JsonLayoutRenderer.cs (namespace: NBT.Logging; separate project within the same solution)

using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; using Newtonsoft.Json.Linq; using NLog; using NLog.LayoutRenderers; namespace NBT.Logging { [LayoutRenderer("json")] public class JsonLayoutRenderer : LayoutRenderer { protected override void Append(StringBuilder builder, LogEventInfo logEvent) { dynamic logEntry = new JObject(); logEntry.TimeStamp = logEvent.TimeStamp.ToString("yyyy-MM-ddTHH:mm:ss.mmmzzz", CultureInfo.InvariantCulture); logEntry.TimeStampUTC = logEvent.TimeStamp.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.mmmZ", CultureInfo.InvariantCulture); logEntry.Level = logEvent.Level.ToString(); logEntry.LoggerName = logEvent.LoggerName; logEntry.Message = logEvent.FormattedMessage; foreach(var prop in logEvent.Properties) { logEntry[prop.Key.ToString()] = prop.Value.ToString(); } var json = logEntry.ToString(Formatting.None); builder.Append(json); } } } 

Code taken from https://gist.github.com/caevyn/9594522

Nlog.config

 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="true"> <extensions> <add assembly="NLog.Targets.Redis"/> <add assembly="NBT.Logging" /> </extensions> <targets async="true"> <target xsi:type="Redis" name="redis" host="127.0.0.1" key="logstash" dataType="channel" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|j|${json}"/> </targets> <rules> <logger name="*" minlevel="Info" writeTo="redis" /> </rules> </nlog> 

Thus, an entry in redis displays all the usual layout elements, but not the $ {json} bit

"2014-05-17 12:36:58.7480|INFO|ExampleController|Index loaded|j|"

Probably something simple is missing.

Update (added registerRenderer register in Global.asax.cs)

 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); // Register custom Model Binders ModelBinderConfig.RegisterModelBinders(); ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("json", typeof(JsonLayoutRenderer)); } 
+6
source share
1 answer

It is also possible to add an assembly to NLog.config containing its own layout rendering:

 <extensions> <add assembly="MyNLogExtensions"/> </extensions> 

See this other post .

+1
source

Source: https://habr.com/ru/post/969429/


All Articles