在.net中用log4net记录日志信息,已经是很平常的事情了。
log4net下载:http://logging.apache.org/log4net/download_log4net.cgi
百度网盘下载:http://pan.baidu.com/s/1i3GM8ML
下载后。引用log4net.dll到项目中
添加引用:
using log4net.Config;
using log4net;
生成项目后。你会发现:
这是项目框架造成的:
将目标框架默认的.NET Framework4 Client Profile修改为.NET Framework4之后再重新生成解决方案就行了。
不知道为什么。创建项目默认会是.NET Framework4 Client Profile的。其实这个框架会出现很多问题
比如:不能引用system.web程序集。遇到的就应该知道。不过知道问题的来源就好解决了。
好了。log4net准备好了。现在当然是配置文件,没有app.config的话。可以手动添加一个app.config文件
日志文件一般是写在文本文件里面。或者记录在数据库。但大家都推荐记录在文本文件中。
先看怎么把日志文件写入文本文件,来看看app.config的配置,
1 <configuration> 2 <configSections> 3 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 4 </configSections> 5 <log4net> 6 定义输出到文件中 7 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 8 定义文件存放位置 9 <file value="log\"/> 10 <appendToFile value="true"/> 11 <rollingStyle value="Date"/> 12 <datePattern value="yyyy\yyyyMM\yyyyMMdd'.txt'"/> 13 <staticLogFileName value="false"/> 14 <param name="MaxSizeRollBackups" value="100"/> 15 <layout type="log4net.Layout.PatternLayout"> 16 <!--每条日志末尾的文字说明 17 输出格式 18 样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> 19 <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n"/> 20 </layout> 21 </appender> 22 <root> 23 <level value="ERROR"/> 24 文件形式记录日志 25 <appender-ref ref="RollingLogFileAppender"/> 26 </root> 27 </log4net> 28 <startup> 29 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 30 </startup> 31 </configuration>
提供一个LogHelper.cs类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 //在项目的程序集信息描述文件中,设置Log4net的可记录属性 7 [assembly: log4net.Config.XmlConfigurator(Watch = true)] 8 namespace ConsoleApplication1 9 { 10 class LogHelper 11 { 12 /// <summary> 13 /// 输出日志到Log4Net 14 /// </summary> 15 /// <param name="t">当前消息来自成员的类</param> 16 /// <param name="ex">异常信息</param> 17 #region static void WriteLog(Type t, Exception ex) 18 19 public static void WriteLog(Type t, Exception ex) 20 { 21 log4net.ILog log = log4net.LogManager.GetLogger(t); 22 log.Error(ex.Message, ex); 23 //log.Info(ex.Message, ex); 24 } 25 26 #endregion 27 28 /// <summary> 29 /// 输出日志到Log4Net 30 /// </summary> 31 /// <param name="t">当前消息来自成员的类</param> 32 /// <param name="msg">错误消息</param> 33 #region static void WriteLog(Type t, string msg) 34 35 public static void WriteLog(Type t, string msg) 36 { 37 log4net.ILog log = log4net.LogManager.GetLogger(t); 38 //log.Error(msg); 39 log.Info("dd"); 40 } 41 42 #endregion 43 } 44 }
配置文件有了,LogHelper帮助了也有了。现在当然是测试,模拟程序异常。写入文本文件中
1 ////第一种方法。直接记录错误消息 2 //LogHelper.WriteLog(typeof(Program), "测试Log4Net日志是否写入"); 3 4 ////第二种方法:捕获异常 5 try 6 { 7 //int c = 0; 8 // int i = 8 / c; //此处异常,将被cath捕获 9 10 Program c = null; 11 c.ToString(); 12 } 13 catch (Exception ex) 14 { 15 //此处已经封装到LogHelper类 16 //log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 17 //log.Error("Error", ex); 18 19 //Program是该成员的类,可以这样获取,利用反射:MethodBase.GetCurrentMethod().DeclaringType 20 //LogHelper.WriteLog(typeof(Program), ex); 21 //所以也可以这样写 22 LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, ex); 23 24 //一般错误 25 LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "一般错误"); 26 }
因为app.config中配置的日志路径是:<file value="log\"/>
即在Debug目录下面会有一个log文件夹,并以当前年份生成了子文件夹,最里面才是文本文件
打开看日志。如愿是生成了错误信息,没有找到对象,程序员经常遇到的错误
如果写入文本文件已经满足不了你。那你可以尝试把错误信息写入数据库
首先创建在sql server中创建保存的表
USE log4net GO /****** Object: Table [dbo].[Log]******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Log]( [Id] [int] IDENTITY(1,1) NOT NULL, --id [LevelName] [varchar](50) NULL, --级别名称 --[UserID] [int] NULL, [Message] [varchar](4000) NULL, --错误描述 --[Exception] [varchar](2000) NULL, [RecordTime] [varchar](50) NULL, --记录时间 CONSTRAINT [PK_Log_1] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
修改app.config文件:
1 <configuration> 2 <configSections> 3 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 4 </configSections> 5 6 7 <log4net> 8 <!--<root> 9 <level value="INFO"></level> 10 <appender-ref ref="AdoNetAppender_SQL"/> 11 </root>--> 12 13 <logger name="WebLogger"> 14 <level value="INFO"/> 15 <appender-ref ref="ADONetAppender" /> 16 17 </logger> 18 19 <!--SQL数据库--> 20 <appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender"> 21 22 <bufferSize value="1"/> 23 24 <!-- SQL数据源 ,本地安装SQL客户端--> 25 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 26 27 <!-- SQL连接字符串--> 28 <connectionString value="data source=.;initial catalog=log4net;integrated security=False;persist security info=True;User ID=sa;Password=123" /> 29 30 <commandText value="INSERT INTO Log ([RecordTime],[LevelName],[Message]) VALUES (@log_date, @log_level, @message)"/> 31 32 <parameter> 33 <parameterName value="@log_date"/> 34 <dbType value="DateTime"/> 35 <layout type="log4net.Layout.RawTimeStampLayout"/> 36 </parameter> 37 38 <parameter> 39 <parameterName value="@log_level"/> 40 <dbType value="String"/> 41 <size value="50"/> 42 <layout type="log4net.Layout.PatternLayout"> 43 <conversionPattern value="%level"/> 44 </layout> 45 </parameter> 46 47 <!--<parameter> 48 <parameterName value="@exception"/> 49 <dbType value="String"/> 50 <size value="2000"/> 51 <layout type="log4net.Layout.ExceptionLayout"/> 52 </parameter>--> 53 54 <parameter> 55 <parameterName value="@message"/> 56 <dbType value="String"/> 57 <size value="4000"/> 58 <layout type="log4net.Layout.PatternLayout"> 59 <conversionPattern value="%message"/> 60 </layout> 61 </parameter> 62 63 <!--自定义成员 --> 64 <!--<parameter> 65 <parameterName value="@UserID" /> 66 <dbType value="Int32" /> 67 68 <layout type="JJ.Data.LogCommon.CustomLayout"> 69 <conversionPattern value="%UserID" /> 70 </layout> 71 72 </parameter>--> 73 74 </appender> 75 76 <!--<root> 77 <level value="DEBUG" /> 78 <appender-ref ref="ADONetAppender" /> 79 80 </root>--> 81 82 </log4net> 83 84 <startup> 85 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 86 </startup> 87 88 </configuration>
这里编写一个测试类。代码有些荣誉,暂时没考虑封装
1 public class LogHelper1 2 { 3 public LogHelper1() 4 { 5 6 } 7 8 public static string LoggerName = string.Empty; 9 10 private static LogMessage message = null; 11 12 private static ILog _log; 13 14 public static ILog log 15 { 16 get 17 { 18 string path = @"D:ProjectConsoleApplication1ConsoleApplication1App5.config"; 19 //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 20 log4net.Config.XmlConfigurator.Configure(new FileInfo(path)); //根据路径直接读取app.config 21 //log4net.Config.XmlConfigurator.Configure(); //加载app.config,这里名字必须是app.config 22 23 if (_log == null) 24 { 25 //从配置文件中读取Logger对象 26 //WebLogger 里面的配置信息是用来将日志录入到数据库的 27 //做为扩展 做判断来确定日志的记录形式,数据库也好,txt文档也好,控制台程序也好。 28 _log = log4net.LogManager.GetLogger(LoggerName); 29 } 30 else 31 { 32 if (_log.Logger.Name != LoggerName) 33 { 34 _log = log4net.LogManager.GetLogger(LoggerName); 35 } 36 } 37 38 return _log; 39 } 40 } 41 42 43 /// <summary> 44 /// 调试 45 /// </summary> 46 public static void debug() 47 { 48 if (log.IsDebugEnabled) 49 { 50 log.Debug(message); 51 } 52 } 53 54 55 /// <summary> 56 /// 错误 57 /// </summary> 58 public static void error() 59 { 60 if (log.IsErrorEnabled) 61 { 62 log.Error(message); 63 } 64 } 65 66 /// <summary> 67 /// 严重错误 68 /// </summary> 69 public static void fatal() 70 { 71 if (log.IsFatalEnabled) 72 { 73 log.Fatal(message); 74 } 75 } 76 77 /// <summary> 78 /// 记录一般日志 79 /// </summary> 80 public static void info() 81 { 82 if (log.IsInfoEnabled) 83 { 84 log.Info(message.message); 85 } 86 } 87 88 89 /// <summary> 90 /// 记录警告 91 /// </summary> 92 public static void warn() 93 { 94 if (log.IsWarnEnabled) 95 { 96 log.Warn(message); 97 } 98 } 99 100 101 /// <summary> 102 /// 需要写日志的地方调用此方法 103 /// </summary> 104 /// <param name="level">自定义级别</param> 105 public static void SaveMessage(LogMessage logMessage, int level) 106 { 107 message = logMessage; 108 109 switch (level) 110 { 111 case 1: 112 info(); 113 break; 114 115 case 2: 116 warn(); 117 break; 118 119 case 3: 120 error(); 121 break; 122 123 case 4: 124 fatal(); 125 break; 126 127 default: break; 128 } 129 } 130 131 } 132 133 /// <summary> 134 /// 错误提示类 135 /// </summary> 136 public class LogMessage 137 { 138 public object message { get; set; } 139 140 }
测试代码
1 try 2 { 3 int c = 0; 4 int i = 8 / c; 5 6 } 7 catch (Exception ex) 8 { 9 10 //LogHelper1.LoggerName = "WebLogger"; 11 LogMessage logMessage = new LogMessage(); 12 logMessage.message = ex; 13 14 //logMessage.UserID = 123456; 15 LogHelper1.SaveMessage(logMessage, 1); 16 17 }
查看数据库,也如你所愿记录了信息
看博客永远是别人的。只有在看了后自己动手操作一次,两次。。。。才是自己的。
现在怕就怕你不努力。不要怕没有东西学!!
参考资料:
http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html
http://www.cnblogs.com/Lhuatao/p/4431023.html#3164867
http://www.cnblogs.com/mbailing/archive/2012/08/28/2660002.html