簡介
幾乎所有的大型應用都會有自己的用於跟蹤調試的API。因為一旦程序被部署以后,就不太可能再利用專門的調試工具了。然而一個管理員可能需要有一套強大的日志系統來診斷和修復配置上的問題。
經驗表明,日志記錄往往是軟件開發周期中的重要組成部分。它具有以下幾個優點:它可以提供應用程序運行時的精確環境,可供開發人員盡快找到應用程序中的Bug;一旦在程序中加入了Log 輸出代碼,程序運行過程中就能生成並輸出日志信息而無需人工干預。另外,日志信息可以輸出到不同的地方(控制台,文件等)以備以后研究之用。
Log4net就是為這樣一個目的設計的,用於.NET開發環境的日志記錄包。
官方網站:http://logging.apache.org/log4net/
使用方法
第一步:Log4net的安裝
Install-Package log4net
第二步:Log4net的配置
log4net.config
注意:將log4net.config的屬性“復制到輸出目錄”設置為“始終復制”
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日志路徑--> <param name= "File" value= "D:\App_Log\"/> <!--是否是向文件中追加日志--> <param name= "AppendToFile" value= "true"/> <!--log保留天數--> <param name= "MaxSizeRollBackups" value= "10"/> <!--日志文件名是否是固定不變的--> <param name= "StaticLogFileName" value= "false"/> <!--日志文件名格式為:2008-08-31.log--> <param name= "DatePattern" value= "yyyy-MM-dd".log""/> <!--日志根據日期滾動--> <param name= "RollingStyle" value= "Date"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" /> </layout> </appender> <!-- 控制台前台顯示日志 --> <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <mapping> <level value="ERROR" /> <foreColor value="Red, HighIntensity" /> </mapping> <mapping> <level value="Info" /> <foreColor value="Green" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Info" /> <param name="LevelMax" value="Fatal" /> </filter> </appender> <root> <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --> <level value="all" /> <appender-ref ref="ColoredConsoleAppender"/> <appender-ref ref="RollingLogFileAppender"/> </root> </log4net> </configuration>
第三步:調用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using log4net; using log4net.Config; namespace Log4net { class Program { static void Main(string[] args) { InitLog4Net(); var logger = LogManager.GetLogger(typeof(Program)); logger.Info("消息"); logger.Warn("警告"); logger.Error("異常"); logger.Fatal("錯誤"); Console.ReadLine(); } private static void InitLog4Net() { var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); XmlConfigurator.ConfigureAndWatch(logCfg); } } }
深入理解Log4net的結構
log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫), Appender(附着器)以及 Layout(布局).
外部Blog資源:http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html
日志寫入數據庫
在實際開發過程中,應該將報錯都寫到數據庫里,方便查詢
第一步:同上面,安裝log4net,創建log4net.config
注意:
1、將log4net.config的屬性“復制到輸出目錄”設置為“始終復制”
2、connectionString 配置成自己的數據庫
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <!--日志緩存寫入條數 設置為0時只要有一條就立刻寫到數據庫--> <bufferSize value="0" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="data source=.\SQLExpress;initial catalog=YinCai;integrated security=false;persist security info=True;User ID=sa;Password=123" /> <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> <root> <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --> <level value="all" /> <appender-ref ref="AdoNetAppender" /> </root> </log4net> </configuration>
第二步:創建數據庫
CREATE TABLE [dbo].[Log] ( [Id] [int] IDENTITY (1, 1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [varchar] (255) NOT NULL, [Level] [varchar] (50) NOT NULL, [Logger] [varchar] (255) NOT NULL, [Message] [varchar] (4000) NOT NULL, [Exception] [varchar] (2000) NULL )
第三步:Properties 屬性下面的AssemblyInfo.cs 追加( 必須有這個,否則寫入不到數據庫中)
//注意: ConfigFile 可以指定相對路徑 和 絕對路徑。 eg: /log/xxxx.log 或者 d://log//xxxx.log [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
第四步:.NET MVC 下,在App_Start -- FilterConfig下配置全局
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //應用程序啟動時,自動加載配置log4Net XmlConfigurator.Configure(); } }
第五步:測試
public ActionResult Index() { var logger = LogManager.GetLogger(typeof(HomeController)); logger.Info("消息"); logger.Warn("警告"); logger.Error("異常"); logger.Fatal("錯誤"); return View(); }
上面都是Log4Net自帶的字段,有時這幾個字段不能滿足我們記錄日志的需求,因而,我們想要多增加幾個字段。
1、數據庫多增加兩個字段,如:
[ModuleName] [varchar] (255) NULL, [UserName] [varchar] (50) NULL
2、修改log4net.config命令文本
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[ModuleName],[UserName]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @module_name, @user_name)" />
3、為自定義列添加參數定義
<parameter> <parameterName value="@module_name"/> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{ModuleName}" /> </layout> </parameter> <parameter> <parameterName value="@user_name"/> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{UserName}" /> </layout> </parameter>
4、log4net.LogicalThreadContext.Properties 添加自己新增的屬性
public ActionResult Index() { var logger = LogManager.GetLogger(typeof(HomeController)); log4net.LogicalThreadContext.Properties["ModuleName"] = "訂單模塊"; log4net.LogicalThreadContext.Properties["UserName"] = "admin"; logger.Info("消息"); logger.Warn("警告"); logger.Error("異常"); logger.Fatal("錯誤"); return View(); }
如果數據里沒有數據,請檢查
1、配置文件log4net.config配置了root
<appender-ref ref="AdoNetAppender" />
2、log4net.config 始終復制
3、檢查配置文件數據庫的鏈接
4、是否漏了第三步Properties