在項目開發中,日誌記錄是任什麼時候候都少不了的,在本文中,將簡單介紹一下以下幾種日誌記錄工具,以及推薦一些學習的資源:
1
.Log4net
2
.Logging Application Block
3
.NLog
一.Log4net
Log4net
是從java平臺下很是優秀的日誌記錄框架log4j上移植到.NET下的,它是apache基金資助的項目的一部分。Log4net能夠幫助咱們把日誌信息輸出到各類不一樣目標(文本文件、數據庫、控制檯等)的.net類庫,它能夠容易的加載到開發項目中,實現程序調試和運行的時候的日誌信息輸出,提供了比.net本身提供的debug類和trace類的功能更多,使用起來也是很是的簡單。在Log4net 主要有四種重要的組件,分別是Logge, Repository, Appender以及 Layout,Log4net支持兩種不一樣的配置方式:配置文件和代碼配置,通常狀況下推薦使用配置文件,一個完整的配置示例以下:
<?
xml version="1.0" encoding="utf-8"
?>
<
configuration
>
<
configSections
>
<
section
name
="log4net"
type
="log4net.Config.Log4NetConfigurationSectionHandler,
log4net-net-1.0"
/>
</
configSections
>
<
log4net
>
<
root
>
<
level
value
="WARN"
/>
<
appender-ref
ref
="AdoNetAppender"
/>
<
appender-ref
ref
="ConsoleAppender"
/>
</
root
>
<
logger
name
="testApp.Logging"
>
<
level
value
="DEBUG"
/>
</
logger
>
<
appender
name
="AdoNetAppender"
type
="log4net.Appender.AdoNetAppender"
>
<
bufferSize
value
="100"
/>
<
connectionType
value
="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
/>
<
connectionString
value
="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]"
/>
<
commandText
value
="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"
/>
<
parameter
>
<
parameterName
value
="@log_date"
/>
<
dbType
value
="DateTime"
/>
<
layout
type
="log4net.Layout.RawTimeStampLayout"
/>
</
parameter
>
<
parameter
>
<
parameterName
value
="@thread"
/>
<
dbType
value
="String"
/>
<
size
value
="255"
/>
<
layout
type
="log4net.Layout.PatternLayout"
>
<
conversionPattern
value
="%thread"
/>
</
layout
>
</
parameter
>
<
parameter
>
<
parameterName
value
="@log_level"
/>
<
dbType
value
="String"
/>
<
size
value
="50"
/>
<
layout
type
="log4net.Layout.PatternLayout"
>
<
conversionPattern
value
="%level"
/>
</
layout
>
</
parameter
>
<
parameter
>
<
parameterName
value
="@logger"
/>
<
dbType
value
="String"
/>
<
size
value
="255"
/>
<
layout
type
="log4net.Layout.PatternLayout"
>
<
conversionPattern
value
="%logger"
/>
</
layout
>
</
parameter
>
<
parameter
>
<
parameterName
value
="@message"
/>
<
dbType
value
="String"
/>
<
size
value
="4000"
/>
<
layout
type
="log4net.Layout.PatternLayout"
>
<
conversionPattern
value
="%message"
/>
</
layout
>
</
parameter
>
<
parameter
>
<
parameterName
value
="@exception"
/>
<
dbType
value
="String"
/>
<
size
value
="2000"
/>
<
layout
type
="log4net.Layout.ExceptionLayout"
/>
</
parameter
>
</
appender
>
<
appender
name
="ConsoleAppender"
type
="log4net.Appender.ConsoleAppender"
>
<
layout
type
="log4net.Layout.PatternLayout"
>
<
param
name
="ConversionPattern"
value
="%d [%t] %-5p %c [%x] - %m%n"
/>
</
layout
>
</
appender
>
</
log4net
>
</
configuration
>
在該示例中,配置了兩種目標的輸出,分別爲數據庫和控制檯方式,在代碼中使用示例:
Log4net.ILog log
=
Log4net.LogManager.GetLogger(
"
MyLogger
"
);
if
(log.IsDebugEnabled)
log.Debug(
"
message
"
);
if
(log.IsInfoEnabled)
log.Info(
"
message
"
);
Log4net
已經可以徹底知足咱們平常開發的日誌記錄功能,可是它容易爲人所詬病的一點是沒有可視化的配置工具支持,須要手工編寫配置文件。若是你還在擔憂這一點,不妨看看這篇《Log4net GUI configuration tool》文章,文中做者爲咱們提供了一種Log4net的可視化配置工具,界面以下所示:
學習資料
2
.Sema翻譯的Log4net使用指南 (我的認爲,若是你從沒有接觸過Log4net,看這篇就足夠使用它了)
二.Logging Application Block
Logging Application Block
是微軟Enterprise Library其中的一個應用程序塊,可使開發人員能夠在其應用程序中集成標準的日誌和監測功能,應用程序可使用日誌和監測塊在多個位置記錄事件,記錄的位置包括:事件日誌(Event Log)、電子郵件(Email)、數據庫(DataBase)、文本文件(TextFile)、消息隊列(MSMQ)、WMI、用戶自定義位置。而且使用Enterprise Library Configuration工具進行徹底可視化配置,而且能夠設置輸出日誌信息的格式。如圖所示:
配置完成後,全部的配置都放在了應用程序配置文件裏面(針對EL2.0):
<
configuration
>
<
configSections
>
<
section
name
="loggingConfiguration"
type
="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging"
/>
</
configSections
>
<
loggingConfiguration
tracingEnabled
="true"
defaultCategory
="General"
>
<
logFilters
>
<
add
name
="Category"
type
="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.CategoryFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
categoryFilterMode
="AllowAllExceptDenied"
>
<
categoryFilters
>
<
add
name
="UI Events"
/>
</
categoryFilters
>
</
add
>
<
add
name
="Priority"
type
="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
minimumPriority
="2"
/>
<
add
name
="LogEnabled Filter"
type
="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.LogEnabledFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
enabled
="true"
/>
</
logFilters
>
</
loggingConfiguration
>
</
configuration
>
在代碼中使用時很是簡單,以下代碼片段所示:
LogEntry logEntry
=
new
LogEntry();
logEntry.EventId
=
100
;
logEntry.Priority
=
2
;
logEntry.Message
=
"
Informational message
"
;
//
設置多個Category
logEntry.Categories.Add(
"
Trace
"
);
logEntry.Categories.Add(
"
UI Events
"
);
Logger.Write(logEntry);
不少朋友使用
Logging Application Block,有一個擔憂的地方就是
Enterprise Library 2.0中把全部的配置信息都放在了應用程序配置文件裏面,這樣由配置工具生成的配置代碼和咱們手工添加的一些配置代碼混合在一塊兒,會顯得很是混亂,若是你有這樣的疑問,想把每個應用程序塊的配置信息單獨放在外部文件中,不妨看看這篇文章《
Enterprise Library 2.0 技巧(1):如何使用外部配置文件》
關於Logging Application Block還應該提一下它的可擴展性,除了系統中默認的輸出目標以外,用戶能夠自行擴展本身的目標,好比說控制檯等;除此以外,用戶也能夠擴展本身的日誌輸出格式,好比說XML格式等。
學習資源
三.NLog
NLog
是C#編寫的開源日誌類庫,它的設計思想是使其簡單而靈活。NLog讓你處理診斷的日誌消息,用相關信息擴充消息,依照你的選擇格式化日誌消息和把日誌消息輸出到一個或多個目的地,基本上相似於Log4net。一樣,NLog也提供了不少的擴展,能夠自定義日誌輸出目標,日誌格式,過濾器等。看一個簡單的配置示例:
<
nlog
xmlns
="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
>
<
targets
>
<
target
name
="console"
xsi:type
="ColoredConsole"
layout
="${date:format=HH\:mm\:ss}|${level}|${stacktrace}|${message}"
/>
<
target
name
="file"
xsi:type
="File"
fileName
="${basedir}/file.txt"
layout
="${stacktrace} ${message}"
/>
</
targets
>
<
rules
>
<
logger
name
="*"
minlevel
="Trace"
writeTo
="console,file"
/>
</
rules
>
</
nlog
>
在代碼中使用以下所示:
static
void
C()
{
logger.Info("Info CCC");
}
static
void
B()
{
logger.Trace("Trace BBB");
logger.Debug("Debug BBB");
logger.Info("Info BBB");
C();
logger.Warn("Warn BBB");
logger.Error("Error BBB");
logger.Fatal("Fatal BBB");
}
static
void
A()
{
logger.Trace("Trace AAA");
logger.Debug("Debug AAA");
logger.Info("Info AAA");
B();
logger.Warn("Warn AAA");
logger.Error("Error AAA");
logger.Fatal("Fatal AAA");
}
static
void
Main(
string
[] args)
{
logger.Trace("This is a Trace message");
logger.Debug("This is a Debug message");
logger.Info("This is an Info message");
A();
logger.Warn("This is a Warn message");
logger.Error("This is an Error message");
logger.Fatal("This is a Fatal error message");
}
NLog
雖然沒有提供可視化的配置工具,可是安裝後,咱們會在VS2005的New Item裏面看到有關本NLog的配置文件這麼一項,是用該配置文件是支持自動補全功能的。
學習資源
沒有發現目前有好的中文學習資源,你們能夠參考官方文檔,但願有時間能夠寫幾篇NLog的使用教程,彌補一下當前中文文檔的空缺。
總結
以上簡單的介紹了.NET下的幾種開源日誌記錄框架,若是你的系統總體架構都使用了Enterprise Library,那麼使用Logging Application Block更適合你;不然,若是使用了NHiberante或者Castle等數據持久框架,那麼選用Log4net將會更適合,由於在NH中自己就是用Log4net做爲日誌記錄工具的;在沒有使用任何其餘框架的狀況下,能夠在以上幾種工具中自行選用,我的認爲它們都很優秀!