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();
mrdnk source share