在 WinForm 專案中引入 log4net 並將其封裝為共用類庫時,常遇到配置檔路徑導致監聽器無法啟動的問題。本文記錄從絕對路徑、複製到輸出目錄,到最終正確設定 XmlConfigurator 屬性的完整排查過程,並提供可直接使用的封裝類別與配置範例。
ZYGIS.Log),啟動專案引用該類庫並呼叫 LogOut.Info(),卻完全不寫入日誌。XmlConfigurator 監聽器未成功啟動。zylog.config 複製到啟動專案 bin\Debug 目錄 → 成功。在封裝類別的 AssemblyInfo.cs 或類別檔頂端加入:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "zylog.config", Watch = true)]
重點:ConfigFile 僅需檔名,不要寫路徑。log4net 會自動在執行檔所在目錄(啟動專案的 bin\Debug 或發布後的安裝目錄)尋找該檔案。
zylog.config。LogOut.csusing System;
using log4net;
using log4net.Config;
[assembly: XmlConfigurator(ConfigFile = "zylog.config", Watch = true)]
namespace ZYGIS.Log
{
public static class LogOut
{
private static readonly ILog log = LogManager.GetLogger("ZYGIS");
public static void Debug(string message)
{
if (log.IsDebugEnabled)
log.Debug($"調試信息:\r\n {message}\r\n\r\n");
}
public static void Info(string message)
{
if (log.IsInfoEnabled)
log.Info($" 信息:\r\n {message}\r\n\r\n");
}
public static void Error(string message)
{
if (log.IsErrorEnabled)
log.Error($"錯誤信息:\r\n {message}\r\n\r\n");
}
}
}
zylog.config<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file type="log4net.Util.PatternString" value="%日志\%date{yyyMMdd}\log.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %message" />
</layout>
</appender>
<root>
<appender-ref ref="LogFileAppender" />
</root>
<logger name="ZYGIS">
<level value="All" />
<appender-ref ref="LogFileAppender"/>
</logger>
</log4net>
</configuration>
ZYGIS.Log.LogOut.Info("關閉軟體,結束運行");
ConfigFile 與實體檔名需完全一致(含副檔名)。XmlConfigurator.Configure(FileInfo) 動態載入。核心在於:ConfigFile 只寫檔名 + Watch=true + 配置檔設為「複製到輸出目錄」。這樣無論 Debug 或正式部署,log4net 都能自動找到並監視配置檔變更,實現零程式碼修改的靈活部署。