博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Log4net的使用
阅读量:6615 次
发布时间:2019-06-24

本文共 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:

Center

access:

Center

sqlserver 2008:

Center

oracle 10g:

Center

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

你可能感兴趣的文章
uml学习-时序图-活动图
查看>>
Mybatis Generator 配置详解
查看>>
配置Tomcat JNDI数据源
查看>>
详解并取证网络协议ARP的工作原理
查看>>
CallableStatement的入门
查看>>
Android自定义实现圆形播放进度条
查看>>
阿里面试题目总结
查看>>
ListView的定位
查看>>
控件焦点问题
查看>>
移动CDN改善用户体验
查看>>
[谷歌旗下Blogger CSRF漏洞 全文]
查看>>
数据库监控模板
查看>>
spring ioc之bean的初始化
查看>>
MongoDb查询和分组统计示例
查看>>
C++ Primer第四版中文版(电子版)
查看>>
分析下为什么spring 整合mybatis后为啥用不上session缓存
查看>>
BAMEasyTable
查看>>
android activity 六个主要函数以及一些调用顺序
查看>>
【干货】在docker中安装配置Greenplum集群的过程
查看>>
政府和社会资合作(ppp)概述
查看>>