You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core Web API中Log4Net按服务指定日志文件配置疑问

解决步骤

1. 修正log4net配置

首先调整你的log4net.config,解决两个核心问题:

  • 让未匹配到特定Logger的日志自动回落到Default Appender
  • 避免日志重复输出到多个文件

修改后的配置片段如下:

<log4net>
  <!-- Root Logger:未匹配到特定Logger的日志会用这个,指向Default Appender -->
  <root>
    <level value="ALL" />
    <appender-ref ref="Default" />
  </root>

  <!-- 给ServiceA、ServiceB的Logger加上additivity="false",防止日志同时输出到自己的Appender和Root的Default Appender -->
  <logger name="ServiceA" additivity="false">
    <level value="INFO" />
    <appender-ref ref="ServiceA" />
  </logger>
  <logger name="ServiceB" additivity="false">
    <level value="INFO" />
    <appender-ref ref="ServiceB" />
  </logger>

  <!-- 你的Appender配置保持不变 -->
  <appender name="Default" type="log4net.Appender.RollingFileAppender">
    <!-- ...原配置... -->
  </appender>
  <appender name="ServiceA" type="log4net.Appender.RollingFileAppender">
    <!-- ...原配置... -->
  </appender>
  <appender name="ServiceB" type="log4net.Appender.RollingFileAppender">
    <!-- ...原配置... -->
  </appender>
</log4net>

2. 让服务类对应到指定的Logger

有两种简便方式实现需求:

方式一:手动指定Logger名称(适合短名称配置)

在需要指定专属日志的服务类中,通过ILoggerFactory创建指定名称的Logger,而不是直接注入ILogger<T>:

public class ServiceA
{
    private readonly ILogger _logger;

    // 注入ILoggerFactory,手动创建指定名称的Logger
    public ServiceA(ILoggerFactory loggerFactory)
    {
        // 这里的"ServiceA"要和log4net.config中<logger name="ServiceA">完全一致
        _logger = loggerFactory.CreateLogger("ServiceA");
    }

    public void DoSomething()
    {
        _logger.LogInformation("ServiceA执行操作"); // 这条日志会输出到ServiceA的专属文件
    }
}

对于不需要专属日志的服务,直接注入ILogger<T>即可,日志会自动走Root的Default Appender:

public class ServiceC
{
    private readonly ILogger<ServiceC> _logger;

    public ServiceC(ILogger<ServiceC> logger)
    {
        _logger = logger;
    }

    public void DoSomething()
    {
        _logger.LogInformation("ServiceC执行操作"); // 这条日志会输出到Default的日志文件
    }
}

方式二:使用类型全名匹配(更规范,无需手动创建)

修改log4net.config中Logger的名称为服务类的完整类型名(比如你的ServiceA位于MyApp.Services命名空间下,就写MyApp.Services.ServiceA):

<logger name="MyApp.Services.ServiceA" additivity="false">
  <level value="INFO" />
  <appender-ref ref="ServiceA" />
</logger>
<logger name="MyApp.Services.ServiceB" additivity="false">
  <level value="INFO" />
  <appender-ref ref="ServiceB" />
</logger>

之后直接在服务类中注入ILogger<T>即可,.NET Core默认会用typeof(T).FullName作为Logger名称,自动匹配log4net中对应的配置:

public class ServiceA
{
    private readonly ILogger<ServiceA> _logger;

    // 直接注入ILogger<ServiceA>,自动匹配对应名称的Logger
    public ServiceA(ILogger<ServiceA> logger)
    {
        _logger = logger;
    }

    public void DoSomething()
    {
        _logger.LogInformation("ServiceA执行操作"); // 输出到ServiceA的专属文件
    }
}

未配置对应Logger的服务,注入ILogger<T>后日志会自动回落到Default Appender。

3. 确保log4net在.NET Core中正确集成

在Program.cs中确认已经清除默认日志提供器并添加log4net:

var builder = WebApplication.CreateBuilder(args);

// 清除默认日志提供器
builder.Logging.ClearProviders();
// 添加log4net,指定配置文件路径
builder.Logging.AddLog4Net("log4net.config");

// ...其他配置(添加控制器、服务等)...

var app = builder.Build();

// ...中间件配置...

app.Run();

内容的提问来源于stack exchange,提问作者Thang Dinh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:08:09