假设我有以下CustomSmtpAppender:
<appender name="SmtpAppender" type="EmgNetExt.EMGSmtpAppender, EmgNetExt">
...
<subject type="log4net.Util.PatternString" value="ERROR: %property{app_sub_name}" />
...
</appender>
因此每次发送电子邮件时,%propery {app_sub_name}都会解析为空字符串。它最初设置为空字符串,但随后应用程序运行时,值会更改为标记应用程序在某个时间点的位置,以防发生错误。所以我导致了错误发生,在调试点我看到了:
log4net.GlobalContext.Properties("app_sub_name")
返回正确的值,但我的电子邮件仍然显示空白的“app_sub_name”。
所以我想也许log4net在最初读取log4net.config时解析了PatternString JUST ONCE 但是我无法确认这一点,或者我错过了一步并做错了什么。 log4net何时解析主题元素?只是在最初,当它加载log4net.config或每次调用appender时?有没有办法在每次调用appender时强制它解决?
答案 0 :(得分:1)
在配置log4net时(例如通过XmlConfigurator.Configure
调用),仅对解析器进行解析和评估,因此您已经猜到主题将被评估一次。 Subject
的{{1}}属性是字符串而不是具有动态功能的类型,因此支持此功能。此外,SmtpAppender
和To
属性也不是动态的,因此您无法在执行期间更改它们。即使您使用From
,它也会在解析配置时通过类型转换器转换为字符串。
由于属性是非动态的,因此无法使用当前PatternString
更改此行为。您可以创建一个使用动态值填充电子邮件字段的追加器。