ASP.NET Core中如何抑制Redis Instrumentation的冗余Activity日志?
移除OpenTelemetry Redis Instrumentation生成的冗余日志
针对你遇到的Redis链路追踪时生成四条冗余日志(命令执行、ResponseReceived、Sent、Enqueued)的问题,提供以下几种解决方案:
方案一:禁用OpenTelemetry Logger的Activity事件记录
这些冗余日志大多来自Activity的生命周期事件,OpenTelemetry Logger默认会将这些事件转为日志输出。只需在OpenTelemetry Logger配置中关闭该功能,即可保留链路追踪同时移除日志:
修改你的OpenTelemetry Logger配置代码:
app.Logging .SetMinimumLevel(LogLevel.Information) .AddOpenTelemetry(logger => { logger.SetResourceBuilder(resource); logger.IncludeScopes = true; logger.IncludeFormattedMessage = true; logger.ParseStateValues = true; // 禁用Activity事件的日志生成 logger.IncludeActivityEvents = false; if (exportOtlp) { logger.AddOtlpExporter(); } });
方案二:过滤Redis Instrumentation的日志类别
若仍有命令相关的日志(如HMGET),可直接过滤掉Redis Instrumentation对应的日志类别:
在OpenTelemetry Logger配置中添加过滤规则:
logger.AddFilter("OpenTelemetry.Instrumentation.StackExchangeRedis", LogLevel.None);
方案三:通过Serilog过滤特定日志(备选)
如果前两种方法无法满足需求,可在Serilog中直接过滤包含特定关键词的日志(注意:此方法可能误过滤其他含相同关键词的日志):
修改Serilog配置代码:
configuration .ReadFrom.Configuration(context.Configuration) .ReadFrom.Services(services) .Enrich.FromLogContext() .WriteTo.Console() // 排除指定关键词的日志 .Filter.ByExcluding(logEvent => logEvent.MessageTemplate.Text.Contains("Sent") || logEvent.MessageTemplate.Text.Contains("ResponseReceived") || logEvent.MessageTemplate.Text.Contains("Enqueued") || logEvent.MessageTemplate.Text.Contains("HMGET"));
优先推荐方案一+方案二的组合,这种方式更精准,不会影响其他日志的正常输出。
内容的提问来源于stack exchange,提问作者joacar
相关产品推荐
相关产品推荐

