是否有人知道是否可以从同一文件中的log4net配置部分(不使用代码)访问配置文件的appSettings部分中的键/值?
例如:
<appSettings>
<add key="Environment" value="DEV" />
<!-- etc -->
</appSettings>
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="${APPDATA}\MyApp\${Environment}\MyApp.log" />
<!-- etc -->
</log4net>
似乎没有关于此的任何文档,所以我没有希望...如果所有其他方法都失败了,我只需将“DEV”添加到文件值中并将其与appSettings的Environment变量一起放入
提前致谢,
罗布
答案 0 :(得分:4)
您应该使用 log4net.Util.PatternString 作为文件类型,并使用%appSetting {SETTING}
参考应用设置见下面的代码:
<appSettings>
<add key="Environment" value="DEV" />
<!-- etc -->
</appSettings>
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString"
value="${APPDATA}\MyApp\%appSetting{Environment}\MyApp.log"/>
<!-- etc -->
</log4net>
希望这仍然有帮助:)
答案 1 :(得分:2)
感谢@wageoghe的帮助。最后,我决定再次将环境值添加到配置文件中(为简单起见):
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="${APPDATA}\MyApp\DEV\MyApp.log" />
<!-- etc -->
</log4net>
答案 2 :(得分:1)
如果你看看我对这个问题的回答:
Custom log4net property PatternLayoutConverter (with index)
您将找到自定义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>
在配置中,我想从Form的AppSettings中获取“KLPC”设置。
在您的情况下,您希望从配置文件的appSettings中获取值。修改我提供的示例应该很容易,用Form代替从Form的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>
你说你想在不编写代码的情况下这样做。我不确定它是否可以完成,但使用我上面显示的方法非常常见且很容易。