如何解决AssemblyInfo 中的 Log4Net 配置加载
我遇到了一个奇怪的问题。
在一个解决方案中,我有一个共享的程序集信息文件(解决方案文件)并将它与常规的 AssemblyInfo.cs 链接到我的项目中。属性设置为构建。 在所有项目之间共享的属性位于 SharedAssemblyInfo.cs 文件中。特定于项目的属性位于 AssemblyInfo.cs 中。
现在在配置log4net时,只有在SharedAssemblyInfo.cs中放置log4net属性时才会读取配置文件。当我把它放入 AssemblyInfo.cs 时,log4net 不会初始化。
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
这对我来说毫无意义。如果它只能在 AssemblyInfo.cs 中工作,我会以某种方式理解。认为可能是编译顺序或文件在 csproj 文件中的包含顺序,但这似乎无关紧要。
有什么想法吗?
解决方法
刚刚找到了行为的根本原因。
我有这样的程序集:
Job.exe -> Shared.dll
在 Shared.dll 中,我有一个调用 LogManager.GetLogger(
的日志记录服务。
看来,log4net 程序集属性需要在首先调用 LogManager.GetLogger()
的程序集中。当我第一次从 Job.exe 调用 GetLogger()
时,即使 Shared.dll
中没有 log4net 程序集属性,Log4Net 也会正确初始化。
也在 docs 中找到了这个:
使用属性可以是一种更清晰的方法,用于定义将从何处加载应用程序的配置。然而值得注意的是,属性是纯粹被动的。它们仅供参考。因此,如果您使用配置属性,则必须调用 log4net 以允许它读取属性。对 LogManager.GetLogger 的简单调用将导致读取和处理调用程序集上的属性。 因此,必须在应用程序启动期间尽早进行日志记录调用,尤其是在加载和调用任何外部程序集之前。
如果您使用此方法配置 Log4Net,则在从入口程序集以外的程序集获取记录器时会遇到相同的问题。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net configSource="log4net.config" />
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。