前言:
前兩天在查找如何擴展log4net的日志格式時找到一個開源項目Log4net.NoSql,它通過擴展Appender實現了把日志輸出到ElasticSearch裡面。順籐摸瓜,發現涉及的項目還挺多,於是打算學習一下,記錄在此。
項目一句話簡介,詳情點擊鏈接去項目主頁查看,最後提供打包下載:
1. log4net.nosql
A collection of log4net Appenders to NoSQL data stores. Currently only ElasticSearch is supported.
Uses RESTSharp to communicate with the ElasticSearch REST Api and contains a custom Layout, which makes use of the RESTSharp JSON Serializer to convert the LoggingEvent into JSON.
2.RestSharp
Simple REST and HTTP API Client for .NET
3.Curl
curl是利用URL語法在命令行方式下工作的開源文件傳輸工具。
4.elasticsearch
Elasticsearch is a distributed RESTful search engine built for the cloud.
5.elasticsearch-head
A web front end for an Elasticsearch cluster
部署說明:
我這裡是把es和log4net分開部署到兩台機器的,因為es需要jdk,我不想在開發機上安裝,所以把es裝到xp的虛擬機上了。log4net.nosql是擴展了log4net的Layout實現了json格式的日志輸出,然後擴展了Appender通過調用RestSharp把數據發送給es。Log4net的配置文件如下:
<appender name="Elastic1" type="log4net.NoSql.Appender.ElasticSearchAppender, log4net.NoSql"> <Host value="192.168.66.90" /> <Port value="9200" /> <Index value="logs" /> <DocumentType value="apps" /> <layout type="log4net.NoSql.Layout.JsonLayout,log4net.NoSql" /> </appender>
在插入日志之前,需要先在es裡建立索引,nosql提供了一個腳步log4net.NoSql-master\scripts\create_indices.bat:
curl -XDELETE localhost:9200/logs echo "" curl -XPOST localhost:9200/logs -d '{ "_all" : {"enabled" : true}, "settings" : { "number_of_shards" : 1 }, "mappings" : { "apps":{ "_timestamp" : { "enabled" : true, "store" : true }, "_ttl" : { "enabled" : true, "store" : true, "default" : "5000" } } } }'
可惜存在幾個問題:
1.window下默認沒有curl運行環境
解決方法:下載一個curl-7.17.0-win32-nossl文件,把curl.exe放到script目錄下
2.命令行下切換目錄到script目錄,運行create_indices.bat報錯。
解決方法:通過錯誤信息可以看到把每一行的開頭字符當做命令了,所以改成curl -XPOST localhost:9200/logs -d '{後面的換行去掉}'
3.再次運行還是報錯,大致意思就是 ''' 不能解析。
解決方法:把-d後面和最後的單引號改成雙引號。
下面是整理後的部署步驟:
1.xp,安裝jdk配置JAVA_HOME環境變量
2.xp,運行兩個es實例,然後運行es-head,如下圖:
es路徑:..\elasticsearch-1.1.1\bin\elasticsearch.bat
head路徑:..\elasticsearch-head-master\index.html
在這裡遇到兩個問題:
a.我兩台機器都設置了代理,默認情況下我是訪問不到192.168.66.90機器,所以去ES裡查詢不到日志記錄。如何調試查看寫入是否成功呢?
修改\log4net.NoSql-master\log4net.NoSql\Util\ElasticSearchClient.cs 38行,把返回值輸出:
//dont care about response as if it fails should not throw any exceptions _restClient.ExecuteAsync(request, response => { Debug.WriteLine(response.ToString()); });
b.寫入日志成功後ES裡還是查詢不到數據。
在新建logs索引時指定了超時時間為5秒,所以電腦一卡5秒過去了,去es裡就查詢不到數據了。
結束語:
前幾天在園子裡看了 黑客馬拉松,裡面的一句話“軟件開發聽上去高大上,但實際很簡單,全部活動可以分為兩類:造輪子,搭積木。”感覺很精辟,所以才開始了這次的搭積木過程。每個項目都是了解皮毛,以後會抽時間仔細研究研究源碼。這麼簡單的組合一下就可以解決項目中分布式日志記錄和查詢的需求,事半功倍。ES是基於luceuce的搜索引擎,加上分詞插件,還有更多的應用場景可以去使用。
參考鏈接:
1.curl 命令使用http://www.cnblogs.com/wangkangluo1/archive/2012/04/17/2453975.html
2.ElasticSearch 初次使用小結,一起學習進步哈~http://ruby-china.org/topics/15337
3.ElasticSearch入門筆記http://www.qwolf.com/?p=1387
4. 分布式搜索elasticsearch集群管理工具headhttp://blog.csdn.net/laigood/article/details/8193758
5.使用RestSharp 庫消費Restful Servicehttp://www.cnblogs.com/shanyou/archive/2012/01/27/RestSharp.html