简介
log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。
log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务。(f:百度百科)原理
Log4net是基于.NET开发的一款记录日志开源组件。它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL 、 ERROR、 WARN、 INFO 、 DEBUG、ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个是不是很熟悉?可以看到和我们平常在调试应用程序的出错有点类似,在编译器中也会留下如错误、警告之类的提示信息,它们的错误级别在不断的降低。
log4net开源项目结构如图所示:
通过查看源码,log4net主要有5个核心部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders,在配置文件中它们以节点的形式出现。
- Logger:主要负责日志的记录,它记录的方式有多种,可以是以文件、数据库、控制台、邮件等多处方式;
- Appenders:主要负责记录日志介质的方式,它的输出方式主要包括:
-
- AdoNetAppender:将日志记录到数据库中。可以采用SQL和存储过程两种方式
-
AspNetTraceAppender:能用ASP.NET中跟踪的方式查看记录的日志。
-
BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
- ColoredConsoleAppender:在终端的窗口写下高亮度的日志事件。
- ConsoleAppender:将日志输出到控制台。
-
- EventLogAppender:将日志写到Windows操作系统的日志中去。
- FileAppender:将日志写到文件中。
- ForwardingAppender:用来为一个Appender指定一组约束。
- MemoryAppender:将日志存到内存缓冲区。
- NetSendAppender:将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。
- OutputDebugStringAppender:配置该Appender以向OutputDebugString API写入日志。
- RemotingAppender:通过.NET Remoting将日志写到远程接收端。
- RollingFileAppender:将日志以回滚文件的形式写到文件中。
- SmtpAppender:将日志写到邮件中。
- SmtpPickupDirAppender:配置与SmtpAppender类似,但要把SmtpHost换为PickupDir。
- TraceAppender:将日志写到.NET trace 系统。
- UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
以上有些输出方式可能会经常用到(比如写入文件和数据库的方式),有些可能会不经常用到(邮件方式等),具体我们在下面举例来说明。
3.Layouts:主要负责把记录日志格式化输出,显示得格式主要如下:
%timestamp [%thread] %-5level %logger{2} %ndc - %message%newline
timestamp: 表示程序已经开始执行的时间。 单位[毫秒]。
Thread:执行当前代码的线程。
Level:日志的级别。
Logger:日志相关请求的名称。
Message:日志消息。
newline:换行。
案例一:文件记录方式
首先引用Log4net.dll,然后在添加一个配置文件log4net.config(这里不将配置信息写入web.config,个人觉得写在一起实在太乱)中添加下面的配置信息(注意应和web.config处于相同的位置,即根目录下):
1 23 4 5 6 7 89 45 4610 1511 12 13 14 16 2017 1918 21 2522 2423 26 4427 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
%d, %date :表示当然的时间
%level : 表示日志的级别 %logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题 %m, %message :表示日志的具体内容 %n, %newline: 换行在AssemblyInfo.cs中添加如下代码:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
在全局处理程序中添加如下代码:
1 protected void Application_Start(object sender, EventArgs e)2 {3 log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));4 }
测试
在页面添加button和一个label,在button的单击事件中添加如下代码:
1 protected void btnShowTime_Click(object sender, EventArgs e) 2 { 3 log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 4 myLogger.Warn("这是一个警告日志"); 5 myLogger.Info("单击了按钮"); 6 myLogger.Debug("用Log4Net写入数据库日志"); 7 myLogger.Error("这是一个错误日志"); 8 myLogger.Fatal("这是一个致命的错误日志"); 9 try10 {11 ILog logger = LogManager.GetLogger("LogRecord");12 logger.Debug("用Log4Net写入数据库日志");13 int x = 5;14 int y = 0;15 Response.Write(x / y);16 }17 catch (Exception ex)18 {19 myLogger.Error(ex);20 }21 finally22 {23 lblShow.Text = DateTime.Now.ToLongTimeString()+":操作日志已记录完成";24 }25 }
结果
案例二:日志记入数据库
记入数据库的方式和记入文件的方式大同小异,主要区别在配置文件,其他步骤相同,记入数据库的配置文件log4net.config如下:
1 23 4 5 6 78 78 799 57 5810 11 12 13 14 1815 16 17 19 2620 21 22 23 2524 27 3428 29 30 31 3332 35 4236 37 38 39 4140 43 5044 45 46 47 4948 51 5652 53 54 55 59 65 6660 61 62 63 64 67 7368 69 70 71 72 74 7775 76
创建记录日志的数据表:
1 CREATE TABLE [dbo].[ErrorLog]( 2 3 [nId] [bigint] IDENTITY(1,1) NOT NULL, 4 5 [dtDate] [datetime] NOT NULL, 6 7 [sThread] [varchar](100) NOT NULL, 8 9 [sLevel] [varchar](200) NOT NULL, 10 11 [sLogger] [varchar](500) NOT NULL, 12 13 [sMessage] [varchar](3000) NOT NULL, 14 15 [sException] [varchar](4000) NULL)
测试
采用上面的测试方法。结果
结语
项目中经常用到的两种方式在这里做一下总结。其他方式,用到了再补上。