一. Log4Net简介
Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架,它的功能很强大,可以将日志分为不同的等级,以不同的格式输出到不同的存储介质中,比如:数据库、txt文件、内存缓冲区、邮件、控制台、ANSI终端、远程接收端等等,我们这里主要介绍最常用的两种:txt文件和数据库。
(PS:其它的存储介质详见 http://logging.apache.org/log4net/release/config-examples.html)
Log4net将日志分为五个级别,分别是: FATAL(致命错误) > ERROR(一般错误) > WARN(警告) > INFO(一般信息) > DEBUG(调试信息),每个级别都对应着一组重载方法进行调用。
官网地址:http://logging.apache.org/log4net/index.html
Nuget地址:https://www.nuget.org/packages/log4net/
Nuget安装:Install-Package log4net
最新版本:2.0.8 (2018-08-09)
本节主要围绕两个主要的存储介质:【txt文件】和【SQLServer数据库】展开,涵盖的知识点有:
①. 基本的使用步骤。
②. 初始化关联配置文件的几种形式。
③. 代码调用详解。
④. 配置文件详解。
⑤. 简单的封装和在MVC框架中的调用。
二. 基本使用步骤
我们先以控制台程序为例,简单介绍Log4net存储日志到txt文本文档中,后面在做代码的详解。
1. 新建01-SimpleDemo控制台程序,通过指令 【Install-Package log4net】安装相应程序集。
2. 在默认配置文件中App.config(B/S程序则为web.config)中进行配置,主要分两块:
A. 在节点下新增节点下新增(要在其最顶部):
B. 在根节点下,配置log4net的核心配置代码, 主要节点如下:
详细代码如下:
1 <?xml version="1.0" encoding="utf-8" ?> 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
3. 代码调用
1 log4net.Config.XmlConfigurator.Configure();2 ILog log = LogManager.GetLogger("test");3 log.Debug("调试信息");
4. 运行结果
截止此处,日志保存成功。
三. 初始化配置文件
前面提到在默认配置文件中App.config(B/S程序则为web.config)中进行配置,可以通过代码 log4net.Config.XmlConfigurator.Configure(); 来初始化配置,或者还可以通过 [assembly: log4net.Config.XmlConfigurator()] 反射的形式进行初始化配置,二者可以达到同样的效果,代表了两种初始化配置文件的形式。
PS: [assembly: log4net.Config.XmlConfigurator()] 可以加在 当前使用文件的 namespace上作用于当前文件,或者加在Properties/AssemblyInfo.cs中,则该项目全局都无须再初始化了。
在实际项目中,默认的配置文件里可能包含很多框架的信息,这个时候把 log4net的配置代码再放入进去,就会显得有点杂乱,或者有些“奇葩”的人把默认配置文件改名了,这个时候使用上述默认的两种方式就不好用了,那么这种情况怎么处理呢?
这里重点介绍 通过 log4net.Config.XmlConfigurator.Configure(); 来关联配置文件。
情况一: 使用默认配置文件的情况
1. 代码配置:log4net.Config.XmlConfigurator.Configure();
2. 反射配置:[assembly: log4net.Config.XmlConfigurator()]
(这里只是举例,很少有修改默认配置文件名称的)
1. 代码配置: 首先将App1.config文件的属性中的“生成操作”改为“ 嵌入的资源”,然后通过以下代码进行配置。
1 Assembly assembly = Assembly.GetExecutingAssembly();2 var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.App1.config");3 log4net.Config.XmlConfigurator.Configure(xml);
注:代码中的 _01_SimpleDemo 为命名空间名。
2. 反射配置:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml")]
注:用这种方式属性中的:复制到输出目录需要改为:始终复制,生成操作不需要配置,使用默认:无 即可
情况三:新建单独xml文件,进行log4net的配置 (推荐采用这种方式,和原配置文件区分开,单独配置方便,处理方式和情况二是一致的)
1. 代码配置:首先将log4net.xml文件的属性中的“生成操作”改为“ 嵌入的资源”,然后通过以下代码进行配置。
1 Assembly assembly = Assembly.GetExecutingAssembly();2 var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.log4net.xml");3 log4net.Config.XmlConfigurator.Configure(xml);
注:代码中的 _01_SimpleDemo 为命名空间名。
情况四:无论是修改默认配置文件的名称为 或者 新建单独的xml作为配置文件 → 可以通过绝对路径的方式进行处理 【不推荐这种方式】
1. 直接写绝对路径 (注意这种方式【不需要】配置文件属性为 “嵌入的资源”)
1 log4net.Config.XmlConfigurator.Configure(new FileInfo(@"D:06-我的开发之路DotNet体系05-DotNet框架篇03-Log4net详解Code01-SimpleDemolog4net.xml"));
2 通过代码获取绝对路径 (注意这种方式【不需要】配置文件属性的“生成操作”改为 “嵌入的资源”,但需要改为“始终复制”,确保输出到bin文件下)
1 string assemblyFilePath = Assembly.GetExecutingAssembly().Location;2 string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);3 string configFilePath = assemblyDirPath + " //log4net.xml";4 log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));
PS:B/S程序下通过 log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~") + @"/log4net.xml")); 来配置。
四. 代码调用详解
Log4net允许多个ILog对象同时存在,通过代码:ILog log = LogManager.GetLogger("xxx"); 来创建。
A: 日志级别由高到低分别为:FATAL(致命错误) > ERROR(一般错误) > WARN(警告) > INFO(一般信息) > DEBUG(调试信息),另外还有 OFF和 ALL 。
几点说明:OFF表示所有信息都不写入,ALL表示所有信息都写入,我们也可以通过: level >这样配置,表示WARN级别以及高于WARN以上的级别才会被写入日志。
B: 写入日志的方法有:Debug、Error、Fatal、Info、Warn五个方法,每个方法都有两个重载,如下图:
分享在使用配置文件为log4net.xml的情况下的调用代码:
1 Assembly assembly = Assembly.GetExecutingAssembly(); 2 var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.log4net.xml"); 3 log4net.Config.XmlConfigurator.Configure(xml); 4 ILog log = LogManager.GetLogger("test"); 5 log.Debug("调试信息"); 6 log.Info("一般信息"); 7 log.Warn("警告"); 8 try 9 {10 int.Parse("ddd");11 }12 catch (Exception ex)13 {14 log.Error("一般错误