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