NLog自定义LayoutRenderer - json:无法正常工作

时间:2014-05-17 11:44:18

标签: c# asp.net-mvc nlog

我是NLog的新手,主要是设置非常简单。

我遇到的问题是设置自定义LayoutRenderer

JsonLayoutRenderer.cs(名称空间:NBT.Logging;在同一解决方案中单独的项目)

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

        }
    }
}

代码来自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>

因此,记录到redis会显示所有正常的布局项,但不会显示$ {json}位

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

可能遗漏了一些简单的事情。

更新(将注册layoutRenderer添加到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));

    }

1 个答案:

答案 0 :(得分:1)

还可以将程序集添加到包含自定义布局渲染器的NLog.config中:

&#13;
&#13;
<extensions>
  <add assembly="MyNLogExtensions"/>
</extensions>
&#13;
&#13;
&#13;

请参阅this other post