在項目開發過程中,部署的服務器越來越多,查看日記的時候需要每台服務器去找日記看,這對運維人員來說是一個很不友好的方式。在此基礎上就提出將所有日記統一到一台服務器上進行存放,並按照產生日記的服務器分文件夾。這時候想使用log4net就需要配置很多配置項,明顯不是我們想要的。現在只能去修改log4net的源代碼去滿足這一要求。經過修改后的源代碼在配置日記文件路徑和調用創建日記對象的傳入參數上做些修改就可以動態配置路徑。因為沒必要做太多層次的動態配置,這里只實現了2層路徑的動態配置。
1.配置文檔
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--配置文件路徑;這里修改源碼,在調用LogManager.GetLogger(name)時,name結構是Client_LogType_logger-->> <file value="logs/%Client/%LogType/" /> <!--是否追加到文件--> <appendToFile value="true" /> <!--最大變換數量,-1為不限制--> <MaxSizeRollBackups value="-1" /> <!--文件大小--> <MaximumFileSize value="1MB"/> <encoding value="utf-8" /> <!--文件以那種方式變換文件名:data日期/Size大小/Composite同時按照日期和大小--> <rollingStyle value="Composite" /> <!--文件名格式--> <datePattern value=""log_"yyyyMMdd".log"" /> <!--是否為固定的文件名,理論上講不會動態改變--> <StaticLogFileName value="false" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%date %-5level [%thread] %newline%message%newline----------------------------------------%newline"/> </layout> </appender> <logger name="Test"> <level value="ALL" /> <appender-ref ref="LogFileAppender" /> </logger>
2.調用
using log4net; using System.Collections.Generic; namespace Log4netTest { public class LogHelper { //將日記對象緩存起來 public static Dictionary<string, ILog> LogDic = new Dictionary<string, ILog>(); static object _islock = new object(); public static ILog GetLog(string name) { try { if (LogDic == null) { LogDic = new Dictionary<string, ILog>(); } lock (_islock) { if (!LogDic.ContainsKey(name)) { LogDic.Add(name, LogManager.GetLogger(name)); } } return LogDic[name]; } catch { return LogManager.GetLogger("Default"); } } public static void Debug(string client, string name, object message) { //該參數有三部分組成:客戶端_日記類型_logger配置名稱;<file value="logs/%Client/%LogType/" />
//value如果不需要客戶端時可寫成<file value="logs/%LogType/" />;這里是需要動態配置的才加上
//在上面的配置,name傳入的就是 Test 最終字符串是:客戶端_Debug_Test var log = GetLog(string.Format("{0}_Debug_{1}", client, name)); if (log == null) { return; } log.Debug(message); } public static void Error(string client, string name, object message) { var log = GetLog(string.Format("{0}_Error_{1}", client, name)); if (log == null) { return; } log.Error(message); } } }