log4net的使用详解
log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。要想获取最新版本的log4net组件库,可以到官方网站
http://logging.apache.org/log4net/下载。现在的最新版本是1.2.10。
下面的例子展示了如何利用log4net记录日志 。
首先从官方网站下载最近版本的log4net组件,现在的最新版本是1.2.10。在程序中我们只需要log4net.dll文件就行了,添加对log4net.dll的引用,就可以在程序中使用了。
接着我们配置相关的配置文件(WinForm对应的是*.exe.config,WebForm对应的是*.config),本实例中是控制台应用程序,配置如下(附各配置的说明):
view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="utf-8" ?>
02.<configuration>
03. <configSections>
04. <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
05. </configSections>
06. <appSettings>
07. </appSettings>
08. <log4net>
09.<!--RollingFileAppender自动截断-->
10. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
11. <file value="log\\log.txt"/>
12. <appendToFile value="true"/>
13. <maxSizeRollBackups value="10"/>
14. <maximumFileSize value="2048KB"/>
15. <rollingStyle value="Size"/>
16. <staticLogFileName value="true"/>
17. <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
18. <layout type="log4net.Layout.PatternLayout">
19. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
20. </layout>
21. </appender>
22. <!--定义输出到文件中-->
23. <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
24. <!--定义文件存放位置-->
25. <file value="logs.txt" />
26. <appendToFile value="true" />
27. <rollingStyle value="Date" />
28. <datePattern value="yyyyMMdd-HH:mm:ss" />
29. <layout type="log4net.Layout.PatternLayout">
30. <!--每条日志末尾的文字说明-->
31. <footer value="by author" />
32. <!--输出格式-->
33. <!--样例:2010-01-06 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
34. <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
35. </layout>
36. </appender>
37. <!--定义输出到控制台命令行中-->
38. <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
39. <layout type="log4net.Layout.PatternLayout">
40. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
41. </layout>
42. </appender>
43. <!--定义输出到windows事件中-->
44. <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
45. <layout type="log4net.Layout.PatternLayout">
46. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
47. </layout>
48. </appender>
49. <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb-->
50. <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
51. <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=log4net.mdb" />
52. <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
53. <!--定义各个参数-->
54. <parameter>
55. <parameterName value="@logDate" />
56. <dbType value="String" />
57. <size value="240" />
58. <layout type="log4net.Layout.PatternLayout">
59. <conversionPattern value="%date" />
60. </layout>
61. </parameter>
62. <parameter>
63. <parameterName value="@thread" />
64. <dbType value="String" />
65. <size value="240" />
66. <layout type="log4net.Layout.PatternLayout">
67. <conversionPattern value="%thread" />
68. </layout>
69. </parameter>
70. <parameter>
71. <parameterName value="@logLevel" />
72. <dbType value="String" />
73. <size value="240" />
74. <layout type="log4net.Layout.PatternLayout">
75. <conversionPattern value="%level" />
76. </layout>
77. </parameter>
78. <parameter>
79. <parameterName value="@logger" />
80. <dbType value="String" />
81. <size value="240" />
82. <layout type="log4net.Layout.PatternLayout">
83. <conversionPattern value="%logger" />
84. </layout>
85. </parameter>
86. <parameter>
87. <parameterName value="@message" />
88. <dbType value="String" />
89. <size value="240" />
90. <layout type="log4net.Layout.PatternLayout">
91. <conversionPattern value="%message" />
92. </layout>
93. </parameter>
94. </appender>
95. <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
96. <root>
97. <!--文件形式记录日志-->
98.<appender-ref ref="RollingFileAppender" />
99. <!--<appender-ref ref="LogFileAppender" />-->
100. <!--控制台控制显示日志-->
101. <appender-ref ref="ConsoleAppender" />
102. <!--Windows事件日志-->
103. <appender-ref ref="EventLogAppender" />
104. <!--
105. <appender-ref ref="AdoNetAppender_Access" />
106. -->
107. </root>
108. </log4net>
109.</configuration>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<appSettings>
</appSettings>
<log4net>
<!--RollingFileAppender自动截断-->
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log\\log.txt"/>
<appendToFile value="true"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="2048KB"/>
<rollingStyle value="Size"/>
<staticLogFileName value="true"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
<!--定义输出到文件中-->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="logs.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd-HH:mm:ss" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by author" />
<!--输出格式-->
<!--样例:2010-01-06 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
</layout>
</appender>
<!--定义输出到控制台命令行中-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--定义输出到windows事件中-->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb-->
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
<connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=log4net.mdb" />
<commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
<!--定义各个参数-->
<parameter>
<parameterName value="@logDate" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date" />
</layout>
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@logLevel" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
<!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
<root>
<!--文件形式记录日志-->
<appender-ref ref="RollingFileAppender" />
<!--<appender-ref ref="LogFileAppender" />-->
<!--控制台控制显示日志-->
<appender-ref ref="ConsoleAppender" />
<!--Windows事件日志-->
<appender-ref ref="EventLogAppender" />
<!--
<appender-ref ref="AdoNetAppender_Access" />
-->
</root>
</log4net>
</configuration>
测试代码
view plaincopy to clipboardprint?
01.using System;
02.using System.Collections.Generic;
03.using System.Text;
04.using System.Windows.Forms;
05.using System.Reflection;
06.using log4net;
07.//注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息
08.//如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件)
09.//如果是WebForm,则从web.config中读取相关信息
10.[assembly: log4net.Config.XmlConfigurator(Watch = true)]
11.namespace Log4NetDemo
12.{
13. /// <summary>
14. /// 说明:本程序演示如何利用log4net记录程序日志信息。log4net是一个功能著名的开源日志记录组件。
15. /// 利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库中(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)。
16. /// </summary>
17. public class MainClass
18. {
19. public static void Main(string[] args)
20. {
21. //Application.Run(new MainForm());
22. //创建日志记录组件实例
23. ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
24. //记录错误日志
25. log.Error("error",new Exception("发生了一个异常"));
26. //记录严重错误
27. log.Fatal("fatal",new Exception("发生了一个致命错误"));
28. //记录一般信息
29. log.Info("info");
30. //记录调试信息
31. log.Debug("debug");
32. //记录警告信息
33. log.Warn("warn");
34. Console.WriteLine("日志记录完毕。");
35. Console.Read();
36. }
37. }
38.}
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using log4net;
//注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息
//如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件)
//如果是WebForm,则从web.config中读取相关信息
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Log4NetDemo
{
/// <summary>
/// 说明:本程序演示如何利用log4net记录程序日志信息。log4net是一个功能著名的开源日志记录组件。
/// 利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库中(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)。
/// </summary>
public class MainClass
{
public static void Main(string[] args)
{
//Application.Run(new MainForm());
//创建日志记录组件实例
ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//记录错误日志
log.Error("error",new Exception("发生了一个异常"));
//记录严重错误
log.Fatal("fatal",new Exception("发生了一个致命错误"));
//记录一般信息
log.Info("info");
//记录调试信息
log.Debug("debug");
//记录警告信息
log.Warn("warn");
Console.WriteLine("日志记录完毕。");
Console.Read();
}
}
}
下面是便是强大的LogHelper类,如果用于web,注意记得在global.asax里面调用LogHelper里的init初始化方法。
view plaincopy to clipboardprint?
01.using System;
02.using System.Collections.Generic;
03.using System.Text;
04.using log4net;
05.[assembly: log4net.Config.XmlConfigurator(Watch = true)]
06.namespace The9web.Common
07.{
08. public class LogHelper
09. {
10. /// <summary>
11. /// 静态类
12. /// </summary>
13. private LogHelper() { }
14. private const string LOG_REPOSITORY = "Default"; // this should likely be set in the web config.
15. private static ILog m_log;
16. /// <summary>
17. /// 初始化日志系统
18. /// 在系统运行开始初始化
19. /// Global.asax Application_Start内
20. /// </summary>
21. public static void Init()
22. {
23. log4net.Config.XmlConfigurator.Configure();
24. }
25. /// <summary>
26. /// 写入日志
27. /// </summary>
28. /// <param name="message">日志信息</param>
29. /// <param name="messageType">日志类型</param>
30. public static void Write(string message, LogMessageType messageType)
31. {
32. DoLog(message, messageType, null, Type.GetType("System.Object"));
33. }
34. /// <summary>
35. /// 写入日志
36. /// </summary>
37. /// <param name="message">日志信息</param>
38. /// <param name="messageType">日志类型</param>
39. /// <param name="type"></param>
40. public static void Write(string message, LogMessageType messageType, Type type)
41. {
42. DoLog(message, messageType, null, type);
43. }
44. /// <summary>
45. /// 写入日志
46. /// </summary>
47. /// <param name="message">日志信息</param>
48. /// <param name="messageType">日志类型</param>
49. /// <param name="ex">异常</param>
50. public static void Write(string message, LogMessageType messageType, Exception ex)
51. {
52. DoLog(message, messageType, ex, Type.GetType("System.Object"));
53. }
54. /// <summary>
55. /// 写入日志
56. /// </summary>
57. /// <param name="message">日志信息</param>
58. /// <param name="messageType">日志类型</param>
59. /// <param name="ex">异常</param>
60. /// <param name="type"></param>
61. public static void Write(string message, LogMessageType messageType, Exception ex,
62. Type type)
63. {
64. DoLog(message, messageType, ex, type);
65. }
66. /// <summary>
67. /// 断言
68. /// </summary>
69. /// <param name="condition">条件</param>
70. /// <param name="message">日志信息</param>
71. public static void Assert(bool condition, string message)
72. {
73. Assert(condition, message, Type.GetType("System.Object"));
74. }
75. /// <summary>
76. /// 断言
77. /// </summary>
78. /// <param name="condition">条件</param>
79. /// <param name="message">日志信息</param>
80. /// <param name="type">日志类型</param>
81. public static void Assert(bool condition, string message, Type type)
82. {
83. if (condition == false)
84. Write(message, LogMessageType.Info);
85. }
86. /// <summary>
87. /// 保存日志
88. /// </summary>
89. /// <param name="message">日志信息</param>
90. /// <param name="messageType">日志类型</param>
91. /// <param name="ex">异常</param>
92. /// <param name="type">日志类型</param>
93. private static void DoLog(string message, LogMessageType messageType, Exception ex,
94. Type type)
95. {
96. m_log = LogManager.GetLogger(type);
97. switch (messageType)
98. {
99. case LogMessageType.Debug:
100. LogHelper.m_log.Debug(message, ex);
101. break;
102. case LogMessageType.Info:
103. LogHelper.m_log.Info(message, ex);
104. break;
105. case LogMessageType.Warn:
106. LogHelper.m_log.Warn(message, ex);
107. break;
108. case LogMessageType.Error:
109. LogHelper.m_log.Error(message, ex);
110. break;
111. case LogMessageType.Fatal:
112. LogHelper.m_log.Fatal(message, ex);
113. break;
114. }
115. }
116. /// <summary>
117. /// 日志类型
118. /// </summary>
119. public enum LogMessageType
120. {
121. /// <summary>
122. /// 调试
123. /// </summary>
124. Debug,
125. /// <summary>
126. /// 信息
127. /// </summary>
128. Info,
129. /// <summary>
130. /// 警告
131. /// </summary>
132. Warn,
133. /// <summary>
134. /// 错误
135. /// </summary>
136. Error,
137. /// <summary>
138. /// 致命错误
139. /// </summary>
140. Fatal
141. }
142. }
143.}