初始化Google Stackdriver Appender时遇IAppender类型转换错误求助
问题详情
我在log4net配置中添加了Google Stackdriver Appender,但初始化时抛出类型转换异常,提示无法将Google.Cloud.Logging.Log4Net.GoogleStackdriverAppender转换为log4net.Appender.IAppender。
配置代码
<appender name="CloudLogger" type="Google.Cloud.Logging.Log4Net.GoogleStackdriverAppender,Google.Cloud.Logging.Log4Net"> <layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json"> <decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json" /> <member value="date:date" /> <member value="level:level" /> <member value="logger:logger" /> <member value="message:messageObject" /> <member value="exception:exception" /> </layout> <projectId value="playground" /> <logId value="test-api" /> </appender>
错误信息
log4net: Loading Appender [CloudLogger] type: [Google.Cloud.Logging.Log4Net.GoogleStackdriverAppender,Google.Cloud.Logging.Log4Net]
log4net:ERROR Could not create Appender [CloudLogger] of type [Google.Cloud.Logging.Log4Net.GoogleStackdriverAppender,Google.Cloud.Logging.Log4Net]. Reported error follows.
System.InvalidCastException: Unable to cast object of type 'Google.Cloud.Logging.Log4Net.GoogleStackdriverAppender' to type 'log4net.Appender.IAppender'.
at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
log4net:ERROR Appender named [CloudLogger] not found.
解决办法
- 核对版本兼容性:Google.Cloud.Logging.Log4Net包对log4net有版本依赖,确保你安装的log4net版本和该包要求匹配(比如最新版通常要求log4net 2.0.15及以上),可查看NuGet包的依赖说明确认。
- 统一程序集引用:检查项目是否同时引用了不同版本的log4net,比如项目直接引用一个版本,而Google.Cloud.Logging.Log4Net间接引用另一个版本,导致类型加载冲突。通过NuGet管理器统一所有相关包的版本。
- 清理重建项目:编译缓存可能引发程序集加载异常,手动删除项目的bin和obj目录,再重新构建解决方案。
- 添加绑定重定向:若存在版本冲突,在App.config/Web.config中添加log4net的绑定重定向,确保所有引用指向同一版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.15.0" newVersion="2.0.15.0" /> </dependentAssembly> </assemblyBinding> </runtime> - 重新安装相关包:卸载并重新安装Google.Cloud.Logging.Log4Net和log4net包,确保所有依赖文件正确下载并引用到项目中。
内容的提问来源于stack exchange,提问作者Nick__Dudas

