程序的記事本--log4net
來源:程序員人生 發布時間:2014-11-03 08:19:15 閱讀次數:2829次
你是不是在遇到程序運行問題時常常百度?你是不是在遇到運行毛病時常常去詢問他人?如果有那末是時候改變啦,對1個Developer來講那是不專業的表現,專業的Developer都會首先查看程序的運行日志,先從日志下手,分析問題產生的緣由,然后修復它。這里面最重要的就是日志,那末你也就會很好奇,這些日志是如何記錄的呢,偷偷的告知你通常使用的是日志管理框架。那末是否是也想在開發程序時開發出1個日志管理的模塊呢,不用著急下面就來介紹下如何做日志管理。
就我所知現在日志管理框架有多種如 Enterprise、NLog、CLog、Log4net,其中Log4net功能強大適用于中大型的項目日志管理,NLog雖然功能較少但是它使用簡單,而且支持智能感應,另外Enterprise更是強大的沒的說,針對大型系統開發,固然使用也比較困難。但是斟酌到它們的使用資源及功能的強大,最后我們的項目肯定了使用Log4net,所以接下來將會主要討論Log4net的主要使用方法。
1、Log4net組成及配置
從Log4net的API文檔中不難看出,其實Log4net的開發進程還是蠻簡單的,并沒有想象中的那末復雜,而且在使用時只需要添加相應的配置節信息然后調用存儲方法便可實現日志的存儲,具體的結構以下圖

