NLog:如何从LogEventInfo对象控制消息的格式?

时间:2014-10-08 14:30:43

标签: c# nlog

我是NLog的新手,我一直在玩LogEventInfo对象,因为我认为我的应用程序中需要它们。我使用纯文本字符串创建了一个LogEventInfo对象,然后使用设置为写入$ {message}的FileAppender调用了Logger.Debug(myEventInfoObject)。在我希望看到我的文本字符串的地方,我看到了记录器名称,消息级别,消息和序列ID。我发现扩展字符串是我调用myEventInfoObject.ToString()时得到的。如何控制$ {message}来自LogEventInfo对象时出现的内容?

这是我的配置文件:

<?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">
  <targets>
    <target name="file" xsi:type="File" layout="${longdate}  ${logger}  ${message}" fileName="${basedir}/nlog_sample_file.txt" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="file" />
  </rules>
</nlog>

这是我生成日志的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NLog;

namespace NLogSample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Logger logger = LogManager.GetCurrentClassLogger();
                LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", "This message from the LogInfoEvent will not be used.");
                theEvent.Properties["Message"] = "This message from the LogInfoEvent Message property will be used.";

                logger.Debug(theEvent);
                logger.Debug("Does the sequence ID show up in this message?");

                string formattedMessage = theEvent.FormattedMessage;
                string eventString = theEvent.ToString();
            }
            catch (Exception ex)
            {
                int a = 1;
            }
        }
    }
}

最后,这是一个消息示例:

2014-10-08 10:14:13.5525 NLogSample.Program日志事件:记录器=&#39;&#39; Level = Debug Message =&#39;不会使用来自LogInfoEvent的此消息。&#39; SequenceID = 2

我在Win7 Pro计算机上使用Visual Studio 2012。

非常感谢!

ROBR

3 个答案:

答案 0 :(得分:1)

我必须这样做

    class MyLogEventInfo : LogEventInfo {
        public override string ToString() {
            return base.FormattedMessage;
        }
    }

...

    var theEvent = new MyLogEventInfo();
    theEvent.Message = "This message from the LogInfoEvent will not be used.";
    logger.Debug(theEvent);

答案 1 :(得分:0)

如果您要创建LogEventInfo个对象并使用自己的信息填充它们,则应使用Logger.Log方法签名之一,而不是Logger.Info/Logger.Debug/etc方法签名。

您现在看到的行为可能是因为Logger.Debug方法正在接收一个对象(恰好是LogEventInfo个对象)并且在记录它之前正在调用ToString

答案 2 :(得分:0)

@wageoghe是对的。以下是我如何使用它:

// Create the logger
Logger logger = LogManager.GetCurrentClassLogger();

// Create the LogEventInfo object
LogEventInfo logEvent = new LogEventInfo();

// Now add the event characteristics
logEvent.Properties["EventCode"] = eventId;
logEvent.Level = level;
logEvent.Message = message;
logEvent.Exception = ex;

// Actually write the log entry.
logger.Log(logEvent);

无需使用包装器日志对象,只需使用LogEventInfo()中的Level属性定义LogLevel,然后将该对象传递给Log()