Skip to content

Log4Net 日志配置与实践 ​

Log4Net 是 .NET 下经典的日志记录框架。它可以将日志方便地输出到多种目标介质(控制台、文件、数据库等)。本篇重点沉淀最常用的文件日志滚动配置以及在 Web 项目中的基础用法。

一、 核心配置 (App.config / Web.config) ​

Log4Net 的核心是通过 <appender> 节点配置日志输出的介质和格式。日常开发中最常用的是 RollingFileAppender(滚动文件),它支持按日期或按文件大小自动拆分日志文件。

1. 基础节点结构 ​

xml
<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <root>
      <!-- 日志级别:None > Fatal > ERROR > WARN > DEBUG > INFO > ALL -->
      <level value="ALL"/>
      <!-- 关联具体的 Appender -->
      <appender-ref ref="DateLogFileAppender"/>
      <appender-ref ref="SizeLogFileAppender"/>
    </root>

    <!-- 具体的 Appender 配置见下文 -->
  </log4net>
</configuration>

2. 方案 A:按日期滚动记录 (推荐) ​

按天生成独立的日志文件,方便后续按时间线排查问题。

xml
<appender name="DateLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <!-- 输出的根目录 -->
  <file value="Log\\"/>
  <appendToFile value="true"/>
  <!-- 以日期的方式滚动 -->
  <rollingStyle value="Date"/>
  <!-- 日期格式作为文件名后缀 -->
  <datePattern value="yyyy-MM-dd&quot;.txt&quot;"/>
  <!-- false 表示文件名不唯一,会拼上日期后缀 -->
  <staticLogFileName value="false"/>
  <layout type="log4net.Layout.PatternLayout">
    <!-- 日志内容格式 -->
    <param name="ConversionPattern" value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline"/>
  </layout>
</appender>

3. 方案 B:按文件大小滚动记录 ​

如果单日日志量极大,按日期会导致单个文件过大难以打开,可改用按大小滚动。

xml
<appender name="SizeLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <!-- 输出的具体文件名 -->
  <file value="Log\\log.txt"/>
  <appendToFile value="true"/>
  <rollingStyle value="Size" />
  <!-- 保留日志文件的最大个数,超过后会轮询覆盖最旧的 -->
  <maxSizeRollBackups value="10"/>
  <!-- 单个日志文件最大的大小 -->
  <maximumFileSize value="10MB"/>
  <staticLogFileName value="true"/>
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline"/>
  </layout>
</appender>

二、 代码中的加载与使用 ​

1. 注册配置 ​

在项目的 AssemblyInfo.cs 中添加特性,让程序启动时自动加载配置:

csharp
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]

注意:在 ASP.NET Core 时代,配置方式有所变化,通常通过 loggingBuilder.AddLog4Net("log4net.config") 在 Program.cs 中注册。

2. 记录日志 ​

在需要记录日志的类中,获取对应类型的 ILog 实例:

csharp
using log4net;

public static class TestClass
{
    // 获取当前类的 Logger
    private static readonly ILog log = LogManager.GetLogger(typeof(TestClass));

    public static void TestLog()
    {
        try
        {
            log.Info("开始执行操作...");
            log.Debug("当前参数值: X=1");
        }
        catch (Exception ex)
        {
            log.Error("操作发生异常", ex);
        }
    }
}

三、 Web 场景进阶:配合 ActionFilter 记录全局日志 ​

在 MVC / WebAPI 项目中,直接在每个接口里写 log.Info 非常繁琐。常见的最佳实践是配合全局拦截器(ActionFilter / ExceptionFilter)。

实践思路:

  1. 异常拦截:实现全局 ExceptionFilter,一旦接口抛出未处理异常,自动调用 log.Error 记录堆栈和请求上下文。
  2. 请求审计:实现 ActionFilter,在接口进入(OnActionExecuting)时记录入参,在接口返回(OnActionExecuted)时记录耗时和出参。
  3. 环境隔离:审计级别极细的入参/出参日志,可以配置为 DEBUG 级别,仅在开发或排查环境开启,生产环境切到 INFO 或 ERROR 以节省磁盘空间。

四、 参考资料 ​

方舟 · Ark