【问题标题】:NLog: How do I control the format of a message from a LogEventInfo object?NLog:如何控制来自 LogEventInfo 对象的消息格式?
【发布时间】:2014-10-08 14:30:42
【问题描述】:

我是 NLog 的新手,我一直在使用 LogEventInfo 对象,因为我认为我的应用程序中需要它们。我用纯文本字符串创建了一个 LogEventInfo 对象,然后我调用了 Logger.Debug(myEventInfoObject),使用 FileAppender 设置来写入 ${message}。在我希望看到我的文本字符串的地方,我看到了记录器名称、消息级别、消息和序列 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 日志事件:Logger=''Level=Debug Message='LogInfoEvent 中的这条消息将不会被使用。'序列ID=2

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

非常感谢!

罗伯R

【问题讨论】:

    标签: c# nlog


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        @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()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-22
          • 2019-08-16
          • 1970-01-01
          • 2015-05-03
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 2019-07-25
          相关资源
          最近更新 更多