我可以将自定义属性传递给 NLOG 并输出到文件吗?

2024-02-02

编辑 4:“From”似乎是 NLog 中的保留字。更改它“FromID”有效。这是一种将变量传递给 NLog 并保持代码干净的好方法!!!!谢谢迈克!!!

编辑3.我真的很喜欢这个主意:

按照迈克的建议实现了一个辅助类:

public class NLogHelper
{
    //
    // Class Properties
    //
    private Logger m_logger;
    private Dictionary<string, object> m_properties;


    //
    // Constructor
    //
    public NLogHelper(Logger logger)
    {
        m_logger = logger;
        m_properties = new Dictionary<string, object>();
    }

    //
    // Setting Logger properties per instancce
    //
    public void Set(string key, object value)
    {
        m_properties.Add(key, value);
    }

    //
    // Loggers
    //
    public void Debug(string format, params object[] args)
    {
        m_logger.Debug()
            .Message(format, args)
            .Properties(m_properties)
            .Write();
    }

在我的主要代码中,我有:

    private NLogHelper m_logger;
    public void Start() 
    {
        m_logger = new NLogHelper(LogManager.GetCurrentClassLogger());
        m_logger.Set("From", "QRT123");  // Class setting.
        m_logger.Debug("Hello ");
    }

并且在配置文件中设置的目标如下:

<target xsi:type="File"
    name ="LogFile" fileName="C:\QRT\Logs\QRTLog-${shortdate}.log"
    layout ="${date}|${level}|${event-properties:item=From}|${message} "/>

但输出的“from”属性处有一个空白???

所以我就快到了...但它似乎不起作用?

编辑2: 我现在正在尝试创建我自己的 NLog 调用版本:

private void Log_Debug (string Message) 
{
   LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "What is this?", Message);
   theEvent.Properties["EmployeeID"] = m_employeeID;
   m_logger.Log(theEvent);
}

问题是我必须格式化调用的字符串(但性能巨大)......但这看起来像是一个黑客?

理想情况下,我会在自定义布局渲染器中声明属性,而不是在配置文件中设置这些属性,我的类的每个实例都会设置属性...类似于[ID = m_ID]对于全班来说。这样,每当从该类调用 NLog 时,都会设置 ID 属性,并且 NLog 的自定义布局渲染器可以使用此属性来输出它。我说得有道理吗??

我是 NLog 新手,一直在研究自定义渲染器。 基本上,我的目标是让我的日志语句为:_logger.Debug ("My Name is {0}", "Ed", ID=87);

我希望我的渲染是这样的:layout = ${ID} ${date} ${Level} ${Message}

就是这样。 ${ID} 可以有默认值 0。很好。但理想情况下,我希望每次调用都能够指定 ID,而不需要每次需要记录 3 行。

我见过自定义渲染器允许我自定义输出内容,但我不确定如何自定义传递给它的属性而不需要

https://github.com/NLog/NLog/wiki/Extending%20NLog https://github.com/NLog/NLog/wiki/Extending%20NLog显示了如何添加属性,但我不知道如何调用它们。

Also, https://github.com/NLog/NLog/wiki/Event-Context-Layout-Renderer https://github.com/NLog/NLog/wiki/Event-Context-Layout-Renderer显示了如何设置自定义属性,但这涉及到每次我想要记录某些内容时创建 LogEventInfo 对象。

Nlog 自定义布局渲染器 https://stackoverflow.com/questions/5951102/nlog-custom-layoutrenderer再次展示如何自定义输出......而不是如何自定义输入。

这是针对使用 VS2013 的面向 .NET 4.0 的 C# 控制台应用程序

谢谢 -埃德


事件属性(过去称为事件上下文)将是执行您想要的操作的内置方式。如果您使用的是 NLog 3.2+,您可以使用 Fluent api,这可能比创建更有吸引力LogEventInfo对象。您可以使用命名空间来访问此 apiNLog.Fluent.

然后你的布局将被定义如下:

${event-properties:item=ID} ${date} ${Level} ${Message}

然后使用 Fluent api,像这样记录:

_logger.Debug()
    .Message("My name is {0}", "Ed")
    .Property("ID", 87)
    .Write();

除了如上所述设置每个事件的属性之外,唯一的其他选项是使用以下命令设置每个线程的属性MDC https://github.com/nlog/NLog/wiki/Mdc-Layout-Renderer or MDLS https://github.com/nlog/NLog/wiki/MDLC-Layout-Renderer.

NLog 没有(我发现的)设置每个记录器属性的方法。在内部,NLog 缓存Logger实例按记录器名称,但不保证相同的实例Logger将始终针对给定的记录器名称返回。例如,如果你打电话LogManager.GetCurrentClassLogger()在你的类的构造函数中,大多数时候您将为类的所有实例返回相同的 Logger 实例。在这种情况下,您将无法在记录器上为类的每个实例提供单独的值。

也许您可以创建一个可以在类中实例化的日志记录帮助程序类。可以使用要随每条消息记录的每个实例的属性值来初始化帮助程序类。帮助器类还将提供方便的方法来记录上述消息,但只需一行代码。像这样的事情:

// Example of a class that needs to use logging
public class MyClass
{
    private LoggerHelper _logger;

    public MyClass(int id)
    {
        _logger = new LoggerHelper(LogManager.GetCurrentClassLogger());

        // Per-instance values
        _logger.Set("ID", id);
    }

    public void DoStuff()
    {
        _logger.Debug("My name is {0}", "Ed");
    }
}


// Example of a "stateful" logger
public class LoggerHelper
{
    private Logger _logger;
    private Dictionary<string, object> _properties;


    public LoggerHelper(Logger logger)
    {
        _logger = logger;
        _properties = new Dictionary<string, object>();
    }

    public void Set(string key, object value)
    {
        _properties.Add(key, value);
    }

    public void Debug(string format, params object[] args)
    {
        _logger.Debug()
            .Message(format, args)
            .Properties(_properties)
            .Write();
    }
}

这适用于与上面相同的布局。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将自定义属性传递给 NLOG 并输出到文件吗? 的相关文章

随机推荐