1. 程式人生 > >logback,logstash,elasticsearch配置,日誌收集

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