6.71HTTP 请求日志(关闭)

更新于 2026 年 8 月 21 日约 2 分钟读完

默认情况下,系统会在发送 HTTP 远程请求时打印相关日志信息,如下所示:

bash
info: System.Net.Http.HttpClient.Default.LogicalHandler[100]      Start processing HTTP request GET https://furion.net/info: System.Net.Http.HttpClient.Default.ClientHandler[100]      Sending HTTP request GET https://furion.net/info: System.Net.Http.HttpClient.Default.ClientHandler[101]      Received HTTP response headers after 93.0553ms - 200info: System.Net.Http.HttpClient.Default.LogicalHandler[101]      End processing HTTP request after 122.2355ms - 200

若您希望关闭这些日志信息,可以在项目的 appsettings.json 以及 appsettings.Development.json 配置文件中进行如下设置:

cs
{  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft.AspNetCore": "Warning",      "Microsoft.EntityFrameworkCore": "Information",      "System.Net.Http.HttpClient": "Warning"  // 将日志级别设置为 Warning 以关闭 Info 级别日志    }  }}

通过将 System.Net.Http.HttpClient 的日志级别设置为 Warning,您可以有效地关闭 Info 级别的 HTTP 请求日志信息。请注意,在 appsettings.Development.json 中的设置将覆盖 appsettings.json 中的相应设置(如果两者都存在的话),这通常用于在开发环境中提供不同的日志记录策略。

除了上述配置方式,您还可以在程序中关闭 HTTP 远程请求的日志记录。具体操作如下:

cs
// 为默认客户端关闭日志services.AddHttpClient(string.Empty)    .RemoveAllLoggers();// 为特定客户端关闭日志//services.AddHttpClient("weixin")//    .RemoveAllLoggers();// 还可以一键为所有客户端配置关闭日志services.ConfigureHttpClientDefaults(clientBuilder =>{    clientBuilder.RemoveAllLoggers();});// 或使用 IHttpRemoteBuilder 扩展方法进行一键配置services.AddHttpRemote()    .ConfigureHttpClientDefaults(clientBuilder =>    {        clientBuilder.RemoveAllLoggers();    });

自定义日志服务(继承 HttpRemoteLoggerBase)

HttpRemoteBuilder 提供了 UseLogger 方法,允许您使用自定义日志服务替换内置的日志实现。自定义日志服务需继承 HttpRemoteLoggerBase 抽象类,并实现(重写)Log 方法,如下所示:

cs
// 自定义日志服务:继承 HttpRemoteLoggerBase 实现internal sealed class CustomHttpRemoteLogger(    ILogger<Logging> logger,    IOptionsMonitor<HttpRemoteOptions> httpRemoteOptions,    bool isLoggingRegistered) : HttpRemoteLoggerBase{    /// <inheritdoc />    public override void Log(LogLevel logLevel, Exception? exception, string? message, params object?[] args)    {        // 检查是否注册了日志输出程序        if (isLoggingRegistered)        {            logger.Log(logLevel, exception, message, args);        }        else        {            // 调用备用日志输出委托            httpRemoteOptions.CurrentValue.FallbackLogger?.Invoke(LogMessageFormatter.Value(message, args));        }    }}

完成定义后,通过 UseLogger 方法进行注册即可:

cs
services.AddHttpRemote(builder =>{    // 注册自定义日志服务    builder.UseLogger<CustomHttpRemoteLogger>();    // 或使用 Type 注册    // builder.UseLogger(typeof(CustomHttpRemoteLogger));});

不使用 UseLogger 手动注册:

若您希望完全自行控制,例如需要向自定义构造函数传递更多参数(而非仅 isLoggingRegistered),可以不使用 UseLogger 方法,在外部自行注册 IHttpRemoteLogger 服务,如下所示:

cs
// 检查是否配置(注册)了日志程序var isLoggingRegistered = services.Any(u => u.ServiceType == typeof(ILoggerProvider));// 移除所有已存在的 IHttpRemoteLogger 注册services.RemoveAll<IHttpRemoteLogger>();// 手动注册自定义日志服务,可传递更多参数services.AddSingleton<IHttpRemoteLogger>(provider =>    (IHttpRemoteLogger)ActivatorUtilities.CreateInstance(provider, typeof(CustomHttpRemoteLogger),        isLoggingRegistered, 额外参数1, 额外参数2 /*... 这里可以传递更多参数 */));

这样您便可以完全掌控构造函数的参数传递,按需注入任何所需服务或参数。