Logstash是一款開源的日誌採集,處理,輸出的軟件,每秒能夠處理數以萬計條數據,能夠同時從多個來源採集數據,轉換數據,而後將數據輸出至本身喜歡的存儲庫中(官方推薦的存儲庫爲Elasticsearch)html
如圖所示logstash的工做機制,數據歷來源進入logstash,進行過濾最後輸出到目標.java
Logstash處理日誌須要藉助於大量的插件來完成.主要有如下三類插件,linux
Input pluginsnginx
Filter pluginsweb
軟件下載連接 https://www.elastic.co/downloads/logstash正則表達式
因爲logstash是java語言開發的,因此須要安裝下jdk, 這裏安裝的logstash爲6.x的版本,官方要求使用java8redis
#安裝jdk,去oracle官網下載jdk tar xvf jdk-8u181-linux-x64.tar.gz -C /usr/java/ #配置java環境變量 vim /etc/profile.d/java.sh #內容以下 JAVA_HOME=/usr/java/jdk1.8.0_181 PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME PATH #加載java的環境變量 source /etc/profile #下載tar.gz安裝包 wgethttps://artifacts.elastic.co/downloads/logstash/logstash-6.4.1.tar.gz tar xvf logstash-6.4.1.tar.gz -C /usr/local/ cd /usr/local/ mv logstash-6.4.1 logstash
#yum方式安裝openjdk yum install java-1.8.0-openjdk #下載logstash rpm 包 #下載頁面,自行下載https://www.elastic.co/downloads/logstash #下載完成後安裝 rpm -ivh logstash-6.4.2.rpm #配置文件目錄 /etc/logstash #執行程序目錄 /usr/share/logstash/bin
#一個簡單的測試示例,獲取標準輸入而且標準輸出 /usr/local/logstash/bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug} }' #等待進程啓動,會有點慢等最底下一行出現Successfully字樣則說明進程啓動成功,此時隨便輸入一些字符串就會被logstash input 獲取到.並根據定義輸出
以配置文件的方式運行,若是是以rpm或yum方式安裝的則配置文件需保存至/etc/logstash/conf.d/目錄下, 若是是二進制 tar.gz zip安裝則本身定義一個目錄來存放配置文件啓動的時候傳入正確的路徑便可sql
vim test.conf # 內容以下 input { file { path =>["/var/log/nginx/access.log"] type =>"nginx" start_position=> "beginning" } } output { stdout { } } # End /usr/local/logstash/bin/logstash -f test.conf
以上兩種方法通常用於調試的時候使用,
通常來講都是寫配置文件來定義logsatsh的數據庫
若是是rpm或yum方式安裝的則直接可使用service來控制程序的啓動關閉等json
# centos 6.x service logstash start chkconfig logstash on # cnetos 7.x systemctl start logstash systemctl enable logstash
若是是二進制方式安裝則需本身編寫sysv或system風格的啓動腳本或者使用nohup命令來啓動
所謂的輸入插件就是支持的數據來源,每個插件就是一種數據來源.目前官方支持輸入插件見官方文檔 https://www.elastic.co/guide/en/logstash/current/input-plugins.html
這裏列出一些經常使用的
插件名稱 | 說明 |
---|---|
beats | 一款輕量級的數據收集引擎,佔用資源較少 |
file | 從文件中讀取數據 |
jdbc | 從數據庫中讀取數據,需寫sql查詢語句 |
kafka | 從kafka消息隊列中消費數據 |
redis | 從redis緩存中取數據 |
log4j | 直接從log4j中獲取數據 |
stdin | 標準輸入獲取數據 |
syslog | 從syslog中獲取數據 |
插件名稱 | 說明 |
---|---|
grok | 能夠將非結構化的數據經過正則表達式處理爲結構化數據 |
geoip | 解析IP地址的經緯度及國家城市名稱等 |
json | 處理原字段是json格式的數據 |
kv | 將字段拆分爲key/value |
date | 解析日期字段,而後使用該日期字段做爲日誌存儲的時間戳 |
mutate | 此插件能夠對字段作出改變 如重命名、刪除、替換和修改等 |
輸出的目標不必定非得是存儲目標,也有多是其餘的接收目標如kafka,redis,
官方文檔 https://www.elastic.co/guide/en/logstash/current/output-plugins.html
插件名稱 | 說明 |
---|---|
elasticsearch | 輸出至elasticsearch存儲 |
file | 輸入至文件存儲 |
Redis | 輸出至redis中 |
Stdout | 標準輸出 |
Hadoop_webhdfs | 輸出至hdfs中 |
處理nginx日誌通常可使用grok、json、split來處理,最爲方便的是json方式,
首先定製nginx日誌爲json格式輸出,然後logstash的filter插件使用json就直接解析處理好日誌格式了.以下
一、定義nginx輸出日誌格式爲json格式
vim /etc/nginx/nginx.conf # 修改替換log_format 配置段 log_format main '{"remote_addr":"$remote_addr",' '"host":"$host",' '"status":"$status",' '"@timestamp":"$time_local",' '"request":"$request",' '"size":$body_bytes_sent,' '"body_bytes_sent":$body_bytes_sent,' '"http_referer": "$http_referer",' '"http_user_agent": "$http_user_agent",' '"http_x_forwarded_for": "$http_x_forwarded_for",' '"uri": "$uri",' '"server_addr": "$server_addr",' '"upstream_response_time": "$upstream_response_time",' '"request_time": "$request_time"' '}'; # End #重啓nginx service nginx restart
二、配置logstash處理及存儲數據
vim /etc/logstash/conf.d/nginx_log.conf # 數據來源爲redis input{ redis { type => "nginx-log" host =>"10.57.1.202" key =>"nginx-log" data_type =>"list" db => 0 } } filter { # 這裏就是使用json 來處理解析數據的配置. 配置很簡單定義源字段直接就能夠了 # 因爲源字段已被解析成N個字段 因此源字段則就不須要存在了, # 主要是爲了節省存儲空間 json { source => "message" remove_field => "message" } # 使用geoip解析IP地址的經緯度及城市信息等,提供地圖位置展現等 # 這裏判斷若是內網地址的話則不作geoip解析處理 #這裏的內網地址是機房及公司內部的IP段 if "10.57.1." not in [remote_addr] and "192.168." not in [remote_addr] { geoip{ source => "remote_addr" target => "geoip" database => "/etc/logstash/geoip/GeoLite2-City.mmdb" } } # 處理接口後面跟的參數,須要的話可將註釋去掉 # kv { # source => "request" # field_split => "&" # value_split => "=" # prefix => "url_args_" # } } output { # 若是是客戶端是內網IP的則存儲在xxx-lan-xxx的索引裏,主要是爲了區份內外網數據 if "10.57.1" in [remote_addr] or "192.168.1" in [remote_addr]{ elasticsearch { hosts => "10.57.1.201" # index這須要注意的是開頭 # 必定要是 logstash才能匹配到es的index模板 # 名稱必須全小寫 index => "logstash-nginx-lan%{+YYYY.MM.dd}" } } # 若是客戶端IP不是內網的則確定就是外網IP了,外網來源的數據則建立索引 *wan* else{ elasticsearch { hosts => "10.57.1.201" index => "logstash-nginx-wan-%{+YYYY.MM.dd}" } } } # End #重啓logstash service logstash restart
三、調試模式的輸出結果
生產環境使用logstash通常狀況不單一使用,大多數場景須要結合緩存、消息隊列、存儲系統、分析展現系統等