日志在軟件系統中的重要性我在此也不贅述了,幾乎所有程序員每天都會更日志打交道。 那么你是否曾今為這樣的一些事情而困擾過:
- 遠程登錄到不同的服務器,找到應用程序目然后查看應用日志;
- 來回切換於不同服務器並使用tail來實時監控日志輸出信息;
- 解決在各個服務器上各個應用日積月累生成的大量日志文件造成的磁盤空間不足的問題;
如果在你的系統中存在着很多個不同的進程並且運行在多個服務器上,上面的問題將會顯得尤為突出。很不幸是,筆者所在的公司的系統中,有數十個windows服務,控制台程序,計划任務同時工作在多個服務器上。 因此,筆者不勝其擾,終於開始尋找日志集中管理的解決方案。 幸運的是,一款開源的日志服務器軟件 LogMaster4Net 剛好滿足需求,而且正好支持筆者公司系統采用的日志組件log4net。 經過一段時間的使用,LogMaster4Net已在筆者公司穩定運行了超過半年時間。 筆者公司的日志從此規整,監控系統運行情況也比以前方便很多,查詢系統運行問題也更迅速。
下面介紹一下LogMaster4Net的使用方法:
下載安裝
下載地址: https://github.com/kerryjiang/LogMaster4Net/releases/tag/0.1
配置端口: 打開根目錄配置文件(SuperSocket.SocketService.exe.config)設置端口號(默認為2020)
<server name="LogMasterServer" ... port="[port]" ... </server>
安裝Windows服務: 命令行運行如下指令,安裝成功后,如發現服務未啟動請在服務列表里找到服務LogMaster4NetService並啟動
SuperSocket.SocketService.exe -i
將應用程序的log4net配置文件復制到LogMaster4Net目錄
LogMaster4Net可直接使用應用的日志配置文件。應用日志如有文件生成,請注意文件保存路徑。 應用配置文件應存放於LogMaster4Net的Config文件夾, 相對路徑如下:
\Config\log4net.[LogAppName].Config
[LogAppName] 為應用在LogMaster4Net中的唯一名稱,將會在后面設置中使用。
如果 [LogAppName] 為 "QueryApp", 那么此應用的日志配置文件名為:
\Config\log4net.QueryApp.Config
此應用的日志配置內容可為:
<?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name="infoAppender" type="log4net.Appender.RollingFileAppender"> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="INFO" /> </filter> <file value="AppLogs\SampleApp\info.log" /> <encoding value="utf-8"/> <preserveLogFileNameExtension value="true" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="infoAppender" /> </root> </log4net>
應用程序日志轉發設置
使用log4net的UdpAppender轉發日志:
<appender name="udpAppender" type="log4net.Appender.UdpAppender"> <remoteAddress value="[ServerAddress]" /> <remotePort value="[port]" /> <layout type="log4net.Layout.XmlLayout"> <locationInfo value="true" /> </layout> </appender>
- [ServerAddress]: LogMaster4Net服務安裝運行的地址
- [Port]: LogMaster4Net服務監聽的端口號;
設置日志全局變量"LogAppName":
log4net.GlobalContext.Properties["LogAppName"] = "QueryApp";
此處LogAppName即為上步所述應用在LogMaster4Net中的唯一名稱"QueryApp"。
完成上述步驟之后,編譯運行應用程序,日志便會轉發到LogMaster4Net上並按照應用的日志的配置進行處理。
LogMaster4Net的優勢與缺點
優勢如下:
- 簡單: 直接使用現有日志組件的特性,無需額外開發;
- 透明: 仍使用原應用的配置進行處理,如同在應用本地處理日志一樣;
- 靈活: 靈活的配置策略: 基於SuperSocket的配置允許LogMaster4Net監聽多個IP和端口,甚至能允許你運行多個LogMaster4Net服務器實例;
- 跨平台: 二進制級別的兼容Unix/Linux (通過Mono); (http://docs.supersocket.net/v1-6/zh-CN/Run-SuperSocket-in-Linux-Unix)
缺點:
- 缺乏相應的日志輔助工具,如dashboard, archive; 如需更多高級功能,需要配合其它工具使用;
展望
當今軟件江湖,雲計算(PaaS),應用容器(Docker), 微服務等技術(概念)越來越應用廣泛。為了追求更好的可靠性,穩定性,易維護性,將來會有更多的系統是以多進程,多實例的方式運行。如此一來,作為軟件系統中的基礎部件,日志的集中管理將會是一個公共話題。 相關的最佳實踐,開源項目也將不斷涌現。
傳說中的Splunk很好很強大,但是不便宜。 不是所有公司(中國公司)願意在日志上投入那么多錢。 LogMaster4Net作為其中一個開源軟件只是完成了一小步,但對於一些要求不高,技術實力有限的中小IT企業也已經足夠。不過還好,LogMaster4Net推出的時間很短,是一個十分年輕的開源項目,如果大家對它有啥建議,不妨直接聯系其作者。相信LogMaster4Net在未來的幾年里會有不錯的發展。