最近在好好整理些小组件的使用,本文就Log4Net的使用做一个简单的说明。
准备工作
首先下载log4net相关资源:http://logging.apache.org/log4net/download.html
本文中还使用了NUnit。
log4net的组成
log4net主要由Logger、Appender、Repository、Layout
1)Logger
Logger是log4net主要部分,是来产生日志消息。在log4net中提供了LogManager类来产生ILog:
1.LogManager.GetLogger(LogName)
在ILog提供了:Erro、Info、Debug、Warn四个重载方法来记录日志。
2)Appender
Appender是用来产生日志生成的目的地。Log4Net可以将消息生成到多个目的地,可以轻松通过配置多种Appender组件来实现,当必要的时候我们也可以通过扩张Appender来实现我们需要的截至方式。
3)Repository
Respository用户维护日志对象的结构。除非我们需要扩展log4net时,一般时候是不会用到Respository组件。
4)Layout
Layout是格式化消息输出形式的组件。Layout提供给我们了灵活而又简单消息格式化方式。
log4net消息的级别
| 级别 | 对应方法 |
| OFF | |
| Fatal | void Fatal(…) |
| Error | void Error(…) |
| Warn | void Warn(…) |
| Info | void Info(…) |
| Debug | void Debug(…) |
| All |
消息的级别按照上面的表格由上到下,由高到底的顺序,即OFF>Fatal>Error>Warn>Info>Debug>All。我们可以通过这样的消息的级别进行消息在Appender时进行行AppenderFiter。
配置
log4net的配置可以通过放在新的文件中或者放在程序的配置文件中。而log4net会通过AppDomain.CurrentDomain.BaseDirectory目录下的查找配置文件。<log4net>是log4net查找的标识。先来看我们应用程序的一个配置:
001.<?xml version="1.0" encoding="utf-8" ?>
002.<log4net>
003. <appender name="LogAllToFile" type="log4net.Appender.FileAppender">
004. <file value="G:\学习资料\Log4Net\Log4NetDemo\Log4NetDemo\bin\Debug\DemoLog.log"/>
005. <appendToFile value="true"/>
006. <!--<layout type="log4net.Layout.PatternLayout">
007. <conversionPattern value="%d [%t] %-5l - %m%n%n"/>
008. </layout>-->
009. <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
010. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" />
011. </layout>
012. </appender>
013. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
014. <param name="File" value="log/system_log_"/>
015. <param name="AppendToFile" value="true"/>
016. <param name="MaxSizeRollBackups" value="100"/>
017. <param name="MaximumFileSize" value="1KB"/>
018. <param name="StaticLogFileName" value="false"/>
019. <param name="DatePattern" value="yyyyMMdd".log""/>
020. <param name="RollingStyle" value="Date"/>
021. <!--<layout type="log4net.Layout.PatternLayout">
022. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
023. </layout>-->
024. <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
025. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" />
026. </layout>
027. </appender>
028. <appender name="ConsoleAppender"
029. type="log4net.Appender.ConsoleAppender" >
030. <layout type="log4net.Layout.PatternLayout">
031. <param name="ConversionPattern"
032. value="%d [%t] %-5p %c [%x] - %m%n"/>
033. </layout>
034. </appender>
035.
036.
037. <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
038. <!--BufferSize为缓冲区大小-->
039. <param name="BufferSize" value="1" />
040. <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
041. <connectionString value="database=HJRightPlat;server=(local);User ID=sa;Password=123456;" />
042. <commandText value="INSERT INTO Sys_Log ([Date],[Thread],[Log_Level],[Logger],[Message],[Exception],[User],[Category],[URL],[Client_IP]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@User,@Category,@URL,@ClientIp)" />
043. <parameter>
044. <parameterName value="@log_date" />
045. <dbType value="DateTime" />
046. <layout type="log4net.Layout.RawTimeStampLayout" />
047. </parameter>
048. <parameter>
049. <parameterName value="@thread" />
050. <dbType value="String" />
051. <size value="255" />
052. <layout type="log4net.Layout.PatternLayout">
053. <conversionPattern value="%thread" />
054. </layout>
055. </parameter>
056. <parameter>
057. <parameterName value="@log_level" />
058. <dbType value="String" />
059. <size value="50" />
060. <layout type="log4net.Layout.PatternLayout">
061. <conversionPattern value="%level" />
062. </layout>
063. </parameter>
064. <parameter>
065. <parameterName value="@logger" />
066. <dbType value="String" />
067. <size value="255" />
068. <layout type="log4net.Layout.PatternLayout">
069. <conversionPattern value="%logger" />
070. </layout>
071. </parameter>
072. <parameter>
073. <parameterName value="@message" />
074. <dbType value="String" />
075. <size value="4000" />
076. <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
077. <conversionPattern value="%SysMessage" />
078. </layout>
079. </parameter>
080. <parameter>
081. <parameterName value="@exception" />
082. <dbType value="String" />
083. <size value="2000" />
084. <layout type="log4net.Layout.ExceptionLayout" />
085. </parameter>
086. <parameter>
087. <parameterName value="@User" />
088. <dbType value="String" />
089. <size value="50" />
090. <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
091. <conversionPattern value="%UserName" />
092. </layout>
093. </parameter>
094. <parameter>
095. <parameterName value="@Category" />
096. <dbType value="String" />
097. <size value="50" />
098. <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
099. <conversionPattern value="%Category" />
100. </layout>
101. </parameter>
102. <parameter>
103. <parameterName value="@URL" />
104. <dbType value="String" />
105. <size value="50" />
106. <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
107. <conversionPattern value="%SysURL" />
108. </layout>
109. </parameter>
110. <parameter>
111. <parameterName value="@ClientIp" />
112. <dbType value="String" />
113. <size value="50" />
114. <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
115. <conversionPattern value="%ClientIP" />
116. </layout>
117. </parameter>
118. </appender>
119.
120.
121.
122. <root>
123. <priority value="ALL"/>
124. <!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF-->
125. <appender-ref ref="LogAllToFile"/>
126. <appender-ref ref="ConsoleAppender"/>
127. <appender-ref ref="RollingLogFileAppender"/>
128. <appender-ref ref="ADONetAppender"/>
129. </root>
130.</log4net>
在上面的配置中我们使用了ADONetAppender、LogAllToFile、ConsoleAppender、RollingLogFileAppender四种appender,其中ADONetAppderder中我们使用了些扩展,在后面会详细进行说明。下面说说各个配置节点:
1)Root:在Root中我们可以来指定消息级别,在上面种我们指定为“ALL”,同时我们也可以指定Appender的引用对象。
2)Appender:我们通过Appender配置节点来指定对应的各种方式的Appender,Appender节点可以是多种的。
应用
首先来看我们定义了一个系统消息的实体:
01.public class SysLogMessage
02.{
03. /// <summary>
04. /// 用户名
05. /// </summary>
06. public string UserName
07. {
08. get;
09. set;
10. }
11. /// <summary>
12. /// 分类
13. /// </summary>
14. public string Category
15. {
16. get;
17. set;
18. }
19. /// <summary>
20. /// 访问的Web地址
21. /// </summary>
22. public string URL
23. {
24. get;
25. set;
26. }
27. /// <summary>
28. /// 客户端IP
29. /// </summary>
30. public string Client_IP
31. {
32. get;
33. set;
34. }
35. /// <summary>
36. /// 消息记录
37. /// </summary>
38. public string Message
39. {
40. get;
41. set;
42. }
43.}
用单件模式定义了一个消息的管理类:
1.
01.public class SysLogManager
02.{
03. #region Thread-safe, lazy Singleton
04. SysLogManager() { this.InitLogManager(); }
05. public static SysLogManager Instance {
06. get {
07. return Nested.LogManager;
08. }
09. }
10. private class Nested {
11. static Nested() { }
12. internal static readonly SysLogManager LogManager = new SysLogManager();
13. }
14. private void InitLogManager()
15. {
16. XmlConfigurator.Configure(BaseDataCache.log4netConfig);
17. _Log = LogManager.GetLogger(LogName);
18.
19. }
20. #endregion
21. #region Help Methods And Fileds
22. ILog _Log;
23. string LogName = "HJRightLog";
24. #endregion
25. public void Erro(SysLogMessage msg)
26. {
27. _Log.Error(msg);
28. }
29. public void Erro(SysLogMessage msg, Exception e)
30. {
31. _Log.Error(msg, e);
32. }
33. public void Info(SysLogMessage msg)
34. {
35. _Log.Info(msg);
36. }
37. public void Info(SysLogMessage msg, Exception e)
38. {
39. _Log.Info(msg, e);
40. }
41. public void Debug(SysLogMessage msg)
42. {
43. _Log.Debug(msg);
44. }
45. public void Debug(SysLogMessage msg, Exception e)
46. {
47. _Log.Debug(msg, e);
48. }
49. public void Warn(SysLogMessage msg)
50. {
51. _Log.Warn(msg);
52. }
53. public void Warn(SysLogMessage msg, Exception e)
54. {
55. _Log.Warn(msg, e);
56. }
57.}
看看测试代码:
01.[Test]
02.public void TestLogErro()
03.{
04. _logM.Erro(new SysLogMessage{
05. Message="测试",
06. UserName="Henllyee",
07. Category="Debug",
08. URL="http://henllyee.cnblogs.com"
09. });
10.
11.}
结果:
ConsleAppender:
RollingLogFileAppender:
AdoNetAppender:
总结
本文中概括地介绍了下log4net的使用,在下篇的文章中将会详细说明下多个常用的Appender。
转自:http://www.cnblogs.com/Henllyee/archive/2010/01/24/1655206.html