C# 项目中集成与配置 log4net 日志框架指南
一、 定义 log4net 配置文件
在项目中添加一个名为 log4net.config 的 XML 配置文件。以下配置示例使用了 RollingFileAppender,按日期滚动生成日志文件,并自定义了输出格式。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="DailyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/app-log-" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyy-MM-dd'.log'" />
<staticLogFileName value="false" />
<maxSizeRollBackups value="30" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="DailyRollingFileAppender" />
</root>
</log4net>
</configuration>
请确保在 Visual Studio 中将该配置文件的"复制到输出目录"属性设置为"始终复制"或"如果较新则复制"。
二、 在程序集中加载配置
为了让 log4net 在应用程序启动时自动读取配置文件,需要在 AssemblyInfo.cs 文件中添加以下程序集级别的特性声明:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
Watch = true 参数允许 log4net 监控配置文件的更改,并在文件被修改时自动重新加载配置,这在开发调试阶段非常实用。
三、 在业务代码中记录日志
在具体的类中,通过 LogManager.GetLogger 获取日志记录器实例。以下示例展示了一个订单处理服务,演示了不同日志级别(Info, Debug, Warn, Error)的使用场景:
using System;
using log4net;
namespace LoggingDemo
{
public class OrderProcessingService
{
// 使用 typeof 获取当前类的日志记录器,便于在日志中追踪来源
private static readonly ILog _logger = LogManager.GetLogger(typeof(OrderProcessingService));
public void ProcessOrder(string orderId)
{
_logger.Info($"开始处理订单,订单号: {orderId}");
try
{
if (string.IsNullOrEmpty(orderId))
{
throw new ArgumentException("订单号不能为空");
}
_logger.Debug($"订单 {orderId} 数据验证通过,正在执行核心逻辑...");
}
catch (ArgumentException ex)
{
_logger.Warn($"订单参数校验失败: {ex.Message}");
}
catch (Exception ex)
{
// 记录错误时传入异常对象,以便记录完整的堆栈跟踪信息
_logger.Error($"处理订单 {orderId} 时发生系统异常", ex);
}
finally
{
_logger.Info($"订单 {orderId} 处理流程结束");
}
}
}
class Program
{
static void Main(string[] args)
{
var service = new OrderProcessingService();
// 测试正常流程
service.ProcessOrder("ORD-9527");
// 测试参数异常流程
service.ProcessOrder(null);
Console.WriteLine("业务执行完毕,请检查 logs 目录下的日志文件。");
Console.ReadKey();
}
}
}