本文共 8988 字,大约阅读时间需要 29 分钟。
Log4net是一款非常好用、强大的开源日志记录组件,它来自于著名的Apache。起初是log4j专用于Java,后来又提供了log4net用于支持.NET。帮助.NET程序员也能够轻松的处理日志信息。
log4net是一个“库”,用于帮助程序员输出日志到大量不同的输出目标(文件、控制台、不同的数据库、甚至内存等等)。可以在这里下载到它的最新版本。
好,下面进入正题,在C#当中如何利用好这个“著名”的日志组件呢?
我们可以按照下面的步骤来创建一个控制台项目来利用log4net进行日志的记录:
1、创建一个控制台项目,并添加log4net.dll引用
log4net.dll,这个文件可以从下载的包中找到。在创建好的控制台项目中,直接添加引用这个文件就可以了。
2、创建一个log4net.config文件,用于单独的进行log4net日志信息的配置
配置文件是核心,它记录了日志的详细的配置情况。log4net继承了Java的优点,能够以灵活的配置方式,将日志信息输出到不同的数据源。
下面展示了一个完整的log4net.config文件:
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | <? xml version = "1.0" encoding = "utf-8" ?> < configuration > <!--添加log4net自定义节点--> < configSections > < section name = "log4net" type = "System.Configuration.IgnoreSectionHandler" /> </ configSections > < log4net > <!--文件形式--> < appender name = "FileAppender" type = "log4net.Appender.FileAppender" > <!--文件路径--> < file value = "log-file.txt" /> <!--是否追加--> < appendToFile value = "true" /> <!--显示格式--> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </ layout > </ appender > <!--SqlServer形式--> < appender name = "AdoNetAppender_SqlServer" type = "log4net.Appender.AdoNetAppender" > < bufferSize value = "100" /> < connectionType value = "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> < connectionString value = "data source=10.77.137.119;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=123456" /> < commandText value = "INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> < parameter > < parameterName value = "@log_date" /> < dbType value = "DateTime" /> < layout type = "log4net.Layout.RawTimeStampLayout" /> </ parameter > < parameter > < parameterName value = "@thread" /> < dbType value = "String" /> < size value = "255" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%thread" /> </ layout > </ parameter > < parameter > < parameterName value = "@log_level" /> < dbType value = "String" /> < size value = "50" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%level" /> </ layout > </ parameter > < parameter > < parameterName value = "@logger" /> < dbType value = "String" /> < size value = "255" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%logger" /> </ layout > </ parameter > < parameter > < parameterName value = "@message" /> < dbType value = "String" /> < size value = "4000" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%message" /> </ layout > </ parameter > < parameter > < parameterName value = "@exception" /> < dbType value = "String" /> < size value = "2000" /> < layout type = "log4net.Layout.ExceptionLayout" /> </ parameter > </ appender > <!--Access数据库--> < appender name = "AdoNetAppender_Access" type = "log4net.Appender.AdoNetAppender" > < connectionString value = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Administrator\桌面\test.mdb;User Id=;Password=;" /> < commandText value = "INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" /> < parameter > < parameterName value = "@log_date" /> < dbType value = "String" /> < size value = "255" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%date" /> </ layout > </ parameter > < parameter > < parameterName value = "@thread" /> < dbType value = "String" /> < size value = "255" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%thread" /> </ layout > </ parameter > < parameter > < parameterName value = "@log_level" /> < dbType value = "String" /> < size value = "50" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%level" /> </ layout > </ parameter > < parameter > < parameterName value = "@logger" /> < dbType value = "String" /> < size value = "255" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%logger" /> </ layout > </ parameter > < parameter > < parameterName value = "@message" /> < dbType value = "String" /> < size value = "1024" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%message" /> </ layout > </ parameter > </ appender > <!--Oracle形式--> < appender name = "AdoNetAppender_Oracle" type = "log4net.Appender.AdoNetAppender" > <!--数据库连接类型--> < connectionType value = "System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <!--数据库连接字符串--> < connectionString value = "data source=orcl;User ID=damis;Password=damis" /> <!--数据库执行语句--> < commandText value = "INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" /> <!--缓冲区大小--> < bufferSize value = "128" /> <!--数据库表字段参数--> < parameter > < parameterName value = ":log_date" /> < dbType value = "DateTime" /> < layout type = "log4net.Layout.RawTimeStampLayout" /> </ parameter > < parameter > < parameterName value = ":thread" /> < dbType value = "String" /> < size value = "255" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%thread" /> </ layout > </ parameter > < parameter > < parameterName value = ":log_level" /> < dbType value = "String" /> < size value = "50" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%level" /> </ layout > </ parameter > < parameter > < parameterName value = ":logger" /> < dbType value = "String" /> < size value = "255" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%logger" /> </ layout > </ parameter > < parameter > < parameterName value = ":message" /> < dbType value = "String" /> < size value = "4000" /> < layout type = "log4net.Layout.PatternLayout" > < conversionPattern value = "%message" /> </ layout > </ parameter > </ appender > <!--配置日志的目标存储形式--> < root > <!--文件形式--> < appender-ref ref = "FileAppender" /> <!--SqlServer形式--> < appender-ref ref = "AdoNetAppender_SqlServer" /> <!--Oracle形式--> < appender-ref ref = "AdoNetAppender_Oracle" /> <!--Access形式--> < appender-ref ref = "AdoNetAppender_Access" /> </ root > </ log4net > </ configuration > |
上面我直接引用了官方的配置示例。可以在这里找到:。这里面有各种目标数据源的配置示例,非常全面。
3、建立一个类Logger,用于进行日志的记录
在建好的Logger类中,添加如下代码:
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 | //如果是winform或console等c/s程序,需要设置一下。 //具体步骤:右键log4net.config文件-属性-复制到输出目录:始终复制。目的是为了每次启动时能够找到这个config文件 [assembly: log4net.Config.XmlConfigurator(Watch = true , ConfigFile = "log4net.config" )] namespace Log4net { /// <summary> /// 日志记录类 /// </summary> public class Logger { #region 记录日志 /// <summary> /// 记录日志 /// </summary> /// <param name="legLevel">日志级别</param> /// <param name="msg">日志内容</param> public static void LoggerMsg(LogLevel legLevel, string msg) { log4net.ILog log = GetLogger(); switch (legLevel) { case LogLevel.Debug: log.Debug(msg); break ; //Debug case LogLevel.Error: log.Error(msg); break ; //Error case LogLevel.Fatal: log.Fatal(msg); break ; //Fatal case LogLevel.Info: log.Info(msg); break ; //Info case LogLevel.Warn: log.Warn(msg); break ; //Warn default : break ; } } #endregion #region 获得一个日志记录对象 /// <summary> /// 获得一个日志记录对象 /// </summary> /// <returns>日志记录对象</returns> public static log4net.ILog GetLogger() { //MethodBase.GetCurrentMethod().DeclaringType 返回:命名空间名+类名 return log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); } #endregion } /// <summary> /// 日志记录级别 /// </summary> public enum LogLevel { Debug, Info, Warn, Error, Fatal, } } |
这里强调的是,一定要在命名空间上面加上:[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "log4net.config")]。并且如果你的是c/s项目,比如控制台、winform等程序,则必须要右键log4net.config文件-属性-复制到输出目录:改为始终复制。这样程序加载时才能找到这个log4net.config,才能进行日志的记录。
4、在控制台Main方法中进行测试
好了,最后一步,就是对上述的配置进行测试了。我们在Main方法中加上如下测试代码。
1 2 | //主方法测试用 Logger.LoggerMsg(LogLevel.Info, "hello,log4net!" ); |
运行这个控制台,程序正常执行。
上面我演示了将日志记录输出到文件、Sql Server数据库、Oracle数据库、Access数据库等四种情况。如果有更多的其它数据源的输出,可以参考官方网站: 。
最后看下执行的结果:
txt:
access:
sqlserver 2008:
oracle 10g:
本文转自 guwei4037 51CTO博客,原文链接:http://blog.51cto.com/csharper/1348372