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");
问题原因
- Root日志器全局捕获:Log4net的root日志器会接收所有未被特定logger处理的日志,当前root同时关联了两个appender,导致所有日志都会被输出到两个文件。
- 错误的日志器获取逻辑:直接用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
相关产品推荐
相关产品推荐

