为何Application Insights未采集Debug/Info级别日志?
结合你遇到的场景,我整理了几个最可能导致Debug/Info日志无法被采集的原因,你可以逐一排查:
1. 检查Logging配置的层级是否正确
很多人容易把ApplicationInsights的日志级别配置放错位置,正确的配置结构应该是把它嵌套在Logging节点下,而非根节点的ApplicationInsights中。你可以对比确认你的appsettings.json结构:
{ "Logging": { "ApplicationInsights": { "LogLevel": { "Default": "Debug" // 这里才是Application Insights的日志级别配置 } }, "LogLevel": { "Default": "Debug" // 这是全局日志级别,同时也需要设置 } }, "ApplicationInsights": { "InstrumentationKey": "你的仪器密钥" } }
如果把LogLevel放在根节点的ApplicationInsights里,SDK是不会读取这个配置的,自然只会采集默认的Warning及以上级别日志。
2. 排查代码层面的日志过滤规则
检查你的Startup.cs中是否存在手动添加日志过滤的代码,比如:
services.AddLogging(loggingBuilder => { // 这段代码会强制将Application Insights的日志级别设为Warning及以上 loggingBuilder.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.Warning); });
如果有类似代码,它会直接覆盖配置文件的设置,导致Debug/Info日志被过滤掉。
3. 验证ApplicationInsightsLoggerProvider是否正常注册
虽然文档说2.7.1+版本默认启用这个日志提供程序,但还是可以通过代码验证一下:
using Microsoft.Extensions.Logging; public class YourController : Controller { private readonly ILogger<YourController> _logger; private readonly IEnumerable<ILoggerProvider> _loggerProviders; public YourController(ILogger<YourController> logger, IEnumerable<ILoggerProvider> loggerProviders) { _logger = logger; _loggerProviders = loggerProviders; } public IActionResult TestLog() { // 输出所有已注册的日志提供程序 foreach (var provider in _loggerProviders) { _logger.LogInformation("已注册的日志提供程序:{Name}", provider.GetType().FullName); } // 输出测试日志 _logger.LogDebug("Debug测试日志"); _logger.LogInformation("Info测试日志"); return Ok(); } }
运行后查看控制台或本地日志,确认是否存在Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider。如果没有,可能是SDK引用不全,或者AddApplicationInsightsTelemetry()的调用时机过晚(建议放在ConfigureServices方法的早期)。
4. 检查自适应采样是否影响日志采集
Application Insights默认启用的自适应采样机制,虽然主要针对请求/依赖等遥测数据,但偶尔也会过滤掉部分低级别日志。你可以先临时禁用采样来测试:
"ApplicationInsights": { "InstrumentationKey": "你的仪器密钥", "Sampling": { "Enabled": false } }
如果禁用采样后Debug/Info日志能正常采集,再根据需求调整采样规则即可。
5. 确认是否存在其他配置源的覆盖
环境变量、Azure App Service的应用设置、命令行参数等配置源,优先级会高于appsettings.json。你可以在Startup.cs中添加代码打印实际读取到的配置:
public class Startup { public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { var aiLogLevel = Configuration["Logging:ApplicationInsights:LogLevel:Default"]; Console.WriteLine($"实际读取的ApplicationInsights日志级别:{aiLogLevel}"); services.AddApplicationInsightsTelemetry(); // 其他服务配置... } }
如果控制台输出的日志级别不是Debug,说明有其他配置源覆盖了你的设置,需要排查对应来源。
内容的提问来源于stack exchange,提问作者glosrob

