日誌組件Log2Net的介紹和使用(附源碼開源地址) Log2Net組件代碼詳解

  Log2Net是一個用於收集日誌到數據庫或文件的組件,支持.NET和.NetCore平臺。 此組件自動收集系統的運行日誌(服務器運行狀況、在線人數等)、異常日誌。程序員還能夠添加自定義日誌。 該組件支持.NET平臺和.NETCore平臺,支持將日誌寫入到文本文件、SQL Server、Oracle、MySQL,能夠方便地擴展到其餘數據庫。html

  針對這個組件的數據,相應地有日誌查詢網站,它查詢日誌數據庫的數據(Log2Net組件存儲的日誌數據),顯示各服務器/網站的實時數據圖表顯示,提供操做軌跡數據和監控數據的查詢功能,並對異常狀況進行告警。java

Log2Net系列目錄

針對這個組件的數據,相應地有日誌查詢網站,它查詢日誌數據庫的數據(Log2Net組件存儲的日誌數據),顯示各服務器/網站的實時數據圖表顯示,提供操做軌跡數據和監控數據的查詢功能,並對異常狀況進行告警。node

一、日誌組件Log2Net的介紹和使用(附源碼開源地址)linux

二、Log2Net的架構簡介git

三、Log2Net組件代碼詳解程序員

四、Log2Net日誌查詢網站代碼解析github

五、Log2Net部署和運維web

1、爲何要開發這個組件

  也有有園友要問了,如今的日誌組件太多了啊,什麼log4net,ELK,Kafka,Grafana,Graylog、facebook scribe,apache chukwa,cloudera flume等。都是國際大廠或知名組織的開源組件,你又何須重複造輪子呢?數據庫

  確實,這些開源系統不須要代碼開發,且功能強大,支持各類類型(例如文本文本、數據庫、緩存等)的日誌的接入,有圖表等多種展示方式,能實現海量數據的快速查詢,能存儲爲多種類型(例如文本文本、數據庫、緩存、HDFS等),天生的適合分佈式部署。缺點是部署運維較爲複雜,須要較多的插件支持(java、nodejs、ErLang等);這些大都採用開源的java、scala等語言開發,優先應用於linux平臺,咱們不能靈活自由地定製本身的需求,相對咱們.net平臺來講,資料較少開發難度較大,相對咱們的需求來講較爲龐大。log4net組件雖然能夠靈活地應用到.net系統中,但依然不知足咱們的需求。apache

  咱們有衆多的業務系統,爲公司管理、運營、決策等提供詳細詳實可靠的信息支持,但這些系統中有些沒有詳實的日誌記錄,有些日誌分散在各自的系統中,給運維人員、系統管理人員監控系統運行狀況、追溯用戶操做、查詢業務變動等帶來很大的不便,開發/運維人員在系統異常時也不能很好的明白異常的上下文信息,且不能保證開發/運維人員都能方便的登陸生產服務器。

  所以,咱們須要一個集中式的日誌收集系統,監控用戶的操做狀況和服務器運行狀況,對日誌中的關鍵字進行監控,觸發異常時進行報警,協助開發人員查看相關日誌 經過這個日誌系統,咱們能監控和分析系統的用戶習慣和用戶操做,能保障業務穩定運行,提升系統的健壯性和友好性。
  日誌採集分析是由需求驅動,根據某種場景的須要日誌採集,採集的日誌進行鍼對性的分析。通常常見的日誌分析結果應用場景有:
  a、系統審計:對於應用系統,採集操做日誌、業務變動日誌,有利於備查及提供相關安全審計功能。
  b、系統分析:分析系統或者平臺哪些功能是最受歡迎:何時使用最多用戶使用,某個區域、某類用戶使用最多。有利於功能推廣;有利於提高服務器資源從而提升用戶體驗。
  c、自動化運維和故障排查:場景微服務架構的系統或者平臺,對運維投入的要求高,自動化部署和運維,能夠減小運維的工做量和壓力。系統運行環境日誌採集、分析,可實現預警、服務器資源動態調配,有利於快速定位排查故障。
  d、內容推薦:根據用戶日常閱讀內容,採集相關日誌,並經過分析後,將用戶感興趣的內容系統自動推薦給用戶,從而提高用戶站粘性。

  在咱們的系統中,咱們想知道用戶進行了什麼操做,想知道網站的運行狀況(例如在線人數、異常狀況等),想監控服務器的運行狀況(如內存狀況、磁盤使用狀況等),目前沒有一個合適的方案來較好地知足知足咱們的需求。所以,咱們開發了一個日誌組件和一個集中式日誌查詢系統。這個日誌組件能夠自動地收集系統的運行狀況(如服務器內存、磁盤使用、在線人數、平常日誌等),能夠記錄用戶操做狀況等,能夠經過日誌查詢界面顯示各網站/服務器的實時數據圖表顯示,提供操做軌跡數據和監控數據的查詢功能等。

