使用Log4Net 2.0.9.0及以上版本时Microsoft Monitoring Agent致IIS应用池崩溃
问题解答
1. 问题具体是什么?
这是Microsoft Monitoring Agent (MMA)的APM组件与Log4Net 2.0.9.0及以上版本的兼容性冲突,会直接导致运行Web应用的IIS应用池崩溃。该问题仅在同时使用该版本范围的Log4Net、搭配SCOM 2016的MMA 8.0.10918.0时触发,将Log4Net降级至2.0.8.0后,应用池可恢复正常运行。
2. 根本原因是什么?
MMA的APM Agent通过**字节码注入(Instrumentation)**机制监控应用的日志行为,会拦截Log4Net的核心方法调用。Log4Net 2.0.9.0及后续版本的内部逻辑变更,导致APM Agent在拦截时出现未处理的异常(如类型不匹配、反射调用失败或内存访问错误),最终引发应用池进程崩溃。
3. 为何Log4Net 2.0.8.0以上版本会出现此问题?
Log4Net 2.0.9.0及后续版本做了多项关键变更,刚好与旧版APM Agent的监控逻辑不兼容:
- 调整了
log4net.Core.Logger等核心类型的内部实现,包括反射调用的方式和内部成员结构 - 优化了程序集的强名称签名与版本绑定策略
- 新增了异步日志处理的内部组件,而SCOM 2016配套的MMA 8.0.10918.0的APM Agent未适配这些新组件的拦截规则
2.0.8.0版本的代码逻辑与结构完全适配旧版APM Agent的监控规则,因此不会触发冲突。
4. 不关闭APM Agent的解决方法
以下是几种可行的解决方案,按优先级排序:
- 升级Microsoft Monitoring Agent:将MMA升级到适配Log4Net 2.0.9+的版本(可安装SCOM 2016的后续累积更新包,或升级到更高版本的SCOM代理),新版本的APM Agent已修复该兼容性问题
- 配置APM Agent排除Log4Net监控:在SCOM管理包或本地MMA的APM配置中添加规则,排除对
Log4Net.dll的字节码注入操作,避免Agent拦截Log4Net的核心逻辑 - 调整Log4Net配置规避冲突:在Web应用的
log4net.config中禁用异步日志处理特性,或使用旧版的日志输出适配器,减少APM Agent触发异常的概率 - 临时绑定Log4Net至2.0.8.0:在Web应用的
web.config中添加程序集绑定重定向,强制应用使用2.0.8.0版本的Log4Net(仅作为临时应急方案,不推荐长期使用)
内容的提问来源于stack exchange,提问作者Nithish Kumar
相关产品推荐
相关产品推荐

