C# Windows Service 中添加 log4net 的详细教程
步骤 1:安装 log4net 包
在 Windows Service 项目中,首先需要安装 log4net 日志库。以下是两种常用安装方法:
方法一:通过 NuGet 包管理器安装
在 Visual Studio 中打开包管理器控制台,执行以下命令:
Install-Package log4net
方法二:使用 .NET CLI 安装
在项目根目录打开终端,执行以下命令:
dotnet add package log4net
步骤 2:添加 log4net.config 配置文件
- 创建 XML 文件:
在您的项目中(例如使用 Visual Studio),右键点击项目名称 → 选择“添加” → “新建项” → 选择“XML 文件”。
将文件命名为log4net.config
,并点击“添加”。 - 编辑文件内容:
在项目中添加一个名为 log4net.config 的 XML 配置文件,并设置其属性 “复制到输出目录” 为 “始终复制”。
<?xml version="1.0" encoding="utf-8" ?>
<log4net><!-- 控制台输出 --><appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout></appender><!-- 文件输出 - 按日期滚动日志文件 --><appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"><!-- 日志文件路径和基础名称 --><file value="Logs\ServiceLog_" /><!-- 是否追加到文件 --><appendToFile value="true" /><!-- 滚动方式:按日期滚动 --><rollingStyle value="Date" /><!-- 日期格式:yyyyMMdd 表示年月日 --><datePattern value="yyyyMMdd'.log'" /><!-- 每个日期是否生成新文件(即使前一天文件为空) --><staticLogFileName value="false" /><!-- 最多保留的日志文件数(设为-1表示不限制) --><maxSizeRollBackups value="-1" /><!-- 日志格式 --><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout></appender><!-- 日志级别 --><root><level value="INFO" /><appender-ref ref="ConsoleAppender" /><appender-ref ref="RollingFileAppender" /></root>
</log4net>
步骤 3:配置 AssemblyInfo.cs
在 Properties\AssemblyInfo.cs 文件末尾添加以下行,告诉 log4net 配置文件的位置:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
步骤 4:在 Windows Service 中使用 log4net
修改你的 Service 类,添加 log4net 日志记录功能:
using System;
using System.ServiceProcess;
using log4net;namespace MyWindowsService
{public partial class MyService : ServiceBase{// 声明日志记录器private static readonly ILog _log = LogManager.GetLogger(typeof(MyService));private System.Timers.Timer _timer;public MyService(){InitializeComponent();// 确保日志配置正确加载log4net.Config.XmlConfigurator.Configure();}protected override void OnStart(string[] args){try{_log.Info("服务启动中...");// 初始化定时器,每30秒执行一次_timer = new System.Timers.Timer(30000);_timer.Elapsed += Timer_Elapsed;_timer.Start();_log.Info("服务已成功启动");}catch (Exception ex){_log.Error("服务启动失败", ex);throw;}}private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e){try{_log.Debug("定时器执行中...");// 这里添加你的业务逻辑_log.Info("定时器任务执行完成");}catch (Exception ex){_log.Error("定时器任务执行失败", ex);}}protected override void OnStop(){try{_log.Info("服务停止中...");if (_timer != null){_timer.Stop();_timer.Dispose();}_log.Info("服务已成功停止");}catch (Exception ex){_log.Error("服务停止失败", ex);throw;}}// 用于调试的方法public void TestStart(){OnStart(null);}// 用于调试的方法public void TestStop(){OnStop();}}
}
** 代码需要注意的是:log4net.Config.XmlConfigurator.Configure();一定要写,否则服务重启写日志就会出异常 **
步骤 5:调试配置(Program.cs)
修改 Program.cs 以便于调试:
using System;
using System.ServiceProcess;namespace MyWindowsService
{static class Program{static void Main(){
#if DEBUG// 调试模式下直接运行服务逻辑,无需安装为Windows服务MyService service = new MyService();service.TestStart();Console.WriteLine("服务正在运行,按任意键停止...");Console.ReadKey();service.TestStop();
#else// 发布模式下作为Windows服务运行ServiceBase[] ServicesToRun;ServicesToRun = new ServiceBase[]{new MyService()};ServiceBase.Run(ServicesToRun);
#endif}}
}
步骤 6:安装和运行服务
1.构建项目,生成可执行文件
2.使用 InstallUtil 安装服务:
InstallUtil.exe MyWindowsService.exe
3.在服务管理器中启动你的服务
4.查看日志文件(默认在程序目录的 Logs 文件夹下)
日志级别说明
log4net 提供了多种日志级别,按严重程度从低到高为:
*DEBUG:调试信息,通常用于开发环境
*INFO:普通信息,记录程序正常运行状态
*WARN:警告信息,表示可能存在问题但不影响程序运行
*ERROR:错误信息,记录程序运行中的错误
*FATAL:致命错误,记录导致程序崩溃的严重错误