2、Log2net組件使用效果展現

  使用Log2net組件後,能夠將日誌數據以友好的形式展現:顯示各服務器/網站的實時數據圖表顯示,提供操做軌跡數據和監控數據的查詢功能,並對異常狀況進行告警。

1 操做日誌查詢

  操做日誌查詢主要用於按照系統名稱、服務器名稱、時段、日誌類型、關鍵詞等條件查詢操做軌跡類數據,主要以列表數據的形式展現日誌數據。在列表的左側,能夠顯示服務器的概況,如cpu使用率,內存使用率等。在列表的上側,顯示日誌的分類彙總狀況。以下圖所示:

 

2 系統監控 

  系統監控主要監控各服務器和應用網站的狀況,主要以圖形化的方面實時顯示網站/服務器的運行狀況。

  (1)、概況實時顯示:顯示服務器在當前時刻的cpu/內存使用率等狀況;

  (2)、服務器狀態監控:顯示服務器在某時段內的cpu/內存使用率等狀況;

  (3)、系統流量監控:顯示系統在某時段內的在線人數、某頁面的訪問人數等;

  (4)、異常告警:在系統新加入監控或失去監控時音樂告警。

  以下圖所示:

  上圖中,每臺服務器顯示一條曲線圖。由於本人測試的服務器只有一臺,因此只有一個曲線圖。隨着服務器個數的增長,自動添加曲線圖的個數。

      系統代碼參見 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery 。

3、Log2net組件的使用方法

  看了上面炫酷的效果,是否是有點心動了呢,那麼怎麼將其應用到本身的網站中呢?別急,跟我一步一步來。

  PS. 本組件支持.NET4.5~.NetCore2.1,應該能知足絕大多數筒子們的需求了吧,後續會支持.NetCore的更高版本,與.NetCore同步更新。

1 引用組件

  在VS開發工具的nuget中,搜索 Log2Net 組件安裝便可。

  搜索搜索 Log2Net ,log4net出如今第一位,好吧,我認可,名字是參考他們的,也瀏覽了他們的代碼~~

  可是,小主,第二個纔是咱們要安裝的,不要搞錯了哦~~

      你也能夠經過Nuge官網來下載和安裝: https://www.nuget.org/packages/Log2Net/  。但建議使用VS工具的nuget來安裝。

2 組件的註冊

  要使用該組件,須要進行組件的註冊:在應用程序初始化的地方,調用  LogApi.RegisterLogInitMsg(SysCategory sys, object Application, bool bWriteStartLog = true, bool bLogMonitor = true);

  各參數解釋以下: 

  SysCategory sys:業務系統的名稱,在SysCategory枚舉中定義好了。

  object Application:程序的Application對象,用於網站在線人數和歷史訪客統計,僅在.net平臺中使用。netCore中該參數爲null;

  bool bWriteStartLog:是否寫網站啓動的日誌,默認爲true;

  bool bLogMonitor:是否寫系統定時監控日誌,默認爲true。

  通常地,在調用該方法時,只須要設置前兩個參數,後兩個參數能夠不設置。

  在.net平臺中,是 Global.asax 中Application_Start()事件中註冊;

  在.netCore平臺中,是Startup.cs Configure中appLifetime.ApplicationStarted.Register方法中註冊。

  該方法必須被調用,且必須在應用程序初始化事件中調用,不然調用其餘寫日誌的方法時會出錯。

      此時,若您運行網站,則能夠在網站的 App_Data/Log_Files 文件夾下看到txt格式的運行日誌數據。若您須要將日誌記錄到數據庫,則須要進行下述的日誌配置。

3 日誌組件的配置

  本組件默認將日誌數據記錄到網站的 App_Data/Log_Files 文件夾下,格式爲文本文件。若但願將日誌數據記錄到數據庫,則須要進行配置。

        1 基礎配置

 1   <baseCfg>
 2 
 3     <!--日誌級別:1、Off;2、Error;3、Warn; 4、Business ;5、DBRec; 6、Info;7、Debug (默認爲7)-->
 4     <add key="log2NetLevel" value="7" />
 5 
 6     <!--日誌記錄方式:1、寫到文件;2、直接寫到數據庫;3、消息隊列寫到數據庫;-->
 7     <add key="appenderType" value="2" />
 8 
 9     <!--監控日誌每隔多少分鐘記錄一次,若未設置默認爲10分鐘,若小於0則不監控-->
