項目架構開發:數據訪問層之Logger


接上文 項目架構開發:數據訪問層之Cache

 

本章我們繼續ILogger的開發

ILogger.cs

 1     public interface ILogger
 2     {
 3         void Info(object message);
 4         void Info(object message, Exception e);
 5         void Debug(object message);
 6         void Debug(object message, Exception e);
 7         void Warn(object message);
 8         void Warn(object message, Exception e);
 9         void Error(object message);
10         void Error(object message, Exception e);
11         void Fatal(object message);
12         void Fatal(object message, Exception e);
13     }

 

日志服務的實現

這里我們引用的是log4net組件,我們來看看具體實現

LoggerBase.cs

 1     public class LoggerBase : ILogger
 2     {
 3         private ILog logger;
 4 
 5         public LoggerBase()
 6         {
 7             logger = LogManager.GetLogger("log4netlogger");
 8         }
 9 
10         public void Info(object message)
11         {
12             logger.Info(message);
13         }
14 
15         public void Info(object message, Exception e)
16         {
17             logger.Info(message, e);
18         }
19 
20         public void Debug(object message)
21         {
22             logger.Debug(message);
23         }
24 
25         public void Debug(object message, Exception e)
26         {
27             logger.Debug(message, e);
28         }
29 
30         public void Warn(object message)
31         {
32             logger.Warn(message);
33         }
34 
35         public void Warn(object message, Exception e)
36         {
37             logger.Warn(message, e);
38         }
39 
40         public void Error(object message)
41         {
42             logger.Error(message);
43         }
44 
45         public void Error(object message, Exception e)
46         {
47             logger.Error(message, e);
48         }
49 
50         public void Fatal(object message)
51         {
52             logger.Fatal(message);
53         }
54 
55         public void Fatal(object message, Exception e)
56         {
57             logger.Fatal(message, e);
58         }
59     }

其實log4net可以直接在項目各層調用的,我們這里之所以還要創建一個接口,似乎有過度封裝之嫌;

我這么做是有原因的,因為我不想只限於一種日志記錄方式,如果以后還有其他組件,或者自己寫日志組件

那都可以很方便的擴展了。

再看看log4net.config

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <configSections>
 4     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
 5   </configSections>
 6   <appSettings>
 7   </appSettings>
 8   <log4net>
 9 
10     <!--定義日志的輸出媒介,下面定義日志以五種方式輸出。也可以下面的按照一種類型或其他類型輸出。-->
11     <!--None,Fatal,ERROR,WARN,DEBUG,INFO,ALL-->
12     <root>
13       <level value="all"/>
14 
15       <!--文件形式記錄日志-->
16       <!--<appender-ref ref="LogFileAppender" />-->
17     
18       <!--控制台控制顯示日志-->
19       <!--<appender-ref ref="ConsoleAppender" />-->
20 
21       <!--啟用Access數據庫記錄日志-->
22       <!--<appender-ref ref="AdoNetAppender_Access" />-->
23 
24       <!--SqlServer數據庫記錄日志-->
25       <!--<appender-ref ref="AdoNetAppenderSqlServer" />-->
26     </root>
27 
28     <logger name="log4netlogger">
29       <level value="all" />
30       <appender-ref ref="AdoNetAppenderSqlServer" />
31     </logger>
32 
33     <!--定義輸出到數據庫中,這里舉例輸出到SqlServer數據庫中-->
34     <appender name="AdoNetAppenderSqlServer" type="log4net.Appender.AdoNetAppender">
35       <bufferSize value="1" />
36       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089" />
37       <connectionString value="Data Source=JIANRONGLAN-PC\SQLEXPRESS;Initial Catalog=SystemBase;User ID=sa;Password=123456" />
38       <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
39       <filter type="log4net.Filter.LevelRangeFilter">
40         <param name="LevelMin" value="INFO" />
41         <param name="LevelMax" value="Fatal" />
42       </filter>
43       <parameter>
44         <parameterName value="@log_date" />
45         <dbType value="DateTime" />
46         <layout type="log4net.Layout.RawTimeStampLayout" />
47       </parameter>
48       <parameter>
49         <parameterName value="@thread" />
50         <dbType value="String" />
51         <size value="255" />
52         <layout type="log4net.Layout.PatternLayout">
53           <conversionPattern value="%thread" />
54         </layout>
55       </parameter>
56       <parameter>
57         <parameterName value="@log_level" />
58         <dbType value="String" />
59         <size value="50" />
60         <layout type="log4net.Layout.PatternLayout">
61           <conversionPattern value="%level" />
62         </layout>
63       </parameter>
64       <parameter>
65         <parameterName value="@logger" />
66         <dbType value="String" />
67         <size value="255" />
68         <layout type="log4net.Layout.PatternLayout">
69           <conversionPattern value="%logger" />
70         </layout>
71       </parameter>
72       <parameter>
73         <parameterName value="@message" />
74         <dbType value="String" />
75         <size value="4000" />
76         <layout type="log4net.Layout.PatternLayout">
77           <conversionPattern value="%message" />
78         </layout>
79       </parameter>
80       <parameter>
81         <parameterName value="@exception" />
82         <dbType value="String" />
83         <size value="4000" />
84         <layout type="log4net.Layout.ExceptionLayout" />
85       </parameter>
86     </appender>
87     
88   </log4net>
89 </configuration>

 

基礎設施層的實現

Logger.cs 代碼跟上邊的差不多,主要是要實現日志驅動的配置,或許有其他方法,但暫時這么寫吧

 1     public sealed class Logger
 2     {
 3         private readonly static ILogger loggerProvider;
 4 
 5         static Logger()
 6         {
 7             loggerProvider = ProviderHelper.GetLoggerProvider();
 8         }
 9 
10         public static void Info(object message)
11         {
12             loggerProvider.Info(message);
13         }
14 
15         public static void Info(object message, Exception e)
16         {
17             loggerProvider.Info(message, e);
18         }
19 
20         public static void Debug(object message)
21         {
22             loggerProvider.Debug(message);
23         }
24 
25         public static void Debug(object message, Exception e)
26         {
27             loggerProvider.Debug(message, e);
28         }
29 
30         public static void Warn(object message)
31         {
32             loggerProvider.Warn(message);
33         }
34 
35         public static void Warn(object message, Exception e)
36         {
37             loggerProvider.Warn(message, e);
38         }
39 
40         public static void Error(object message)
41         {
42             loggerProvider.Error(message);
43         }
44 
45         public static void Error(object message, Exception e)
46         {
47             loggerProvider.Error(message, e);
48         }
49 
50         public static void Fatal(object message)
51         {
52             loggerProvider.Fatal(message);
53         }
54 
55         public static void Fatal(object message, Exception e)
56         {
57             loggerProvider.Fatal(message, e);
58         }
59     }

 

我們新建測試看看效果

 1     [TestClass]
 2     public class LoggerTest
 3     {
 4         [TestMethod]
 5         public void Info()
 6         {
 7             LjrFramework.Infrastructure.Logger.Info("sqlserver test message " + Guid.NewGuid().ToString());
 8 
 9             Assert.AreEqual(true, true);
10         }
11     }

 

查看數據庫記錄

 

自此日志功能完成了,比較簡單

 

項目架構開發系列

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM