如果你看看我对这个问题的回答:
自定义 log4net 属性 PatternLayoutConverter(带索引)
您将找到一个自定义 PatterLayoutConverter 的示例。在示例的情况下,我将其命名为:KeyLookupPatternConverter。
为方便起见,这里是:
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);
}
}
}
}
以下是您将如何配置它:
//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>
在配置中,我是说从表单的 AppSettings 中获取“KLPC”设置。
在您的情况下,您希望从配置文件的 appSettings 中获取您的值。修改我提供的示例应该很容易,将从表单的 AppSettings 中检索设置的代码替换为从配置文件的应用程序设置中检索设置的代码。
如果您采用这条路线,您的 AppSettingPatternConverter 可能看起来像这样(未经测试):
class AppSettingsPatternConverter : 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 = ConfigurationManager.AppSettings[Option];
if (string.IsNullOrWhitespace(setting))
{
setting = string.Format("No setting value for key[{0}]", Option);
}
writer.Write(setting);
}
}
您可以像这样配置它:
//Log the "Name" setting from the application settings object
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p [name = %AppSetting{Name}] %m%n"/>
<converter>
<name value="AppSetting" />
<type value="Log4NetTest.AppSettingPatternConverter" />
</converter>
</layout>
你说你想在不编写代码的情况下做到这一点。我不确定它是否可以完成,但使用我上面展示的方法非常常见且非常简单。