10     <add key="logMonitorIntervalMins" value="1"/>
11 
12     <!--是否將info信息(僅供調試,不記錄到日誌的信息)記錄到本地Debug文件:0不記錄,1記錄(默認爲0)-->
13     <add key="bWriteInfoToDebugFile" value="1"/>
14 
15   </baseCfg>
View Code

       2 文件方式配置

1   <fileCfg>
2     <!--寫文件的路徑(僅在日誌記錄方式爲1時有效)-->
3     <add key = "logToFilePath" value="App_Data/Log_Files"/>
4 
5   </fileCfg>
View Code

  3 數據庫方式配置

 1   <logDBCfg>
 2     <!-- 訪問數據庫的方式:ADONET = 1,  EF = 2,  NH = 3 。默認爲1-->
 3     <add key="DBAccessTypeKey" value="1" />
 4 
 5     <!--trace數據庫的類型:SqlServer = 1,  Oracle = 2, MySql = 3,  Access = 4,   PostgreSQL = 5,  SQLite = 6。默認爲1-->
 6     <add key="UserCfg_TraceDBTypeKey" value="1" />
 7     <!--monitor數據庫的類型:SqlServer = 1,  Oracle = 2, MySql = 3,  Access = 4,   PostgreSQL = 5,  SQLite = 6。默認爲1-->
 8     <add key="UserCfg_MonitorDBTypeKey" value="1" />
 9 
10     <!--trace數據庫的數據庫鏈接字符串name值。默認爲logTraceSqlStr-->
11     <add key="UserCfg_TraceDBConKey" value="logTraceSqlStr" />
12     <!--monitor數據庫的數據庫鏈接字符串name值。默認爲logMonitorSqlStr-->
13     <add key="UserCfg_MonitorDBConKey" value="logMonitorSqlStr" />
14 
15   </logDBCfg>
View Code

  4 oracle數據庫特殊配置

 1   <oracleCfg>
 2     <!--是否使用EF初始化數據庫Trace 表:0不使用,1使用,默認爲0-->
 3     <add key = "initTraceDBWhenOracle" value="0"/>
 4 
 5     <!--是否使用EF初始化數據庫 monitor 表:0不使用,1使用,默認爲0-->
 6     <add key = "initMonitorDBWhenOracle" value="0"/>
 7 
 8     <!--Oracle數據庫驅動方式:0 oracle驅動, 1 微軟驅動,默認爲0-->
 9     <add key = "OracleDriverType" value="0"/>
10   </oracleCfg>
View Code

  5 消息隊列配置

1   <MQCfg>
2     <!--消息隊列服務器(地址、用戶名、密碼)-->
3     <add key="RabbitMQServer_Log" value="localhost:5672;oawxAdmin1;admin123.123"/>
4   </MQCfg>
View Code

  6 InfluxDB數據庫方式配置

1   <InfluxDBCfg>
2 
3     <!--是否須要寫到InfluxDB數據庫(默認爲0)-->
4     <add key="bWriteToInfluxDB" value="0"/>
5 
6     <!--Influxfu服務器的地址,用戶名,密碼-->
7     <add key="InfluxDBServer_Log" value="http://127.0.0.1:8086/;logAdmin;sa123.123"/>
8 
9   </InfluxDBCfg>
View Code

  7 緩存配置

 1   <cacheCfg>
 2     <!--緩存策略:0、NET緩存;1、CacheManager中的NET系統緩存;2、Memcached緩存;3、Redis緩存;默認爲0-->
 3     <add key = "CacheStrategy" value="0"/>
 4 
 5     <!--Memcache緩存服務器-->
 6     <add key = "MemCacheServer" value="127.0.0.1:11211;127.0.0.2:11211"/>
 7 
 8     <!--Redis緩存服務器-->
 9     <add key = "RedisCacheServer" value="127.0.0.1:6379;127.0.0.2:6379"/>
