I'm new to NLog, and mostly it's very simple to setup.
The problem I'm having 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>
So the logging to redis show all the normal layout items but not the ${json} bit
"2014-05-17 12:36:58.7480|INFO|ExampleController|Index loaded|j|"
Probably missing something simple.
Update (Added register layoutRenderer to 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));
    }
                It's also possible to add an assembly to NLog.config containing the custom layout renderer:
<extensions>
  <add assembly="MyNLogExtensions"/>
</extensions>
See this other post.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With