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

ASP.NET Core Blazor中Log4net多日志器配置异常求助

ASP.NET Core Blazor中Log4net独立日志器配置问题解决

我在ASP.NET Core Blazor应用中尝试用Log4net创建两个独立日志器,期望迁移相关日志写入migration.log,通用错误写入errors.log,但目前两个日志文件都会捕获所有日志。

当前Log4net配置:

<log4net>
    <appender name="Migration" type="log4net.Appender.FileAppender">
        <file value="logs/migration.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="Errors" type="log4net.Appender.FileAppender">
        <file value="logs/errors.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date - %level - %message%newline | %exception" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="Migration" />
        <appender-ref ref="Errors" />
    </root>
</log4net>

当前使用方式:

private static readonly ILog _logger = LogManager.GetLogger("Errors");
_logger.Info("blah");

private static readonly ILog _migLogger = LogManager.GetLogger("Migration");
_migLogger.Info("blah");

问题原因

  1. Root日志器全局捕获:Log4net的root日志器会接收所有未被特定logger处理的日志,当前root同时关联了两个appender,导致所有日志都会被输出到两个文件。
  2. 错误的日志器获取逻辑:直接用appender名称获取日志器,未定义对应名称的logger节点绑定专属appender,日志最终仍会被root统一处理。

解决方案

修改Log4net配置,添加独立logger节点绑定对应appender,并设置additivity="false"避免日志被父级(包括root)重复输出;同时调整root节点配置(无需全局日志可关闭,或保留但不关联目标appender)。

修改后的配置:

<log4net>
    <appender name="Migration" type="log4net.Appender.FileAppender">
        <file value="logs/migration.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="Errors" type="log4net.Appender.FileAppender">
        <file value="logs/errors.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date - %level - %message%newline | %exception" />
        </layout>
    </appender>

    <!-- 全局root日志器,无需可设为OFF,或保留但不关联目标appender -->
    <root>
        <level value="OFF" />
    </root>

    <!-- 迁移日志专属logger -->
    <logger name="MigrationLogger" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="Migration" />
    </logger>

    <!-- 通用错误日志专属logger -->
    <logger name="ErrorLogger" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="Errors" />
    </logger>
</log4net>

修改后的代码使用方式:

// 获取通用错误日志器
private static readonly ILog _errorLogger = LogManager.GetLogger("ErrorLogger");
_errorLogger.Info("通用错误日志内容");

// 获取迁移日志器
private static readonly ILog _migrationLogger = LogManager.GetLogger("MigrationLogger");
_migrationLogger.Info("迁移相关日志内容");

关键说明

  • additivity="false":阻止日志传递到父级日志器,确保每个logger的日志仅输出到绑定的appender。
  • logger的name属性是代码中获取日志器的标识,需与LogManager.GetLogger的参数完全一致。
  • 若需保留root全局输出,不要在root节点中关联Migration和Errors appender,避免重复写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:52:46