1.1 組成詳解
上圖顯示了Log4net的主要由5個部份組成,分別為Logger,Appenders, Filters, Layouts 和Object Renders,其中最主要的Appender命名空間中封裝了日志的存儲方式,也就是說通過配置Appender能夠將日志輸出到履行的類型中;Layout實際上是封裝了數據顯示的格式,通過配置Layout能夠輸出指定模板的數據信息,它還可以控制數據的輸出類型(輸出xml還是文本類型);Object Renders很重要,它能夠控制數據的自定義輸出,log4net將會依照用戶定義的標準輸出日志。
1.2 配置方法
在使用log4net時首先需要配置日志存儲方式,然后在代碼中調用LogManager類的靜態方法GetLog保存對象的對象的信息。其中配置信息可以寫到config文件內,也能夠自定義1個xml文檔,把具體的配置節信息寫到xml文件便可。
2、使用方法
log4net有多重存儲級別,依照日志信息的情況大致分為了5類,它們分別是Error毛病日志、Fatal嚴重毛病日志、Info1般信息日志、Debug調試信息日志和Warn正告信息日志,在日志管理時可以依照日志的級別來斟酌寄存的方式,對嚴重日志常常是系統的重大問題,此時可以斟酌存到http://www.vxbq.cn/server/http://www.vxbq.cn/db/中,其它的1些日志可以斟酌存儲到文件中,可以提高http://www.vxbq.cn/server/性能。接下來將會介紹它的幾種使用方法。
2.1 日志輸出到DataBase
把日志輸出到http://www.vxbq.cn/db/中也是很多系統常常使用的日志存儲方法,在小數據量的處理進程中將日志保存到http://www.vxbq.cn/db/中是可行的,但是如果需要處理的日志數據量較大那末這類存儲方法就會下降http://www.vxbq.cn/db/的性能,所以在存儲日志時慎重使用這類方式,建議觸及到系統重大問題時采取此種存儲方式,這樣會提升http://www.vxbq.cn/db/的性能。具體配置以下:
<appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1"></bufferSize>
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=.;Initial Catalog=Test;Integrated Security=True;Pooling=False" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout" value="%thread" />
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" value="%level" />
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout" value="%logger" />
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout" value="%message" />
</parameter>
</appender>
另外初學者在寫入http://www.vxbq.cn/db/時可能會有很多問題,最主要的是不能寫入數據,這主要是由于connectionType和connectionString的緣由,要重新檢查修改才可以,特別是connectionType中sqlconnection的版本問題,如果不能成功寫入數據常常就是它釀成的。
2.2 日志輸出到File
另外我們也能夠將數據輸出到文件中,用戶可以自定義文件輸出的類型,通過datePattern標簽來設置存儲文件的類型及文件名,具體以下配置所示:
<log4net>
<!--定義輸出到文件中-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="D:" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="30" />
<datePattern value="yyyy-MM-dd'.log'" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="{%level}%date{MM/dd HH:mm:ss} - %message%newline" />
</layout>
</appender>
<root>
<!--文件情勢記錄日志-->
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
此種方式在指定的目錄下創建指定的文件,并將日志信息寫入創建的文件中。
2.3 日志輸出到Console
輸出到控制臺中已不陌生,在windows操作系統中常??梢钥吹矫⌒畔?,這類方式能夠很直觀的告知用戶毛病的情況及緣由,但是這類方式只是緩存級別的,系統重新啟動時毛病信息就會被刪除,所以在使用此種方法時應配合著上面說到的方法來綜合存儲日志,增強系統的硬朗性。
<log4net>
<!--定義輸出到控制臺命令行中-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %⑸level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<!--控制臺控制顯示日志-->
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
2.4 日志輸出到Event
上面介紹了幾種經常使用的輸出方式,固然log4net還有更多的輸出方式,這里再介紹1種輸出到WindowsEvent的方法,這類方法將會把毛病信息輸出到Windows事件中,雖然不常常使用,但也能夠作為1種日志的存儲方式。
<log4net>
<!--定義輸出到windows事件中-->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %⑸level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--定義日志的輸出媒介,下面定義日志以4種方式輸出。也能夠下面的依照1種類型或其他類型輸出。-->
<root>
<!--Windows事件日志-->
<appender-ref ref="EventLogAppender" />
</root>
</log4net>
通過使用上面的配置文件能夠將日志輸出到指定的類型中,但是想要輸出日志其實不只是使用上面的配置,另外需要在代碼中調用方法來記錄日志,具體以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using log4net;
using log4net.Appender;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ILog log = log4net.LogManager.GetLogger(typeof(Program));
//記錄毛病日志
log.Error("error", new Exception("產生了1個異常"));
//記錄嚴重毛病
log.Fatal("fatal", new Exception("產生了1個致命毛病"));
//記錄1般信息
log.Info("info");
//記錄調試信息
log.Debug("debug");
//記錄正告信息
log.Warn("warn");
Console.WriteLine("日志記錄終了。");
Console.Read();
}
}
}
在測試時上面的所有情勢的配置輸出都可使用GetLogger方法來存貯存儲日志信息。
Note:代碼中有這么1句:[assembly: log4net.Config.XmlConfigurator(Watch = true)](在需要使用log4net的類的namespace處),如果沒有這句就會在調試時得到以下留言中所說的“程序調試起來時isDebugEnable"的情況。
3、log4net保存NHibernate日志信息
在使用NHibernate經常常需要分析SQL語句,但是NHibernate默許的是不輸出SQL Script的,那末怎樣才能查看它生成的SQL呢?無妨使用下log4net吧,log4net可以輸出NHibernate的運行情況,可以通過配置來實現輸出所有Level的NHibernate的日志信息,具體的配置方法以下,這里將配置文件放到了外置的xml中。
<?xml version="1.0" encoding="utf⑻" ?>
<log4net debug="true">
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="D:loglog.txt"/>
<param name="AppendToFile" value="false"/>
<param name="RollingStyle" value="Date"/>
<param name="StaticLogFileName" value="true"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %⑸p %c - %m%n" />
</layout>
</appender>
<logger name="NHibernate" additivity="true">
<level value="ERROR"/>
<appender-ref ref="DebugAppender" />
</logger>
<logger name="NHibernate.SQL" additivity="true">
<level value="DEBUG"/>
<appender-ref ref="DebugAppender" />
</logger>
<logger name="NHibernate.AdoNet.AbstractBatcher" additivity="true">
<level value="DEBUG"/>
<appender-ref ref="DebugAppender" />
</logger>
<root>
<!-- levels: DEBUG, INFO, WARN, ERROR, FATAL -->
<level value="DEBUG"/>
<level value="INFO"/>
<level value="WARN"/>
<level value="ERROR"/>
<level value="FATAL "/>
<appender-ref ref="rollingFile"/>
</root>
</log4net>
這里將log4net的配置信息放到了1個單獨的xml文件中,所以需要在運行時將配置信息添加到log4net的配置類中,它的配置常常在Global文件的Application_Start事件中添加配置,以下代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using Medici.Etam.Data.NHibernateSessionManagement;
using NHibernate;
using NHibernate.Context;
namespace Medici.Etam.WebService
{
public class Global : System.Web.HttpApplication
{
private static log4net.ILog logger = log4net.LogManager.GetLogger("Logger");
protected void Application_Start(object sender, EventArgs e)
{
//if the log4net is a lone file then it should be config
log4net.XmlConfigurator.Configure(new FileInfo("D:CodeEtamETAMETAM_Webservice_T16_V1.1Datalog4net.cfg.xml"));
}
}
}
結語
log4net的日志存儲功能很強大,它對日志信息做了詳細的分類,總共劃分為5類,在存儲日志的時候可以根據情況來選擇性的存儲,并根據級別選擇存儲方式。另外類似的這類日志框架還有NLog、CLog等,可以根據具體的日志情況來選擇使用日志存儲的框架。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