编辑4:"来自"似乎是NLog中的保留字。改变它" FromID"工作。这是一种将变量传递给NLog并保持代码清洁的绝佳方式!谢谢MIKE !!!
编辑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} "/>
但输出有一个BLANK代替&#39;来自&#39;财产???
所以我几乎都在......但它似乎不起作用?
编辑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/Event-Context-Layout-Renderer显示了我如何设置自定义属性,但每次我想记录某些内容时都会创建一个LogEventInfo对象。
Nlog Custom layoutrenderer显示了如何再次自定义输出...而不是如何自定义输入。
这适用于使用VS2013
定位.NET 4.0的C#中的控制台应用由于 -Ed
答案 0 :(得分:23)
事件属性(以前称为事件上下文)将是执行所需操作的内置方式。如果您使用的是NLog 3.2+,则可以使用流畅的api,这可能比创建LogEventInfo
对象更具吸引力。您可以使用命名空间NLog.Fluent
来访问此API。
然后您的布局将如下定义:
${event-properties:item=ID} ${date} ${Level} ${Message}
然后使用流畅的api,记录如下:
_logger.Debug()
.Message("My name is {0}", "Ed")
.Property("ID", 87)
.Write();
除了如上所述设置每个事件的属性之外,唯一的另一个选择是使用MDC或MDLS为每个线程设置属性。
NLog没有办法(我已经找到)设置per-logger属性。在内部,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();
}
}
这可以使用与上面相同的布局。
答案 1 :(得分:2)
使用MDLC布局渲染器
MappedDiagnosticsLogicalContext.Set(“PropertyName”,“PropertyValue”); MappedDiagnosticsLogicalContext.Set( “PropertyName2” “AnotherPropertyValue”);
在你的nlog配置中:
$ {mdlc:item = PropertyName} $ {mdlc:item = PropertyName2}
答案 2 :(得分:2)
NLog 4.5支持使用消息模板进行结构化日志记录:
logger.Info("Logon by {user} from {ip_address}", "Kenny", "127.0.0.1");
另请参阅https://github.com/NLog/NLog/wiki/How-to-use-structured-logging
答案 3 :(得分:-4)
这可能不是最好的方法,甚至不是线程安全的,而是一个快速而肮脏的解决方案:你可以使用环境变量:
Environment.SetEnvironmentVariable("NLogOptionID", "87");
logger.Debug("My Name id Ed");
Environment.SetEnvironmentVariable("NLogOptionID", null);
在布局中,您可以使用环境变量。
${environment:variable=NLogOptionID}