现在的位置: 首页 > 综合 > 正文

Log4net的使用

2014年08月29日 ⁄ 综合 ⁄ 共 9340字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.