接上文 項目架構開發:資料通路層之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 }
檢視資料庫記錄
自此日志功能完成了,比較簡單
項目架構開發系列
- 項目架構開發:資料通路層之Cache
- 項目架構開發:資料通路層之Logger
- 項目架構開發:資料通路層之Repository
- 項目架構開發:資料通路層之Query
- 項目架構開發:資料通路層之UnitOfWork