寫在前面
Log4Net是從Java的log4j移植過來的,功能也與log4j類似,可以把日志信息輸出到文件、數據庫、控制臺、Windows 事件日志、遠程系統日志服務等不同的介質或目標。
Log4Net配置選項豐富靈活,并且可在運行時動態更新配置并應用,允許同時推送到多個目標;雖然項目已經休眠了,但是該類庫已久經考驗,經典的設計永不過時。
獲取類庫
可通過NuGet獲取類庫,引入到項目中。
配置模板
新建log4net.xml文件,命名成log4net.config也可以,初始化時保持一致即可,配置內容如下:
<?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 %ndc - %message%newline" /></layout></appender><appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" LEVEL="INFO"><!--防止多線程時不能寫Log,官方說線程非安全--><param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /><param name="File" value="Logs/" /><param name="AppendToFile" value="true"/><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="yyyy-MM-dd.'info.log'" /><param name="RollingStyle" value="Date"/><param name="MaxSizeRollBackups" value="10" /><param name="MaximumFileSize" value="5MB" /><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="## %d [%t] %-5p %x %m %n"/><!--<param name="ConversionPattern" value="%date [%thread] %-5level [%logger] %ndc - %message%newline" />--></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="INFO" /><param name="LevelMax" value="INFO" /></filter></appender><appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender" LEVEL="ERROR"><param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /><param name="File" value="Logs/" /><param name="AppendToFile" value="true"/><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="yyyy-MM-dd.'error.log'" /><param name="RollingStyle" value="Date"/><param name="MaxSizeRollBackups" value="10" /><param name="MaximumFileSize" value="5MB" /><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%date [%thread] %-5level [%logger] %ndc - %message%newline" /></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="WARN" /><param name="LevelMax" value="ERROR" /></filter></appender><appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender" LEVEL="ERROR"><param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /><param name="File" value="Logs/" /><param name="AppendToFile" value="true"/><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="yyyy-MM-dd.'debug.log'" /><param name="RollingStyle" value="Date"/><param name="MaxSizeRollBackups" value="10" /><param name="MaximumFileSize" value="5MB" /><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%date [%thread] %-5level [%logger] %ndc - %message%newline" /></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="DEBUG" /><param name="LevelMax" value="DEBUG" /></filter></appender><root><level value="All" /><appender-ref ref="LogFileAppender" /><appender-ref ref="ErrorFileAppender"/><appender-ref ref="DebugFileAppender" /><appender-ref ref="ConsoleAppender" /></root>
</log4net>
?將文件屬性中的“復制到輸出目錄”配置為始終復制,這樣配置文件會同步置執行或發布目錄。
?引用并初始化類庫
static Program()
{//加載log4net配置log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + @"\log4net.xml"));
}
也可以在AssemblyInfo.cs中進行初始化配置
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4Net.xml")]
?工具類
public static class LogHelper{public static void Info(object msg, params object[] parameters){var log = LogManager.GetLogger("log4netlogger");log.Info(msg);}public static void Debug(string msg){var log = LogManager.GetLogger("log4netlogger");log.Debug(msg);}public static void Error(string msg){var log = LogManager.GetLogger("log4netlogger");log.Error(msg);}public static void FormatError(string format, params object[] args){var log = LogManager.GetLogger("log4netlogger");log.Error(string.Format(format, args));}public static void Error(Exception ex){var log = LogManager.GetLogger("log4netlogger");log.Error(ex.Message, ex);}public static void Error(object msg, Exception ex){var log = LogManager.GetLogger("log4netlogger");log.Error(msg, ex);}public static void Warn(object msg, Exception ex){var log = LogManager.GetLogger("log4netlogger");log.Warn(msg, ex);}public static void Log(string msg){Info(msg);}public static void Log(Exception ex){Error(ex);}}
調用示例
LogHelper.Info("事件類型出錯,類型:" + _rv.EventType + ",參數:" + _rv.EventArgs);LogHelper.Debug(string.Format("action_finish:{0}", TacticsName));LogHelper.Error(string.Format("json序列化失敗:{0}", json), ex);