wag*_*ghe 5 logging log4net nlog
是否可以创建一个允许配置"索引"值的log4net自定义PatternLayoutConverter?我知道"属性"转换字符串,它允许您编写如下代码:
ThreadContext.Properties["ID"] = yourID;
Run Code Online (Sandbox Code Playgroud)
并指定如下:
%property{ID}
Run Code Online (Sandbox Code Playgroud)
该值应包含在输出中.
如果我想记录的值在其他"字典"中怎么办?我想我可以编写一些逻辑来将这些值从字典复制到log4net上下文之一,然后只使用内置的%property令牌.如果我希望log4net根据配置文件中指定的索引值直接从我自己的"字典"中记录值,该怎么办?
我可以编写自己的PatternLayoutConverter,允许我配置如下内容:
%myproperty{ID}
Run Code Online (Sandbox Code Playgroud)
然后从我自己的"字典"中提取相应的"ID"值?
对于任何有兴趣的人来说,用NLog做同样的事情很容易:
[LayoutRenderer("MyGDC")]
class GdcLayoutRenderer : LayoutRenderer
{
[RequiredParameter]
[DefaultParameter]
public string Item { get; set; }
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
string msg = GDC.Get(this.Item);
builder.Append(msg);
}
protected override int GetEstimatedBufferSize(LogEventInfo logEvent)
{
return 10;
}
}
Run Code Online (Sandbox Code Playgroud)
并配置如下:
告诉NLog任何带扩展名的程序集:
<extensions>
<add assembly="NLog.Extensions"/>
</extensions>
Run Code Online (Sandbox Code Playgroud)
在布局中使用"indexed"属性:
<layout="${longdate} | ${MyGDC:item=name} | ${message}"/>
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我实际上使用NLog的GDC对象作为我的"字典",但我演示了如何编写自己的"可索引"LayoutRenderer(或多或少等同于log4net的PatternLayoutConverter)来访问由值中的值索引的值.配置文件.
[编辑]我得到了我想要的答案.我在这里包含了我的示例PatternLayoutRenderer的代码.在我的测试中,我在我的主窗体类中有一个静态字典,我可以存储"应用程序设置".我创建了一个PatternLayoutConverter,可以接受一个键作为参数,以便转换器可以在字典中查找正确的值.我可能能够使用log4net(或NLog)上下文对象实现相同的功能,但在我们的应用程序中,我们可能会有一些应用程序将用于其他目的的设置或会话信息,我们希望能够将其添加到记录输出.由于它已经在查找结构中,因此能够直接引用数据而不必将其显式复制到log4net(或NLog上下文)会很好.
无论如何,这是代码:
namespace Log4NetTest
{
class KeyLookupPatternConverter : PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
{
//Use the value in Option as a key into the "application settings" stored on the main form.
string setting;
if (Form1.AppSettings.TryGetValue(Option, out setting))
{
writer.Write(setting);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
布局配置:
//Log the "sessionid" and "userid" values from our "application settings" object
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p [session = %KLPC{sessionid}] [user = %KLPC{userid}] %m%n"/>
<converter>
<name value="KLPC" />
<type value="Log4NetTest.KeyLookupPatternConverter" />
</converter>
</layout>
Run Code Online (Sandbox Code Playgroud)
我没试过,但这应该有效.在log4net中,您可以将选项字符串传递给模式转换器,如下所示:
%converterName{converterOptions}
Run Code Online (Sandbox Code Playgroud)
例如,日期模式转换器可以像这样使用:
%date{HH:mm:ss,fff}
Run Code Online (Sandbox Code Playgroud)
这意味着您可以按照建议的方式编写模式转换器.这里可以找到这种转换器的简单示例.
在该Convert方法中,您可以使用属性"Option"(在PatternConverter类中定义)访问属性字符串,并使用线程上下文从字典中获取所需的条目.IOptionHandler如果您的选项仅包含字典键,则还可以实现接口:这样您就可以在激活log4net配置时解析选项.
| 归档时间: |
|
| 查看次数: |
5857 次 |
| 最近记录: |