1.首先添加引用log4net.dll文件
2.在项目中添加一个名为 Log4netConfiguration 的文件夹。
我现在将它添加在我的项目下 /App_Data/Configuration/Logging/Log4netConfiguration.config
3.现在要进行一些简单的配置
1 <?xml version="1.0" encoding="utf-8" ?> 2 <log4net> 3 <!-- 系统日志 --> 4 <appender name="SystemAppender" type="log4net.Appender.RollingFileAppender"><!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质,type=RollingFileAppender 的意思是将日志以回滚文件的形式写到文件中。--> 5 <file type="log4net.Util.PatternString" value="../../App_Logs/%SystemLogger%/"></file><!-- 输出到什么目录--> 6 7 <appendToFile value="true"></appendToFile><!--是否覆写到文件中--> 8 9 <staticLogFileName value="false" /><!--是否使用静态文件名--> 10 11 <param name="DatePattern" value="yyyy-MM-dd.log"/><!--日志文件名--> 12 <param name="RollingStyle" value="Date"/><!--是文件创建的方式,以Date方式--> 13 14 <layout type="log4net.Layout.PatternLayout"> 15 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> 16 <param name="Header" value=" ----------------------header-------------------------- " /> 17 <param name="Footer" value=" ----------------------footer-------------------------- " /> 18 </layout> 19 20 <!-- 此处必须加这个过滤,否则其他日志信息也会输出到这个里面 --> 21 <filter type="log4net.Filter.LevelRangeFilter"> 22 <param name="LevelMin" value="ERROR" /> 23 <param name="LevelMax" value="ERROR" /> 24 </filter> 25 </appender> 26 27 <!-- 系统未处理异常日志 --> 28 <appender name="ExceptionAppender" type="log4net.Appender.RollingFileAppender"> 29 <file type="log4net.Util.PatternString" value="../../App_Logs/%Exception%/"></file> 30 31 <appendToFile value="true"></appendToFile> 32 33 <staticLogFileName value="false" /> 34 35 <param name="DatePattern" value="yyyy-MM-dd.log"/> 36 <param name="RollingStyle" value="Date"/> 37 38 <layout type="log4net.Layout.PatternLayout"> 39 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> 40 <param name="Header" value=" ----------------------header-------------------------- " /> 41 <param name="Footer" value=" ----------------------footer-------------------------- " /> 42 </layout> 43 44 <!-- 此处必须加这个过滤,否则其他日志信息也会输出到这个里面 --> 45 <filter type="log4net.Filter.LevelRangeFilter"> 46 <param name="LevelMin" value="FATAL" /> 47 <param name="LevelMax" value="FATAL" /> 48 </filter> 49 </appender> 50 51 <root> 52 <level value="ALL"></level> 53 <appender-ref ref="SystemAppender"></appender-ref> 54 <appender-ref ref="ExceptionAppender"></appender-ref> 55 </root> 56 57 <logger name="SystemLogger"> 58 <level value="ERROR"></level> 59 <appender-ref ref="SystemAppender"></appender-ref> 60 </logger> 61 62 <logger name="ExceptionLogger"> 63 <level value="FATAL"></level> 64 <appender-ref ref="ExceptionAppender"></appender-ref> 65 </logger> 66 67 </log4net>
说明下:
logger是负责日志的记录者,假设我们需要记录一些正常的运行时日志和出现异常时的错误日志,那么我们可以通过在配置文件当中添加两个Logger实现。
appender提供记录的介质,前面谈到,我们可能要同时将数据记录到文件和数据库中,我们可以简单地通过编写appender实现,而且Log4Net当中已经默认提供了一些常用的appender,我们可以简单地修改一些配置文件就实现同时向数据库和同时向文件中写入的功能。
layout负责把记入的内容格式化。其实就是决定日志文件要长什么样子。
level定义记录的日志级别,就是说,你要记录哪个级别以上的日志,级别由高往低依次是:
None |
Fatal |
ERROR |
WARN |
DEBUG |
INFO |
ALL |
级别的定义要注意,如果你定义DEBUG,那么低于DEBUG级别以下的信息,将不会记入日志,啥意思呢?就是说,就算你在程序里,用log.info()来写入一个日志信息,可是你在配置中指定level为DEBUG,由于INFO级别低于DEBUG,所以,不会被记入日志.这样的处理非常灵活
appender-ref定义日志要写入到什么介质中中。上面例子中就是写入到ErrorAppender这个介质中,在ErrorAppender节点我们可以定义跟日志有关的要写入到什么地方,日志文件的格式是什么等信息。
Layout中的ConversionPattern就是日志文件的格式,一些符号的介绍附加在下面。由于格式化的方式比较多,除了下面介绍的,大家也可以自己看看官方文档。
%m[%message] | 输出的日志消息 |
%n | 换行 |
%d[%datetime] | 输出当前语句运行的时刻 |
%r | 输出程序从运行到执行到当前语句时消耗的毫秒数 |
%d | 当前语句所在的线程ID |
%p | 日志的当前优先级别 |
%c | 当前日志对象的名称 |
%L | 输出语句所在的行号 |
%F | 输出语句所在的文件名 |
%-数字 | 表示该项的最小长度,如果不够,则用空格填充 |
4.现在我们需要封装一个LogHelper
1 /// <summary> 2 /// 包含常用的日志操作。 3 /// </summary> 4 public static class LogHelper 5 { 6 static LogHelper() { XmlConfigurator.Configure(new FileInfo(MapPath("../../App_Data/Configuration/Logging/Log4netConfiguration.config"))); } 7 8 private static readonly ILog _systemLog = LogManager.GetLogger("SystemLogger"); 9 private static readonly ILog _fatalLog = LogManager.GetLogger("ExceptionLogger"); 10 11 /// <summary> 12 /// 记录一条错误日志。 13 /// </summary> 14 /// <param name="logMessage">日志消息。</param> 15 public static void LogError(string logMessage) 16 { 17 LogError(logMessage, null); 18 } 19 20 /// <summary> 21 /// 记录一条错误日志。 22 /// </summary> 23 /// <param name="methodBase">日志消息。</param> 24 /// <param name="e">异常对象。</param> 25 public static void LogError(MethodBase methodBase, Exception e) 26 { 27 //if (!WebsiteInfo.IsExportLog) return; 判断这个网站是否输入系统日志 28 29 if (e == null) 30 { 31 if (methodBase.DeclaringType != null) _systemLog.Error(methodBase.DeclaringType.FullName); 32 } 33 else 34 { 35 _systemLog.Error(methodBase.DeclaringType == null ? string.Empty : methodBase.DeclaringType.FullName, e); 36 } 37 } 38 39 /// <summary> 40 /// 记录一条错误日志。 41 /// </summary> 42 /// <param name="logMessage">日志消息。</param> 43 /// <param name="e">异常对象。</param> 44 public static void LogError(string logMessage, Exception e) 45 { 46 //if (!WebsiteInfo.IsExportLog) return; 判断这个网站是否输入系统日志 47 48 if (e == null) 49 { 50 _systemLog.Error(logMessage); 51 } 52 else 53 { 54 _systemLog.Error(logMessage, e); 55 } 56 } 57 58 /// <summary> 59 /// 记录一条致命错误日志。 60 /// </summary> 61 /// <param name="logMessage">日志消息。</param> 62 public static void LogFatal(string logMessage) 63 { 64 LogFatal(logMessage, null); 65 } 66 67 /// <summary> 68 /// 记录一条致命错误日志。 69 /// </summary> 70 /// <param name="methodBase">日志消息。</param> 71 /// <param name="e">异常对象。</param> 72 public static void LogFatal(MethodBase methodBase, Exception e) 73 { 74 //if (!WebsiteInfo.IsExportLog) return; 判断这个网站是否输入系统日志 75 76 if (e == null) 77 { 78 if (methodBase.DeclaringType != null) _fatalLog.Error(methodBase.DeclaringType.FullName); 79 } 80 else 81 { 82 _fatalLog.Error(methodBase.DeclaringType == null ? string.Empty : methodBase.DeclaringType.FullName, e); 83 } 84 } 85 86 /// <summary> 87 /// 记录一条致命错误日志。 88 /// </summary> 89 /// <param name="logMessage">日志消息。</param> 90 /// <param name="e">异常对象。</param> 91 public static void LogFatal(string logMessage, Exception e) 92 { 93 //if (!WebsiteInfo.IsExportLog) return; 判断这个网站是否输入系统日志 94 95 if (e == null) 96 { 97 _fatalLog.Fatal(logMessage); 98 } 99 else 100 { 101 _fatalLog.Fatal(logMessage, e); 102 } 103 } 104 105 /* 106 * 日志存储位置: 107 * ~/App_Logs/[logKind]/yyyy-MM-dd.log 108 * 109 * [logKind]: 110 * SystemLogger 系统日志 111 * Exception 系统未处理的异常日志 112 */ 113 114 public static string MapPath(string path, bool autoCreateDirectories = false) 115 { 116 if (path == null) throw new ArgumentNullException("path"); 117 if (path.Length == 0) throw new ArgumentOutOfRangeException("path"); 118 119 if (HttpContext.Current == null) return path; 120 121 var mapPath = HttpContext.Current.Server.MapPath(path); 122 123 return mapPath; 124 } 125 }
5.现在我们可以做一个简单的测试
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var i = 2; 6 var j = 0; 7 var item=MaxNum(i, j); 8 9 Console.WriteLine("结果为:{0}",item); 10 Console.ReadLine(); 11 } 12 13 public static int MaxNum(int a, int b) 14 { 15 try 16 { 17 var c=a / b; 18 return c; 19 } 20 catch (Exception e) 21 { 22 LogHelper.LogError(MethodBase.GetCurrentMethod(), e); 23 } 24 25 return 0; 26 } 27 }
6.刷新项目,可以发现我们已经添加了一条日志进去。
这样一个日志管理就可以使用了!