log4net简单使用
使用的最新的log4net版本,显示上有点奇怪:
![](https://images2015.cnblogs.com/blog/694197/201603/694197-20160306224737159-1934203456.png)
不管怎么说,都是从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; } }
对比结果如下:现实就是这么残酷!
![](https://images2015.cnblogs.com/blog/694197/201603/694197-20160306224803627-1258963724.png)
想了下有可能是因为我的是都写在一个文件里的,因为log4net我配置的保存是这样的,文件最大1M:
![](https://images2015.cnblogs.com/blog/694197/201603/694197-20160306224834377-349305796.png)
我尝试将文件保存小一点方便读取,however,结果还是:
![](https://images2015.cnblogs.com/blog/694197/201603/694197-20160306224846877-918592339.png)
感觉不会再爱了。。。
拥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)]![]()
![](https://images2015.cnblogs.com/blog/694197/201603/694197-20160306224941096-661566401.png)
第四步:用来调用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); } } }
第五步,调用,如下,太简单就只贴个图了:
![](https://images2015.cnblogs.com/blog/694197/201603/694197-20160306224953830-1958029949.png)
到目前为止还有一个问题没有解决,无法以当天日期命名,如下图:
![](https://images2015.cnblogs.com/blog/694197/201603/694197-20160306225005174-436590121.png)
很纠结的一个问题,我看官方是这么说的:
![](https://images2015.cnblogs.com/blog/694197/201603/694197-20160306225020159-790922956.png)
说在配置里加上<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秒左右,这个时间肯定和特定机器的硬件配置有关的,有兴趣的也可以自己测下。