代码改变世界

用log4net记录日志信息

2015-05-06 18:08  糯米粥  阅读(488)  评论(0编辑  收藏  举报

在.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:\Project\ConsoleApplication1\ConsoleApplication1\App5.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