使用的最新的log4net版本,顯示上有點奇怪:

不管怎么說,都是從nuget上安裝的最新的版本。
復雜的配置太過晦澀,以致於我之前一度完全不想使用它-我只是想簡單的記錄一下日志哎,干嘛要這么多難懂的配置。
這種情況下我有一個寫日志的靜態方法,在自己接觸的項目里到處調用。
這次也是偶然,閑逛的時候發現有人調用log4net的源碼,心有不屑之余想着看一下到底這玩意性能有多好。
用我常用的日志方法與log4net的日志方法在一個for循環里添加十萬次日志,計算時間。
我常用的日志方法如下:
public class Log { private static Object thislock = new Object(); /// <summary> /// 添加日志 /// </summary> /// <param name="message">日志內容</param> /// <param name="filename">日志文件前綴名</param> /// <param name="directory">日志目錄</param> /// <returns></returns> public static bool AddLog(string message, string filename = "", string logDirectory = "") { string directory = AppDomain.CurrentDomain.BaseDirectory + "\\Logs"; if (logDirectory != "") { directory += "\\" + logDirectory; } if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } string path = Path.Combine(directory, filename == null ? string.Empty : filename + DateTime.Now.ToString("yyyyMMdd") + ".txt"); if (!System.IO.File.Exists(path)) { FileStream fs1 = new FileStream(path, FileMode.Create, FileAccess.Write);//創建寫入文件 StreamWriter sw = new StreamWriter(fs1); sw.WriteLine("message: \r\n" + message + "\r\n" + System.DateTime.Now.ToString() + "\r\n");//開始寫入值 sw.Close(); fs1.Close(); } else { lock (thislock) { StreamWriter sr = System.IO.File.AppendText(path); sr.WriteLine("message: \r\n" + message + "\r\n" + System.DateTime.Now.ToString() + "\r\n");//開始寫入值 sr.Close(); } } return true; } }
對比結果如下:現實就是這么殘酷!


想了下有可能是因為我的是都寫在一個文件里的,因為log4net我配置的保存是這樣的,文件最大1M:


我嘗試將文件保存小一點方便讀取,however,結果還是:


感覺不會再愛了。。。
擁log4net入懷吧!!!
第一步,nuget下載log4net,不多說。
第二步,配置文件,與網站配置文件web.config,控制台配置文件app.config同一路徑下保存,命名為log4net.config。
有一點不好的地方,要將這個文件手動復制到debug文件夾里去,編譯的時候並不會自動把它帶過去,原因不明。
保存數據庫啊,遠程接口啊,windows事件日志系統啊什么鬼的暫時不需要(另,在這里參考了這位的文章
http://www.cnblogs.com/wzc998/archive/2011/05/05/2037713.html),保存到txt的配置就是這樣了:
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <!--日志--> <log4net> <logger name="logerror"> <level value="ERROR" /> <appender-ref ref="ErrorAppender" /> </logger> <logger name="loginfo"> <level value="INFO" /> <appender-ref ref="InfoAppender" /> </logger> <!--<logger name="logconsole"> <level value="INFO" /> <appender-ref ref="ConsoleAppender" /> </logger>--> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Logs\Error\error.txt" /> <param name="DatePattern" value="yyyyMMdd"/> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="100" /> <param name="MaximumFileSize" value="1MB" /> <param name="RollingStyle" value="Size" /> <param name="StaticLogFileName" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%-5p %d [%c] %m%n" /> </layout> </appender> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Logs\Info\info.txt" /> <param name="DatePattern" value="yyyyMMdd"/> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="100" /> <param name="MaximumFileSize" value="1MB" /> <param name="RollingStyle" value="Size" /> <param name="StaticLogFileName" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%-5p %d [%c] %m%n" /> </layout> </appender> <!--<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%d [%t] %-5p %m%n" /> </layout> </appender>--> </log4net> </configuration>
第三步:最坑爹的一步,但是很簡單:
在項目Properties里,有一個AssemblyInfo.cn文件,在其后要加上一句:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)]


第四步:用來調用log4net的一個方法
public class LogHelper { public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); /// <summary> /// 普通的文件記錄日志 /// </summary> /// <param name="info"></param> public static void WriteLog(string info) { if (loginfo.IsInfoEnabled) { loginfo.Info(info); } } /// <summary> /// 錯誤日志 /// </summary> /// <param name="info"></param> /// <param name="se"></param> public static void WriteLog(string info, Exception se) { if (logerror.IsErrorEnabled) { logerror.Error(info, se); } } }
第五步,調用,如下,太簡單就只貼個圖了:


到目前為止還有一個問題沒有解決,無法以當天日期命名,如下圖:


很糾結的一個問題,我看官方是這么說的:


說在配置里加上<datePattern value="yyyyMMdd" /> 就可以的,但到我這怎么就不行了,雖然我這里加的是這個<param name="DatePattern" value="yyyyMMdd"/>
但是我也試過用<datePattern value="yyyyMMdd" />的一樣沒有用。
理解有限,不正之處還請指正。。。
最后,吐槽下cnblog在文章時加入圖片的難度,讓人累覺不愛。
寫在后面:
如果以上配置還不能讓程序正常工作,這里再嘗試另外一種:
1、配置文件
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections> <log4net> <logger name="logerror"> <level value="ERROR" /> <appender-ref ref="ErrorAppender" /> </logger> <logger name="loginfo"> <level value="INFO" /> <appender-ref ref="InfoAppender" /> </logger> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Logs\\LogError\\" /> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="100" /> <param name="MaxFileSize" value="10240" /> <param name="StaticLogFileName" value="false" /> <param name="DatePattern" value="yyyyMMdd".htm"" /> <param name="RollingStyle" value="Date" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="<HR COLOR=red>%n異常時間:%d [%t] <BR>%n異常級別:%-5p <BR>%n異 常 類:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" /> </layout> </appender> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Logs\\LogInfo\\" /> <param name="AppendToFile" value="true" /> <param name="MaxFileSize" value="10240" /> <param name="MaxSizeRollBackups" value="100" /> <param name="StaticLogFileName" value="false" /> <param name="DatePattern" value="yyyyMMdd".htm"" /> <param name="RollingStyle" value="Date" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="<HR COLOR=blue>%n日志時間:%d [%t] <BR>%n日志級別:%-5p <BR>%n日 志 類:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" /> </layout> </appender> </log4net> </configuration>
2、日志記錄類:
public class LogHelper { public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); static LogHelper() { SetConfig(); } public static void SetConfig() { log4net.Config.XmlConfigurator.Configure(); } public static void SetConfig(FileInfo configFile) { log4net.Config.XmlConfigurator.Configure(configFile); } public static void WriteLog(string info) { if (loginfo.IsInfoEnabled) { loginfo.Info(info); } } public static void WriteLog(string info, Exception se) { if (logerror.IsErrorEnabled) { logerror.Error(info, se); } } }
配置與操作如上,調用 方式還是一樣
還是發現一個問題,這樣配置的話,文件大小會不受配置文件里所寫的大小限制,還是沒有完美解決問題。
另外,還發現一個情況:
這是使用方案一配置時的實驗結果,2 VS 36:
然后,這是使用方案二配置時的實驗結果,32 VS 37,
是的你沒有看錯,差距就是這么大,而且這里並不是我用自己的常用的那個日志方法在這里掛羊頭賣狗肉,驚奇不已。
以上兩個的時間差距測試都是在控制台程序里得出的,然而在mvc5的項目里,卻發現兩個的時間是差不多一樣的,都是10萬次30秒左右,這個時間肯定和特定機器的硬件配置有關的,有興趣的也可以自己測下。