logback,logstash,elasticsearch配置,日誌收集
看了很多網上的其他部落格,感覺這配置上的坑好多,一天下來踩了很多坑,我寫這篇部落格就是為了防止大家繼續掉坑裡用的。廢話不多說,我們進入正題。
(java環境自己之前配置好,這我就不講了,接下去碰到的172.30.194.180這個地址是我內網測試伺服器的ip地址,你們改為自己的機器ip或者域名即可)
1.logstash的安裝:
wget https://download.elastic.co/logstash/logstash/logstash-2.2.0.tar.gz
tar zxvf logstash-2.2.0.tar.gz
(我們這裡用的logstash和接下去的elasticsearch都用的2.2.0版本)
進入logstash的根目錄下面:
啟動logstash:
bin/logstash -e 'input { stdin { } } output { stdout {} }'
然後命令列輸入一些字串:
hello
2017-04-21T02:32:57.582Z 172_30_194_180 hello
看到上面按照日誌格式輸出的內容就說明logstash執行成功了。
接下去我們換種輸出方式試驗下:
bin/logstash -e 'input { stdin { } } output { stdout {codec => rubydebug } }'
繼續輸入一些字串:
jetty { "message" => "jetty", "@version" => "1", "@timestamp" => "2017-04-21T02:36:01.834Z", "host" => "172_30_194_180" }
看到結果輸出的格式已經不一樣了。接下去我們安裝elasticsearch
2.elasticsearch的安裝:
wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.2.0/elasticsearch-2.2.0.zip
unzip elasticsearch-2.2.0.zip
下載後在elasticsearch(下面簡稱es)根目錄下啟動
./bin/elasticsearch
發現報錯了,是因為es不允許root許可權啟動,我們新增一個使用者:
#新增一個使用者:elasticsearch
$useradd elasticsearch
#給使用者elasticsearch設定密碼,連續輸入2次
$passwd elasticsearch
#建立一個使用者組 es
groupadd es
#分配 elasticsearch 到 es 組
usermod -G elasticsearch es
#這裡注意下,如果提示使用者“es”不存在,那麼是因為伺服器版本問題,你可以換成 usermod -G es elasticsearch ,也就是使用者和使用者組對調一下使用。
#在elasticsearch 根目錄下,給定使用者許可權。-R表示逐級(N層目錄) , * 表示 任何檔案
chown -R elasticsearch.es *
#切換到elasticsearch使用者
su elasticsearch
如果不按上面的給使用者elasticearch分配許可權目錄。那麼會報下面的錯。
java.io.FileNotFoundException: /home/es/elasticsearch-2.2.0/logs/elasticsearch.log (Permission denied)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.(FileOutputStream.java:221)
at java.io.FileOutputStream.(FileOutputStream.java:142)
at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514)
at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:440)
at org.elasticsearch.common.logging.log4j.LogConfigurator.configure(LogConfigurator.java:128)
at org.elasticsearch.bootstrap.Bootstrap.setupLogging(Bootstrap.java:204)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:258)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
log4j:ERROR Either File or DatePattern options are not set for appender [file].
log4j:ERROR setFile(null,true) call failed.
修改配置檔案:
$ vi config/elasticsearch.yml
#cluster name
cluster.name: sojson-application
#節點名稱
node.name: node-1
#繫結IP和埠
network.host: 172.30.194.180
http.port: 9200
安裝head外掛。
進入
$ cd elasticsearch/bin
$ ./plugin install mobz/elasticsearch-head
啟動es
./bin/elasticsearch
再訪問http://172.30.194.180:9200/_plugin/head/
如下圖就對了。
3.java程式碼中logback配置
首先我們引入maven依賴:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.7</version>
</dependency>
並且引入下面這些提前應該要有的依賴:
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.2</version>
<scope>compile</scope>
</dependency>
在logback.xml檔案中新增一個appender:
<!--logstash-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>172.30.194.180:9250</destination>
<!-- encoder必須配置,有多種可選 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
加入到需要監控的logger中:
<!-- logstash-->
<logger name="com.qccr.nebula.biz.facade.FileUploadFacadeImpl" level="INFO">
<appender-ref ref="LOGSTASH"/>
</logger>
專案需要改的就這麼多,然後我們在logstash剛才的安裝根目錄下,bin下面建立一個配置檔案
vim bin/logstash.conf
input {
tcp {
##host:port就是上面appender中的 destination,這裡其實把logstash作為服務,開啟9250埠接收logback發出的訊息
host => "172.30.194.180"
port => 9250
#模式選擇為server
mode => "server"
tags => ["tags"]
##格式json
codec => json_lines
}
}
output {
stdout { codec => rubydebug }
#這裡是es的地址
elasticsearch { hosts => "172.30.194.180:9200" }
}
儲存以後,在bin下面以配置檔案方式啟動logstash
./logstash -f logstash.conf
剛才的es應該被你關了,所以也要去es的根目錄下面啟動下es
./bin/elasticsearch
4.測試
接下去在java中寫個測試用例,我們這邊用結合spring專案做得測試,你們可以自己寫,但需要把logback的配置用進去,切記
這裡只是為了用log打出“imptest”,執行一下測試用例,跑完,確定沒有錯誤以後,進es的head外掛檢視,發現日誌已經記錄進去了,完工了
(若head外掛沒裝,我們可以通過輸入下面指令檢視es結果)
curl http://172.30.194.180:9200/_search?pretty
參考文章:
http://blog.csdn.net/cj2580/article/details/52416044
http://www.sojson.com/blog/81.html
http://www.jianshu.com/p/db2196991a00