Log2Net是一個用於收集日志到數據庫或文件的組件,支持.NET和.NetCore平台。 此組件自動收集系統的運行日志(服務器運行情況、在線人數等)、異常日志。程序員還可以添加自定義日志。 該組件支持.NET平台和.NETCore平台,支持將日志寫入到文本文件、SQL Server、Oracle、MySQL,可以方便地擴展到其他數據庫。
針對這個組件的數據,相應地有日志查詢網站,它查詢日志數據庫的數據(Log2Net組件存儲的日志數據),顯示各服務器/網站的實時數據圖表顯示,提供操作軌跡數據和監控數據的查詢功能,並對異常情況進行告警。
Log2Net系列目錄
一、為什么要開發這個組件
也有有園友要問了,現在的日志組件太多了啊,什么log4net,ELK,Kafka,Grafana,Graylog、facebook scribe,apache chukwa,cloudera flume等。都是國際大廠或知名組織的開源組件,你又何必重復造輪子呢?
確實,這些開源系統不需要代碼開發,且功能強大,支持各種類型(例如文本文本、數據庫、緩存等)的日志的接入,有圖表等多種展現方式,能實現海量數據的快速查詢,能存儲為多種類型(例如文本文本、數據庫、緩存、HDFS等),天生的適合分布式部署。缺點是部署運維較為復雜,需要較多的插件支持(java、nodejs、ErLang等);這些大都采用開源的java、scala等語言開發,優先應用於linux平台,我們不能靈活自由地定制自己的需求,相對我們.net平台來說,資料較少開發難度較大,相對我們的需求來說較為龐大。log4net組件雖然可以靈活地應用到.net系統中,但依然不滿足我們的需求。
我們有眾多的業務系統,為公司管理、運營、決策等提供詳細詳實可靠的信息支持,但這些系統中有些沒有詳實的日志記錄,有些日志分散在各自的系統中,給運維人員、系統管理人員監控系統運行情況、追溯用戶操作、查詢業務變更等帶來很大的不便,開發/運維人員在系統異常時也不能很好的明白異常的上下文信息,且不能保證開發/運維人員都能方便的登錄生產服務器。
因此,我們需要一個集中式的日志收集系統,監控用戶的操作情況和服務器運行情況,對日志中的關鍵字進行監控,觸發異常時進行報警,協助開發人員查看相關日志 通過這個日志系統,我們能監控和分析系統的用戶習慣和用戶操作,能保障業務穩定運行,提高系統的健壯性和友好性。
日志采集分析是由需求驅動,根據某種場景的需要日志采集,采集的日志進行針對性的分析。一般常見的日志分析結果應用場景有:
a、系統審計:對於應用系統,采集操作日志、業務變更日志,有利於備查及提供相關安全審計功能。
b、系統分析:分析系統或者平台哪些功能是最受歡迎:什么時候使用最多用戶使用,某個區域、某類用戶使用最多。有利於功能推廣;有利於提升服務器資源從而提高用戶體驗。
c、自動化運維和故障排查:場景微服務架構的系統或者平台,對運維投入的要求高,自動化部署和運維,可以減少運維的工作量和壓力。系統運行環境日志采集、分析,可實現預警、服務器資源動態調配,有利於快速定位排查故障。
d、內容推薦:根據用戶平常閱讀內容,采集相關日志,並通過分析后,將用戶感興趣的內容系統自動推薦給用戶,從而提升用戶站粘性。
在我們的系統中,我們想知道用戶進行了什么操作,想知道網站的運行情況(例如在線人數、異常情況等),想監控服務器的運行情況(如內存情況、磁盤使用情況等),目前沒有一個合適的方案來較好地滿足滿足我們的需求。因此,我們開發了一個日志組件和一個集中式日志查詢系統。這個日志組件可以自動地收集系統的運行情況(如服務器內存、磁盤使用、在線人數、日常日志等),可以記錄用戶操作情況等,可以通過日志查詢界面顯示各網站/服務器的實時數據圖表顯示,提供操作軌跡數據和監控數據的查詢功能等。
二、Log2net組件使用效果展示
使用Log2net組件后,可以將日志數據以友好的形式展示:顯示各服務器/網站的實時數據圖表顯示,提供操作軌跡數據和監控數據的查詢功能,並對異常情況進行告警。
1 操作日志查詢
操作日志查詢主要用於按照系統名稱、服務器名稱、時段、日志類型、關鍵詞等條件查詢操作軌跡類數據,主要以列表數據的形式展示日志數據。在列表的左側,可以顯示服務器的概況,如cpu使用率,內存使用率等。在列表的上側,顯示日志的分類匯總情況。如下圖所示:
2 系統監控
系統監控主要監控各服務器和應用網站的情況,主要以圖形化的方面實時顯示網站/服務器的運行情況。
(1)、概況實時顯示:顯示服務器在當前時刻的cpu/內存使用率等情況;
(2)、服務器狀態監控:顯示服務器在某時段內的cpu/內存使用率等情況;
(3)、系統流量監控:顯示系統在某時段內的在線人數、某頁面的訪問人數等;
(4)、異常告警:在系統新加入監控或失去監控時音樂告警。
如下圖所示:
上圖中,每台服務器顯示一條曲線圖。因為本人測試的服務器只有一台,所以只有一個曲線圖。隨着服務器個數的增加,自動添加曲線圖的個數。
系統代碼參見 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery 。
三、Log2net組件的使用方法
看了上面炫酷的效果,是不是有點心動了呢,那么怎么將其應用到自己的網站中呢?別急,跟我一步一步來。
PS. 本組件支持.NET4.5~.NetCore3.0,應該能滿足絕大多數筒子們的需求了吧。若微軟更新了.NetCore平台,稍后會添加對該平台的支持,盡量做到與.NetCore同步更新。
1 引用組件
在VS開發工具的nuget中,搜索 Log2Net 組件安裝即可。
搜索搜索 Log2Net ,log4net出現在第一位,好吧,我承認,名字是參考他們的,也瀏覽了他們的代碼~~
但是,小主,第二個才是我們要安裝的,不要搞錯了哦~~
你也可以通過Nuge官網來下載和安裝: https://www.nuget.org/packages/Log2Net/ 。但建議使用VS工具的nuget來安裝。
2 組件的注冊
要使用該組件,需要進行組件的注冊:在應用程序初始化的地方,調用 LogApi.RegisterLogInitMsg(SysCategory sys, object applicationObj = null, UserCfg userConfig = null, Dictionary<SysCategory, string> webAppName = null, bool bWriteStartLog = true, bool bLogMonitor = true);
各參數解釋如下:
SysCategory sys:業務系統的名稱,在SysCategory枚舉中定義好了。
object Application:程序的Application對象,用於網站在線人數和歷史訪客統計,僅在.net平台中使用。netCore中該參數為null;
UserCfg userConfig:用戶在代碼中進行的配置;若定義了此參數的值,則可以不使用Log2NetCfg.config配置文件;
Dictionary<SysCategory, string> webAppName:用戶對網站名稱的個性化定義;
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、通過隊列寫到數據庫;4、消息隊列寫到數據庫;默認為1--> 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 <!--是否使用代碼中的數據庫連接字符串--> 16 <add key="ConnectStrIsInCode" value="0" /> 17 18 </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 <userSystemNames> 2 <add key="SysA_01" value="短信接口網站" /> 3 <add key="201" value="公司OA系統" /> 4 <add key="901" value="用戶數據網站" /> 5 </userSystemNames>
9 WebConfig總體配置

