我们自带的MemcachedCacheProviders自带的log4net是 1.2.10版本,所以就拿这个版本说吧
下面是一个演示的效果,以及日志分别表达的意思
表示时间 2011-09-20 14:17:03,312 (312代表的是毫秒)
[4] 表示线程编号,暂时不需要管
DeBUG 表示我们用的是debug模式
Log4NetTest.Test1 表示我们是在哪个类里面
-我的第一条日志 表示详细信息
下面开始配置:(我们配置一个能自动生成月份+天数的日志文件,并且,如果报错,则发送邮件)
log4net的配置,跟你的程序是 B/S 还是C/S是没有区别的
要想获取最新版本的log4net组件库,可以到官方网站http://logging.apache.org/log4net/下载。现在的最新版本是1.2.10.
在程序中我们只需要log4net.dll文件就行了,添加对log4net.dll的引用,就可以在程序中使用了。
1:在web.config里面的 configSections里面加入 log4net,而且必须是 configSections的第一个元素
2:
如果是CS程序,在根目录的Program.cs中的Main方法中添加:
log4net.Config.XmlConfigurator.Configure();
如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加:
private static readonlyILogLogger = LogManager.GetLogger(typeof(Global));
protected voidApplication_Start(objectsender, EventArgse)
{
{
log4net.Config.XmlConfigurator.Configure();
}
}
protected voidApplication_Error(objectsender, EventArgse)
{
Logger.Error("程序发生未捕获的异常\t\t\t"+ HttpContext.Current.Error.Message, HttpContext.Current.Error);
}
无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句:
[assembly: log4net.Config .XmlConfigurator()]
3:
前台代码的调用
LogManager.GetLogger(typeof(_Default)).Error(ex.Message);
//或者是
//ILog logger = LogManager.GetLogger(typeof (_Default));
//logger.Error(ex.Message);
建议写成一个通用类
public classLogHelper{
public static voidWriteLog(stringstrTxt, Exceptionex, Typetype)
{
ILoglog = log4net.LogManager.GetLogger(type);
log.Error(strTxt, ex);
}
}
调用如下
LogHelper.WriteLog("运行错误", ex, this.GetType());
4:继续在web.config节点里面的 configuration 里面 (一般是在 结束的下面一行)
log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).
log4net定义了日志内容的不同级别,从高到低依次是FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。
可以在配置文件中设置日志级别。上面的例子中看到我们在root中定义了,表示凡是级别等于高于Error的都可以输出至日志中。
但是如果你的附加器的配置更低一些,则附加器里面的也会被保存
在上面的配置中,每个日志文件最大1024KB,最大日志文件个数是10生成的日志文件名会是当前的年份月份 加上, 2012-12-13.log 2012-12-13.log.1 ... 2012-12-13.log.10,
如果记录的日志超过10个,会从2012-12-13.log.1开始覆盖。
【写日志的原则】
Ⅰ.在catch后,把异常写入日志.
Ⅱ.在调用第三方控件的开始和结束处.
Ⅲ.在连接数据库的开始结束处.
Ⅳ.除非必要,不要在循环体中加入日志,否则一旦出问题可能导致日志暴增.
Ⅴ.在自己认为很重要的逻辑处写入日志.
如果是想用Mssql数据库呢?如果我们想用mysql数据库呢?
表结构的定义稍微有一点不一样,sqlserver数据库如下(我用的是sql2005)
1:CREATE TABLE[dbo].[LOG]
2: (
3:[LogId] [INT] IDENTITY(1,1) NOT NULL,
4:[LogDate] [DATETIME] NOT NULL,
5:[Thread] [VARCHAR] (255) NOT NULL,
6:[LogLevel] [VARCHAR] (50) NOT NULL,
7:[Logger] [VARCHAR] (255) NOT NULL,
8:[Message] [VARCHAR] (4000) NOT NULL,
9:[Exception] [VARCHAR] (2000) NULL
10:)
然后需要在Append和Root里面增加代码
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
Root里面增加
1:
2:
如果是mysql数据库,
1)首先需要到mysql的官方网站(www.mysql.com)下载驱动,网站上提供了两个驱动,这里我使用的mysql-connector-net连接器,版本越新越好,我这里用的是6.5.4 。复制MySql.Data.dll到项目下;
2)在项目中添加引用,选择MySql.Data.dll,最好是直接放在bin文件夹;
3)在本机的mysql上使用test数据库,使用一下sql创建表:
创建表如下
1: CREATETABLE LOG(
2: LogId INTEGERNOT NULLPRIMARY KEYAUTO_INCREMENT,
3: LogDate DATETIME NOTNULL,
4: Thread VARCHAR(255) DEFAULTNULL,
5: LogLevel VARCHAR(50) DEFAULTNULL,
6: Logger VARCHAR(255) DEFAULTNULL,
7: Message VARCHAR(4000) DEFAULTNULL,
8: Exception VARCHAR(2000) DEFAULTNULL
9:)
10:
然后需要在Append增加代码
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
然后是Root里面添加
1:
2:
如果append里面的配置都是有的时候,数据库插入数据是会延迟的(输入不会丢,但是可能有很多秒都没有数据,然后一下子又全部出来了)。bufferSize表示批处理的日志事件,可以避免每次日志事件都访问数据库;ConnectionType指定了要使用的IDbConnection的完全限定类型名称;connectionString表示连接字符串;CommandText是SQL语句或存储过程;最后一组parameter节点描述了SQL语句或存储过程需要的参数。如果觉得批处理会丢失数据(如果遇到突然停电之类,而且你的bufferSize又设置的特别大的话),可以将bufferSize设置为1,那么每次报错数据库都会有新的数据(缺点显而易见,频繁的访问数据库··)