首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

log4net 在 WinForm 專案中的封裝與配置檔路徑解決方案

     編輯:關於C#

在 WinForm 專案中引入 log4net 並將其封裝為共用類庫時,常遇到配置檔路徑導致監聽器無法啟動的問題。本文記錄從絕對路徑、複製到輸出目錄,到最終正確設定 XmlConfigurator 屬性的完整排查過程,並提供可直接使用的封裝類別與配置範例。

遇到的問題

  • 單一專案直接使用 log4net 完全正常。
  • 將 log4net 封裝至獨立類庫(ZYGIS.Log),啟動專案引用該類庫並呼叫 LogOut.Info(),卻完全不寫入日誌。
  • 追蹤發現:XmlConfigurator 監聽器未成功啟動。
  • 嘗試將配置檔路徑改為絕對路徑 → 成功,但無法部署。
  • 將配置檔 zylog.config 複製到啟動專案 bin\Debug 目錄 → 成功。

關鍵設定:Assembly 屬性與 Copy to Output

在封裝類別的 AssemblyInfo.cs 或類別檔頂端加入:

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

重點:ConfigFile 僅需檔名,不要寫路徑。log4net 會自動在執行檔所在目錄(啟動專案的 bin\Debug 或發布後的安裝目錄)尋找該檔案。

確保配置檔自動複製到輸出目錄

  1. 在類庫專案中新增 zylog.config。
  2. 屬性視窗 → 複製到輸出目錄 選擇 如果較新則複製(或 永遠複製)。
  3. 這樣建置啟動專案時,配置檔會隨著類庫 DLL 一起複製到啟動專案的輸出目錄,log4net 即可正確載入。

完整程式碼範例

封裝類別 LogOut.cs

using 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 都能自動找到並監視配置檔變更,實現零程式碼修改的靈活部署。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved