Log4net的使用

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

Log4net是一款非常好用、强大的开源日志记录组件,它来自于著名的Apache。起初是log4j专用于Java,后来又提供了log4net用于支持.NET。帮助.NET程序员也能够轻松的处理日志信息。

log4net是一个“库”,用于帮助程序员输出日志到大量不同的输出目标(文件、控制台、不同的数据库、甚至内存等等)。可以在这里下载到它的最新版本。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 >

上面我直接引用了官方的配置示例。可以在这里找到:log4net配置示例。这里面有各种目标数据源的配置示例,非常全面。

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数据库等四种情况。如果有更多的其它数据源的输出,可以参考官方网站:http://logging.apache.org/log4net/release/config-examples.html 。


最后看下执行的结果:

txt:

Center

access:

Center

sqlserver 2008:

Center

oracle 10g:

Center


本文转自 guwei4037  51CTO博客,原文链接:http://blog.51cto.com/csharper/1348372



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
.Net Core使用 Log4Net
.Net Core使用 Log4Net
85 0
|
监控 C#
VS2012 C#使用/配置Log4Net
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨如何在VS2012中使用Log4Net 1、首先在项目中添加Nuget程序包.
1503 0
|
SQL 数据库 数据库管理
|
数据库管理 关系型数据库 数据格式
|
数据库 Windows 数据库管理