Log2Net是一個用於收集日誌到數據庫或文件的組件,支持.NET和.NetCore平臺。 此組件自動收集系統的運行日誌(服務器運行狀況、在線人數等)、異常日誌。程序員還能夠添加自定義日誌。 該組件支持.NET平臺和.NETCore平臺,支持將日誌寫入到文本文件、SQL Server、Oracle、MySQL,能夠方便地擴展到其餘數據庫。html
針對這個組件的數據,相應地有日誌查詢網站,它查詢日誌數據庫的數據(Log2Net組件存儲的日誌數據),顯示各服務器/網站的實時數據圖表顯示,提供操做軌跡數據和監控數據的查詢功能,並對異常狀況進行告警。java
針對這個組件的數據,相應地有日誌查詢網站,它查詢日誌數據庫的數據(Log2Net組件存儲的日誌數據),顯示各服務器/網站的實時數據圖表顯示,提供操做軌跡數據和監控數據的查詢功能,並對異常狀況進行告警。node
一、日誌組件Log2Net的介紹和使用(附源碼開源地址)linux
二、Log2Net的架構簡介git
三、Log2Net組件代碼詳解程序員
四、Log2Net日誌查詢網站代碼解析github
五、Log2Net部署和運維web
也有有園友要問了,如今的日誌組件太多了啊,什麼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、內容推薦:根據用戶日常閱讀內容,採集相關日誌,並經過分析後,將用戶感興趣的內容系統自動推薦給用戶,從而提高用戶站粘性。
在咱們的系統中,咱們想知道用戶進行了什麼操做,想知道網站的運行狀況(例如在線人數、異常狀況等),想監控服務器的運行狀況(如內存狀況、磁盤使用狀況等),目前沒有一個合適的方案來較好地知足知足咱們的需求。所以,咱們開發了一個日誌組件和一個集中式日誌查詢系統。這個日誌組件能夠自動地收集系統的運行狀況(如服務器內存、磁盤使用、在線人數、平常日誌等),能夠記錄用戶操做狀況等,能夠經過日誌查詢界面顯示各網站/服務器的實時數據圖表顯示,提供操做軌跡數據和監控數據的查詢功能等。
使用Log2net組件後,能夠將日誌數據以友好的形式展現:顯示各服務器/網站的實時數據圖表顯示,提供操做軌跡數據和監控數據的查詢功能,並對異常狀況進行告警。
操做日誌查詢主要用於按照系統名稱、服務器名稱、時段、日誌類型、關鍵詞等條件查詢操做軌跡類數據,主要以列表數據的形式展現日誌數據。在列表的左側,能夠顯示服務器的概況,如cpu使用率,內存使用率等。在列表的上側,顯示日誌的分類彙總狀況。以下圖所示:
系統監控主要監控各服務器和應用網站的狀況,主要以圖形化的方面實時顯示網站/服務器的運行狀況。
(1)、概況實時顯示:顯示服務器在當前時刻的cpu/內存使用率等狀況;
(2)、服務器狀態監控:顯示服務器在某時段內的cpu/內存使用率等狀況;
(3)、系統流量監控:顯示系統在某時段內的在線人數、某頁面的訪問人數等;
(4)、異常告警:在系統新加入監控或失去監控時音樂告警。
以下圖所示:
上圖中,每臺服務器顯示一條曲線圖。由於本人測試的服務器只有一臺,因此只有一個曲線圖。隨着服務器個數的增長,自動添加曲線圖的個數。
系統代碼參見 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery 。
看了上面炫酷的效果,是否是有點心動了呢,那麼怎麼將其應用到本身的網站中呢?別急,跟我一步一步來。
PS. 本組件支持.NET4.5~.NetCore2.1,應該能知足絕大多數筒子們的需求了吧,後續會支持.NetCore的更高版本,與.NetCore同步更新。
在VS開發工具的nuget中,搜索 Log2Net 組件安裝便可。
搜索搜索 Log2Net ,log4net出如今第一位,好吧,我認可,名字是參考他們的,也瀏覽了他們的代碼~~
可是,小主,第二個纔是咱們要安裝的,不要搞錯了哦~~
你也能夠經過Nuge官網來下載和安裝: https://www.nuget.org/packages/Log2Net/ 。但建議使用VS工具的nuget來安裝。
要使用該組件,須要進行組件的註冊:在應用程序初始化的地方,調用 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格式的運行日誌數據。若您須要將日誌記錄到數據庫,則須要進行下述的日誌配置。
本組件默認將日誌數據記錄到網站的 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>
2 文件方式配置
1 <fileCfg> 2 <!--寫文件的路徑(僅在日誌記錄方式爲1時有效)--> 3 <add key = "logToFilePath" value="App_Data/Log_Files"/> 4 5 </fileCfg>
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>
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>
5 消息隊列配置
1 <MQCfg> 2 <!--消息隊列服務器(地址、用戶名、密碼)--> 3 <add key="RabbitMQServer_Log" value="localhost:5672;oawxAdmin1;admin123.123"/> 4 </MQCfg>
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>
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>
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>
通常地,咱們只須要在基礎配置中配置 日誌記錄方式 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>
並在網站中添加 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 }
而後在啓動代碼中聲明使用該配置文件: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>
這個配置項在查詢網站中頗有用。該配置也是在 Log2NetCfg 文件中配置的。
(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 。
(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 。
本組件已開源,項目地址爲 https://github.com/yuchen1030/Log2Net 。建議使用的VS工具爲VS2017。
查詢網站亦開源,項目地址爲 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery 。該項目使用ABP+EF框架開發,建議使用VS工具爲VS2017。
接下來,我會介紹該日誌組件的架構和代碼實現,敬請期待~~
Over,sleep.