在.NET Core 3.1 Azure Functions中使用Log4Net屏蔽微软冗余日志
解决方案
1. 修正host.json配置结构
你遇到的冗余日志都属于Microsoft.Azure.WebJobs命名空间,原有配置未覆盖该细分命名空间,且Azure Functions v3(对应.NET Core 3.1运行时)有专属的日志规则优先级,需要补充对应配置,修正后的host.json示例:
{ "version": "2.0", "logging": { "logLevel": { "Default": "Debug", "System": "Error", "Microsoft": "Error", "Microsoft.Azure.WebJobs": "Error", "Host.Results": "Error", "Host.Aggregator": "Error", "Function": "Debug" } } }
2. 配置Log4Net独立过滤规则
Log4Net作为第三方日志组件,不会自动继承.NET Core的日志过滤规则,需要在log4net.config的对应appender节点下添加命名空间过滤,示例如下:
<appender name="YourLogAppender" type="log4net.Appender.RollingFileAppender"> <!-- 原有输出路径、格式等配置保留 --> <!-- 过滤System开头的非Error日志 --> <filter type="log4net.Filter.LoggerMatchFilter"> <loggerToMatch value="System" /> <acceptOnMatch value="false" /> </filter> <!-- 过滤Microsoft开头的非Error日志 --> <filter type="log4net.Filter.LoggerMatchFilter"> <loggerToMatch value="Microsoft" /> <acceptOnMatch value="false" /> </filter> <!-- 可按需保留自定义业务日志的输出级别 --> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="Debug" /> <levelMax value="Fatal" /> </filter> </appender>
3. 调整Program.cs日志注册逻辑
确保日志注册时读取了配置文件的过滤规则,避免默认日志提供器干扰,示例代码:
public static void Main() { var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureLogging(logging => { // 移除默认日志提供器避免重复输出 logging.ClearProviders(); // 加载配置文件中的日志过滤规则 logging.AddConfiguration(Configuration.GetSection("Logging")); // 注册Log4Net logging.AddLog4Net("log4net.config", true); }) .Build(); host.Run(); }
4. 排查Azure端配置覆盖
如果部署到Azure后仍有冗余日志,需要检查Azure门户函数应用的「配置」-「应用程序设置」,是否存在Logging__LogLevel__Microsoft这类配置项,云端配置优先级高于本地配置文件,需同步修改为Error级别。
内容的提问来源于stack exchange,提问作者Toni
相关产品推荐
相关产品推荐

