Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NLog custom LayoutRenderer - json: can't get working

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));

    }
like image 885
mrdnk Avatar asked May 17 '14 11:05

mrdnk


1 Answers

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.

like image 154
Antoni Avatar answered Nov 07 '22 17:11

Antoni