10   </cacheCfg>
View Code

       8 日誌數據庫鏈接字符串配置        

 1   <connectionStrings>
 2     <!--操做軌跡日誌的數據庫(Sql Server)-->
 3     <add name="logTraceSqlStr" connectionString="data source=.;initial catalog=LogTraceW;user id=sa;password=sa123.123;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
 4     <!--系統監控日誌的數據庫(Sql Server)-->
 5     <add name="logMonitorSqlStr" connectionString="data source=.;initial catalog=LogMonitorW;user id=sa;password=sa123.123;MultipleActiveResultSets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
 6 
 7     <!--操做軌跡日誌的數據庫(Oracle)-->
 8     <add name="logTraceSqlStr2" connectionString="User Id=scott;Password=sa123123;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=LogTraceW)))" providerName="Oracle.ManagedDataAccess.Client" />
 9     <!--系統監控日誌的數據庫(Oracle)-->
10     <add name="logMonitorSqlStr2" connectionString="User Id=scott;Password=sa123123;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=LogMonitorW)))" providerName="Oracle.ManagedDataAccess.Client" />
11 
12     <!--操做軌跡日誌的數據庫(MySql)-->
13     <add name="logTraceSqlStr3" connectionString="Data Source=localhost;port=3306;Initial Catalog=LogTraceW;user id=sa;password=sa123123;" providerName="MySql.Data.MySqlClient" />
14     <!--系統監控日誌的數據庫(MySql)-->
15     <add name="logMonitorSqlStr3" connectionString="Data Source=localhost;port=3306;Initial Catalog=LogMonitorW;user id=sa;password=sa123123;" providerName="MySql.Data.MySqlClient" />
16   </connectionStrings>
View Code

  通常地,咱們只須要在基礎配置中配置  日誌記錄方式 appenderType 的值爲 2 (直接寫到數據庫),在數據庫方式中配置訪問數據庫的方式和數據庫類型,最後配置數據庫鏈接字符串便可。若須要使用消息隊列、緩存、InfluxDB等高級特性時,再進行相應配置便可。

  上述1~7的配置,是在單獨的文件中進行配置的。在web.config文件中定義該文件的名稱和類型,並添加第8項的數據庫鏈接字符串配置。

      例如,在web.config文件進行以下配置:

 1 <configSections>
 2 <!--Log2Net模塊聲明-->
 3 <section name="log2netCfg" type="Log2Net.Config.Log2NetConfigurationSectionHandler, Log2Net" />
 4 </configSections>
 5 
 6   <log2netCfg configSource="Log2NetCfg.config" />
 7 
 8 <connectionStrings>
 9 <!--操做軌跡日誌的數據庫(Sql Server)-->
10 <add name="logTraceSqlStr" connectionString="data source=.;initial catalog=LogTraceW;user id=sa;password=sa123.123;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
11 <!--系統監控日誌的數據庫(Sql Server)-->
12 <add name="logMonitorSqlStr" connectionString="data source=.;initial catalog=LogMonitorW;user id=sa;password=sa123.123;MultipleActiveResultSets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
13 
14 </connectionStrings>
View Code

      並在網站中添加 Log2NetCfg.config 文件,在該文件中添加1~7的配置。

      以上配置項,值爲數字,進行了簡單的分組。事實上,您能夠在值的位置填寫名稱。例如   <add key="log2NetLevel" value="debug" />。您能夠隨意分組,隨意明明分組的名稱。例如將 logDBCfg 分組命名爲 log2netDBCfg,將 appenderType加入到該分組中,都是能夠的,只要不改變配置項的名稱,配置項名稱不重複便可。

 

  以上配置介紹,都是基於.net平臺。那麼,在.netCore平臺中,又該如何配置呢?配置方法以下:

      新建Log2NetCfg.json文件,內容以下:

 1 {
 2   "ConnectionStrings": {
 3     "logTraceSqlStr": "Data Source =127.0.0.1;Initial Catalog = LogTraceW;uid=sa;pwd=sa123.123;",
 4     "logMonitorSqlStr": "Data Source =127.0.0.1;Initial Catalog = LogMonitorW;uid=sa;pwd=sa123.123;",
 5     "logTraceSqlStr2": "User Id=scott;Password=sa123123;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=LogTraceW)))",
 6     "logMonitorSqlStr2": "User Id=scott;Password=sa123123;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=LogMonitorW)))",
 7     "logTraceSqlStr3": "Data Source=localhost;port=3306;Initial Catalog=LogTraceW;user id=sa;password=sa123123;",
 8     "logMonitorSqlStr3": "Data Source=localhost;port=3306;Initial Catalog=LogMonitorW;user id=sa;password=sa123123;"
 9   },
10 
11   "baseCfg": {
12     "log2NetLevel": "Info",
13     "appenderType": "2",
14     "logMonitorIntervalMins": "1",
15     "dncSessionTimeoutMins": "20",
16     "bWriteInfoToDebugFile": "0"
17   },
18 
19   "fileCfg": {
20     "logToFilePath": "App_Data/Log_Files"
21   },
22 
23 
24   "logDBCfg": {
25     "DBAccessTypeKey": "2",
26     "UserCfg_TraceDBTypeKey": "1",
27     "UserCfg_MonitorDBTypeKey": "1",
28     "UserCfg_TraceDBConKey": "logTraceSqlStr",
29     "UserCfg_MonitorDBConKey": "logMonitorSqlStr"
30   },
31 
32   "oracleCfg": {
33     "initTraceDBWhenOracle": "0",
34     "initMonitorDBWhenOracle": "0",
35     "OracleDriverType": "0"
36   },
37 
38   "MQCfg": {
39     "RabbitMQServer_Log": "localhost:5672;oawxAdmin1;admin123.123"
40   },
41 
42   "InfluxDBCfg": {
43     "bWriteToInfluxDB": "0",
44     "InfluxDBServer_Log": "http://127.0.0.1:8086/;logAdmin;sa123.123"
45   },
46 
47   "cacheCfg": {
48     "CacheStrategy": "0",
49     "MemCacheServer": "127.0.0.1:11211;127.0.0.2:11211",
50     "RedisCacheServer": "127.0.0.1:6379;127.0.0.2:6379"
51   }
52 }
View Code

  而後在啓動代碼中聲明使用該配置文件:ConfigureAppConfiguration((context, config) =>{config.AddJsonFile("Log2NetCfg.json", false, true);})  。

 

  另外,對於系統的名字,系統中默認的名稱爲Sys字母_兩位數字(SysA_01 ~ SysZ_99)。您能夠經過配置將其映射爲您想要的名稱。例如