1 <configSections> 2 <!--Log2Net模塊聲明--> 3 <section name="log2netCfg" type="Log2Net.Config.Log2NetConfigurationSectionHandler, Log2Net" /> 4 </configSections> 5 6 <log2netCfg configSource="Log2NetCfg.config" /> 7 <appSettings> 8 <!--你自己代碼中需要的配置--> 9 10 <!--Log2Net模塊的section名稱--> 11 <add key="log2netCfgSectionName" value="log2netCfg" /> 12 <!--使用哪里的配置:File = 1,使用文件中的配置;Code = 2,使用代碼中的配置;MixF = 3,混合使用,沖突時使用文件中的配置;MixC = 4,混合使用,沖突時使用代碼中的配置--> 13 <add key="ConfigInWhere" value="4" /> 14 </appSettings>
10 日志數據庫連接字符串配置

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 的值為 3 (通過隊列寫到數據庫),在數據庫方式中配置訪問數據庫的方式和數據庫類型,最后配置數據庫連接字符串即可。若需要使用消息隊列、緩存、InfluxDB等高級特性時,再進行相應配置即可。
上述1~8的配置,是在單獨的文件中進行配置的。是在哪個文件中配置的呢?在配置9的log2netCfg configSource配置中指定,默認為Log2NetCfg.config文件。
在第9項配置中,聲明了Log2Net模塊,定義了配置文件文件名,定義了section name,定義了使用哪里的配置。該配置項中的section name 的值必須跟 Log2NetCfg.config 中的根節點保持一致。本組件中默認section name為 log2netCfg。
第10項配置是日志數據庫的連接字符串配置,注意其name要跟第3項配置UserCfg_TraceDBConKey、 UserCfg_MonitorDBConKey中指定的名稱一致。
例如,在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 <appSettings> 9 <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 10 <!--Log2Net模塊的section名稱--> 11 <add key="log2netCfgSectionName" value="log2netCfg" /> 12 <!--使用哪里的配置:File = 1,使用文件中的配置;Code = 2,使用代碼中的配置;MixF = 3,混合使用,沖突時使用文件中的配置;MixC = 4,混合使用,沖突時使用代碼中的配置--> 13 <add key="ConfigInWhere" value="4" /> 14 </appSettings> 15 16 <connectionStrings> 17 <!--操作軌跡日志的數據庫(Sql Server)--> 18 <add name="logTraceSqlStr" connectionString="data source=.;initial catalog=LogTraceW;user id=sa;password=sa123.123;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" /> 19 <!--系統監控日志的數據庫(Sql Server)--> 20 <add name="logMonitorSqlStr" connectionString="data source=.;initial catalog=LogMonitorW;user id=sa;password=sa123.123;MultipleActiveResultSets=True;application name=EntityFramework" providerName="System.Data.SqlClient" /> 21 22 </connectionStrings>
並在網站中添加 Log2NetCfg.config 文件,在該文件中添加1~8的配置。
以上配置項,值為數字,進行了簡單的分組。事實上,您可以在值的位置填寫名稱。例如 <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 "ConfigInWhere": 3, 12 13 "userSystemNames": { 14 "SysA_01": "短信接口網站", 15 "201": "公司OA系統", 16 "901": "用戶數據網站", 17 "902": "my web" 18 }, 19 20 "baseCfg": { 21 "log2NetLevel": "Info", 22 "appenderType": "2", 23 "logMonitorIntervalMins": "1", 24 "dncSessionTimeoutMins": "20", 25 "bWriteInfoToDebugFile": "0" 26 }, 27 28 "fileCfg": { 29 "logToFilePath": "App_Data/Log_Files" 30 }, 31 32 33 "logDBCfg": { 34 "DBAccessTypeKey": "2", 35 "UserCfg_TraceDBTypeKey": "1", 36 "UserCfg_MonitorDBTypeKey": "1", 37 "UserCfg_TraceDBConKey": "logTraceSqlStr", 38 "UserCfg_MonitorDBConKey": "logMonitorSqlStr", 39 "ConnectStrIsInCode": "0" 40 }, 41 42 "oracleCfg": { 43 "initTraceDBWhenOracle": "0", 44 "initMonitorDBWhenOracle": "0", 45 "OracleDriverType": "0" 46 }, 47 48 "MQCfg": { 49 "RabbitMQServer_Log": "localhost:5672;oawxAdmin1;admin123.123" 50 }, 51 52 "InfluxDBCfg": { 53 "bWriteToInfluxDB": "0", 54 "InfluxDBServer_Log": "http://127.0.0.1:8086/;logAdmin;sa123.123" 55 }, 56 57 "cacheCfg": { 58 "CacheStrategy": "0", 59 "MemCacheServer": "127.0.0.1:11211;127.0.0.2:11211", 60 "RedisCacheServer": "127.0.0.1:6379;127.0.0.2:6379" 61 } 62 }
然后在啟動代碼中聲明使用該配置文件: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 文件中配置的。
看了這么多配置,也許你早不耐煩了,我的鍋,但沒辦法,考慮到個性化,確實需要這么多配置。但一般地,我們只需要在基礎配置中配置 日志記錄方式 appenderType 的值為 (例如為3:通過隊列寫到數據庫),在數據庫方式中配置訪問數據庫的方式和數據庫類型,最后配置數據庫連接字符串。其他的配置不予配置。不予配置的值將會采用系統默認配置。LgWG.LogQuery項目中就是這種配置方法。
若您確實需要進行個性化配置,您也可以采用在代碼中進行配置:方法是在初始化方法LogApi.RegisterLogInitMsg中傳入UserCfg userConfig參數的值,並設置ConfigInWhere的值為2即可。
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 LogTraceEdm[] model) 或 LogApi.WriteLog ( LogLevel logLevel, params LogMonitorEdm[] model) 方法進行操作軌跡日志或監控日志的記錄。你也可以將LogTraceEdm中除UserId、UserName之外的參數封裝起來,UserId、UserName從你業務系統的基類中獲取,簡化LogApi.WriteLog的操作。
具體使用方法可參考 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 LogTraceEdm[] model) 或 LogApi.WriteLog ( LogLevel logLevel, params LogMonitorEdm[] model) 方法進行操作軌跡日志或監控日志的記錄。你也可以將LogTraceEdm中除UserId、UserName之外的參數封裝起來,UserId、UserName從你業務系統的基類中獲取,簡化LogApi.WriteLog的操作。
具體使用方法可參考 https://github.com/yuchen1030/Log2Net/tree/master/Log2NetWeb_DNC 。
四、項目開源地址
本組件已開源,項目地址為 https://github.com/yuchen1030/Log2Net 。建議使用的VS工具為VS2017。當然,如果你只是使用該組件,隨便你使用VS2012,VS2013,VS2015等工具。
查詢網站亦開源,項目地址為 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery 。該項目使用ABP+EF框架開發,建議使用VS工具為VS2017。
接下來,我會介紹該日志組件的架構和代碼實現,敬請期待~~
Over,sleep.