PatternString 类型何时在 Log4NET 中得到解析?

When does PatternString type get resolved in Log4NET?

假设我有以下 CustomSmtpAppender:

 <appender name="SmtpAppender" type="EmgNetExt.EMGSmtpAppender, EmgNetExt">  
...
 <subject type="log4net.Util.PatternString" value="ERROR: %property{app_sub_name}" />
...
</appender>

所以每次发送电子邮件时,%属性{app_sub_name} 都会解析为空字符串。它最初设置为一个空字符串,但随着应用程序运行,该值会更改以标记应用程序在某个时间点的位置,以防发生错误。所以我导致了错误的发生,在调试点我看到了:

log4net.GlobalContext.Properties("app_sub_name") returns 正确的值,但我的电子邮件仍然显示为空白 "app_sub_name"。

所以我想也许 log4net 在最初读取 log4net.config 时解析了 PatternString JUST ONCE 但我无法确认这一点或者我可能错过了步骤和做错事。 log4net 何时解析主题元素?仅在最初加载 log4net.config 时或每次调用 appender 时?有没有办法在每次调用 appender 时强制它解析?

Appenders 在配置 log4net 时只被解析和评估一次(例如,通过 XmlConfigurator.Configure 调用),所以正如你猜到的主题将被评估一次。 SmtpAppenderSubject 属性 是字符串而不是具有动态功能的类型,支持这一点。此外 ToFrom 属性也不是动态的,因此您无法在执行期间更改它们。即使您使用 PatternString,它也会在解析配置时通过类型转换器转换为字符串。

无法使用当前 SmtpAppender 更改此行为,因为属性是非动态的。您可以创建一个使用动态值填充电子邮件字段的附加程序。