1   <userSystemNames>
2     <add key="SysA_01" value="短信接口網站" />
3     <add key="201" value="公司OA系統" />
4     <add key="901" value="用戶數據網站" />
5   </userSystemNames>
View Code

      這個配置項在查詢網站中頗有用。該配置也是在 Log2NetCfg 文件中配置的。

4 .net平臺日誌記錄方法

   (1) 按照上述方法進行組件的註冊、web.config文件和Log2NetCfg.config文件的配置;

  (2)  網站生命週期事件的日誌記錄

日誌記錄的說明

使用位置

方法

網站全局錯誤日誌

Application_Error事件

HandAndWriteException

網站中止日誌

Application_End事件

WriteServerStopLog

在線人數和歷史訪客的增長

Session_Start事件

IncreaseOnlineVisitNum

在線人數的減小

Session_End事件

ReduceOnlineNum

網站啓動後初次訪問

Application_BeginRequest事件

WriteFirstVisitLog

  (3) 在須要進行日誌記錄的位置調用 LogApi.WriteLog ( LogLevel logLevel, params Log_OperateTraceBllEdm[] model)  或  LogApi.WriteLog ( LogLevel logLevel, params LogMonitorEdm[] model)  方法進行操做軌跡日誌或監控日誌的記錄。

  具體使用方法可參考 https://github.com/yuchen1030/Log2Net/tree/master/Log2NetWeb_net45 。

5 .netCore平臺日誌記錄方法

   (1) 按照上述方法進行組件的註冊、Log2NetCfg.json文件的配置和聲明;

  (2) 相關服務配置

      a、在Startup.cs的ConfigureServices方法中,調用LogApi.AddLog2netService(services, Configuration);
      b、在 Startup.cs的Configure中,調用LogApi.AddLog2netConfigure(app, env);

  (3) 在須要進行日誌記錄的位置調用 LogApi.WriteLog ( LogLevel logLevel, params Log_OperateTraceBllEdm[] model)  或  LogApi.WriteLog ( LogLevel logLevel, params LogMonitorEdm[] model)  方法進行操做軌跡日誌或監控日誌的記錄。

  具體使用方法可參考 https://github.com/yuchen1030/Log2Net/tree/master/Log2NetWeb_DNC 。

4、項目開源地址

  本組件已開源,項目地址爲 https://github.com/yuchen1030/Log2Net 。建議使用的VS工具爲VS2017。

  查詢網站亦開源,項目地址爲 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery 。該項目使用ABP+EF框架開發,建議使用VS工具爲VS2017。

    接下來,我會介紹該日誌組件的架構和代碼實現,敬請期待~~

      Over,sleep.

相關文章
相關標籤/搜索