看了log4net的簡單使用之一_log4net介紹 大家對log4net元件應該有了大概的了解,下面再近一步介紹其在項目中如何應用。
1.Logger
所有的記錄器都必須實作 ILog 接口,該接口提供日志記錄所需的大量方法。
public interface ILog : ILoggerWrapper
{
void Debug(...);
void Error(...);
void Fatal(...);
void Info(...);
void Warn(...);
bool IsDebugEnabled { get; }
bool IsErrorEnabled { get; }
bool IsFatalEnabled { get; }
bool IsInfoEnabled { get; }
bool IsWarnEnabled { get; }
}
通常情況下,我們通過 LogManager.GetLogger() 來擷取一個記錄器。LogManager 内部維護一個 hashtable,儲存新建立 Logger 引用,下次需要時直接從 hashtable 擷取其執行個體。
ILog log = LogManager.GetLogger(this.GetType());
log.Debug("aaaaaaaaaaaaaaa");
所有 Logger 的參數設定都直接或間接繼承自 root,其繼承關系類似 namespace。比如,名為 "MyLogger.X.Y" 參數設定繼承自 "MyLogger.X"。當我們建立 "MyLooger.X.Y" 記錄器時,會在配置檔案找該名稱的記錄器設定,如果沒找到,則按繼承關系向上查找,直到 root。是以,在建立 Logger 時,我們通常使用類型名稱做為記錄器的名字,預設情況下,它會使用 root 或某一個父配置,但在需要的時候,我們随時可以為具體的類型添加一個更加 "詳細" 的配置。
1
<?xml version="1.0" encoding="utf-8" ?>
2
<log4net>
3
<appender name="Console" type="log4net.Appender.ConsoleAppender">
4
<layout type="log4net.Layout.PatternLayout">
5
<conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
6
</layout>
7
</appender>
8
9
<logger name="Learn.Library.Log4netTest">
10
<level value="ALL" />
11
</logger>
12
13
<root>
14
<level value="OFF" />
15
<appender-ref ref="Console" />
16
</root>
17
</log4net>
18
"appender-ref" 參數用于綁定一個或多個具體的 Appender。
1
<?xml version="1.0" encoding="utf-8" ?>
2
<log4net>
3
<appender name="Console" type="log4net.Appender.ConsoleAppender">
4
</appender>
5
6
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
7
</appender>
8
9
<root>
10
<level value="DEBUG" />
11
<appender-ref ref="Console" />
12
<appender-ref ref="RollingFile" />
13
</root>
14
</log4net>
15
2 Appender / Layout
Log4net 提供了大量的 Appender,最常用的包括 AdoNetAppender、AspNetTraceAppender、ConsoleAppender、FileAppender、OutputDebugStringAppender。每種 Appender 都有特定一些參數,使用時直接從《Log4net 手冊》的示例中拷貝過去,就OK了。(代碼摘自 Log4net 手冊)
(1) AspNetTraceAppender
1
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
2
<layout type="log4net.Layout.PatternLayout">
3
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
4
</layout>
5
</appender>
6
(2) ConsoleAppender
1
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
2
<layout type="log4net.Layout.PatternLayout">
3
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
4
</layout>
5
</appender>
6
(3) FileAppender
1
<appender name="FileAppender" type="log4net.Appender.FileAppender">
2
<file value="log-file.txt" />
3
<appendToFile value="true" />
4
<layout type="log4net.Layout.PatternLayout">
5
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
6
</layout>
7
</appender>
8
有關 Layout 詳細資訊,請參考 Log4net 相關文檔,本文不做詳述。
3. Configuration
Log4net 的配置方式十分靈活,即可以寫到應用程式配置檔案中,也可以使用獨立配置檔案。同時它還提供了監測配置檔案變化的功能,這樣我們随時可以調整配置,而無須重新開機應用程式。
(1) 使用 app.config / web.config
配置app.config / web.config檔案
1
<?xml version="1.0" encoding="utf-8"?>
2
<!--
3
注意: 除了手動編輯此檔案以外,您還可以使用
4
Web 管理工具來配置應用程式的設定。可以使用 Visual Studio 中的
5
“網站”->“Asp.Net 配置”選項。
6
設定和注釋的完整清單在
7
machine.config.comments 中,該檔案通常位于
8
\Windows\Microsoft.Net\Framework\v2.x\Config 中
9
-->
10
<configuration>
11
<configSections>
12
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
13
</configSections>
14
<appSettings/>
15
<connectionStrings/>
16
<log4net>
17
<root>
18
<level value="ALL" />
19
<appender-ref ref="LogFileAppender" />
20
<appender-ref ref="RollingFileAppender" />
21
<appender-ref ref="AdoNetAppender_SqlServer" />
22
</root>
23
<!--
24
寫入檔案中-->
25
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
26
<file value="D:\log-file1.txt" />
27
<!-- Example using environment variables in params -->
28
<!-- <file value="${TMP}\log-file.txt" /> -->
29
<!--<sppendToFile value="true" />-->
30
<!-- An alternate output encoding can be specified -->
31
<!-- <encoding value="unicodeFFFE" /> -->
32
<layout type="log4net.Layout.PatternLayout">
33
<!--<footer value="[Footer] Test By Ring1981 " />-->
34
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
35
</layout>
36
<!-- Alternate layout using XML
37
<layout type="log4net.Layout.XMLLayout" /> -->
38
</appender>
39
40
<!-- 将日志以復原檔案的形式寫到檔案中
41
為做測試,我把檔案大小設定為1K,大于它,就重新生成文檔
42
-->
43
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" Threshold="Error" >
44
<file value="log.txt" />
45
<appendToFile value="true" />
46
<rollingStyle value="Size" />
47
<maxSizeRollBackups value="10" />
48
<maximumFileSize value="1KB" />
49
<staticLogFileName value="true" />
50
<layout type="log4net.Layout.PatternLayout">
51
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
52
</layout>
53
</appender>
54
55
56
<!-- 将日志記錄到資料庫中。采用存儲過程兩種方式
57
備注:也可采用SQL語句的方式,主要就是commandType, commandText屬性設定不同,請
58
參見log4net官方文檔
59
-->
60
<appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender" Threshold="Fatal" >
61
<bufferSize value="0" />
62
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
63
<connectionString value="data source=.;initial catalog=aigoshop;integrated security=false;persist security info=True;User ID=sa;Password=" />
64
<commandType value="StoredProcedure" />
65
<commandText value="WriteLog" />
66
<parameter>
67
<parameterName value="@log_date" />
68
<dbType value="DateTime" />
69
<layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
70
</parameter>
71
<parameter>
72
<parameterName value="@thread" />
73
<dbType value="String" />
74
<size value="255" />
75
<layout type="log4net.Layout.PatternLayout" value="%thread" />
76
</parameter>
77
<parameter>
78
<parameterName value="@log_level" />
79
<dbType value="String" />
80
<size value="20" />
81
<layout type="log4net.Layout.PatternLayout" value="%level" />
82
</parameter>
83
<parameter>
84
<parameterName value="@logger" />
85
<dbType value="String" />
86
<size value="255" />
87
<layout type="log4net.Layout.PatternLayout" value="%logger" />
88
</parameter>
89
<parameter>
90
<parameterName value="@message" />
91
<dbType value="String" />
92
<size value="4000" />
93
<layout type="log4net.Layout.PatternLayout" value="%message" />
94
</parameter>
95
</appender>
96
97
98
</log4net>
99
<system.web>
100
101
<compilation debug="false" />
102
103
<authentication mode="Windows" />
104
105
</system.web>
106
</configuration>
107
使用代碼初始化配置。
log4net.Config.XmlConfigurator.Configure();
(2) 使用自定義配置檔案
test.log4net
1
<?xml version="1.0" encoding="utf-8" ?>
2
<log4net>
3
<appender name="Console" type="log4net.Appender.ConsoleAppender">
4
<layout type="log4net.Layout.PatternLayout">
5
<conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
6
</layout>
7
</appender>
8
9
<root>
10
<level value="DEBUG" />
11
<appender-ref ref="Console" />
12
</root>
13
</log4net>
14
使用代碼初始化配置。
log4net.Config.XmlConfigurator.Configure(new FileInfo("test.log4net"));
使用 XmlConfigurator.ConfigureAndWatch() 方法除了初始化配置外,還會監測配置檔案的變化,一旦發生修改,将自動重新整理配置。
(3) XmlConfiguratorAttribute
我們還可以使用 XmlConfiguratorAttribute 代替 XmlConfigurator.Config()/ConfigureAndWatch(),ConfiguratorAttribute 用于定義與 Assembly 相關聯的配置檔案名。
方式1: 關聯到 test.log4net,并監測變化。
[assembly:log4net.Config.XmlConfigurator(ConfigFile="test.log4net", Watch=true)]
方式2: 關聯到 test.exe.log4net (或 test.dll.log4net,檔案名字首為目前程式集名稱),并監測變化。
[assembly:log4net.Config.XmlConfigurator(ConfigFileExtension="log4net", Watch=true)]
4.應用log4netDemo下載下傳
備注:
CREATE TABLE [dbo].[Log] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Date] [datetime] NOT NULL ,
[Thread] [varchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Level] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Logger] [varchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Message] [varchar] (4000) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO
CREATE PROCEDURE WriteLog
@log_date datetime,
@thread varchar(255),
@log_level varchar(20),
@logger varchar(255),
@message varchar(4000)
AS
INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)
GO
運作完程式後,看到檔案和資料庫日志表都寫入了兩條。想到能否在資料庫正常打開時隻寫日志表,在資料庫連接配接不上而寫到日志檔案中呢。哈。。請看第三篇:log4net的簡單使用之三_ log4net進階應用
備注:
參考:Log4net 簡明手冊 - Q_yuhen.htm