常規的日誌收集方案中Client端都須要額外安裝一個Agent來收集日誌,例如logstash、filebeat等,額外的程序也就意味着環境的複雜,資源的佔用,有沒有一種方式是不須要額外安裝程序就能實現日誌收集呢?Rsyslog就是你要找的答案!mysql
Rsyslog是高速的日誌收集處理服務,它具備高性能、安全可靠和模塊化設計的特色,可以接收來自各類來源的日誌輸入(例如:file,tcp,udp,uxsock等),並經過處理後將結果輸出的不一樣的目的地(例如:mysql,mongodb,elasticsearch,kafka等),每秒處理日誌量可以超過百萬條。linux
Rsyslog做爲syslog的加強升級版本已經在各linux發行版默認安裝了,無需額外安裝。nginx
ELK經過Rsyslog收集日誌流程圖以下: git
rsyslogd -v
命令查看rsyslog版本,若是版本較低則須要升級1.添加rsyslog源的keygithub
# apt-key adv --recv-keys --keyserver keys.gnupg.net AEF0CF8E
複製代碼
2.添加rsyslog源地址redis
echo "deb http://debian.adiscon.com/v8-stable wheezy/" >> /etc/apt/sources.list
echo "deb-src http://debian.adiscon.com/v8-stable wheezy/" >> /etc/apt/sources.list
複製代碼
3.升級rsyslog服務sql
# apt-get update && apt-get -y install rsyslog
複製代碼
1.安裝編譯工具,下邊autoreconf須要用到,否則沒法生成configure文件mongodb
# apt-get -y install pkg-config autoconf automake libtool unzip
複製代碼
2.omkafka須要安裝一堆的依賴包json
# apt-get -y install libdbi-dev libmysqlclient-dev postgresql-client libpq-dev libnet-dev librdkafka-dev libgrok-dev libgrok1 libgrok-dev libpcre3-dev libtokyocabinet-dev libglib2.0-dev libmongo-client-dev libhiredis-dev
# apt-get -y install libestr-dev libfastjson-dev uuid-dev liblogging-stdlog-dev libgcrypt-dev
# apt-get -y install flex bison librdkafka1 librdkafka-dev librdkafka1-dbg
複製代碼
3.編譯安裝omkafka模塊bootstrap
# mkdir tmp && cd tmp
# git init
# git pull git@github.com:VertiPub/omkafka.git
# autoreconf -fvi
# ./configure --sbindir=/usr/sbin --libdir=/usr/lib --enable-omkafka && make && make install && cd ..
複製代碼
log_format jsonlog '{'
'"host": "$host",'
'"server_addr": "$server_addr",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"remote_addr":"$remote_addr",'
'"time_local":"$time_local",'
'"request_method":"$request_method",'
'"request_uri":"$request_uri",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"upstream_addr":"$upstream_addr",'
'"upstream_status":"$upstream_status",'
'"upstream_response_time":"$upstream_response_time",'
'"request_time":$request_time'
'}';
access_log syslog:server=rsyslog.domain.com,facility=local7,tag=nginx_access_log,severity=info jsonlog;
複製代碼
1.Nginx在v1.10以後的版本才支持syslog的方式處理日誌,請確保你的Nginx版本高於1.10
2.爲了下降logstash的處理壓力,同時也爲了下降整個配置的複雜度,咱們nginx的日誌直接採用json格式
3.拋棄文本文件記錄nginx日誌,改用syslog直接將日誌傳輸到遠端的rsyslog服務器,以便咱們後續的處理;這樣作的另外一個很是重要的好處是咱們再也無需考慮nginx日誌的分割和按期刪除問題(通常咱們爲了方便管理一般會採用logrotate服務來對日誌進行按天拆分和按期刪除,以避免磁盤被佔滿)
4.access_log直接輸出到syslog服務,各參數解釋以下:
nginx_access_log
,若是有多個服務同時都寫日誌給rsyslog,且配置了不通的tag,在rsyslog服務端就能夠根據這個tag找出哪些是nginx的日誌# cat /etc/rsyslog.d/rsyslog_nginx_kafka_cluster.conf
module(load="imudp")
input(type="imudp" port="514")
# nginx access log ==> rsyslog server(local) ==> kafka
module(load="omkafka")
template(name="nginxLog" type="string" string="%msg%")
if $inputname == "imudp" then {
if ($programname == "nginx_access_log") then
action(type="omkafka"
template="nginxLog"
broker=["10.82.9.202:9092","10.82.9.203:9092","10.82.9.204:9092"]
topic="rsyslog_nginx"
partitions.auto="on"
confParam=[
"socket.keepalive.enable=true"
]
)
}
:rawmsg, contains, "nginx_access_log" ~
複製代碼
1.在rsyslog.d目錄下添加一個專門處理nginx日誌的配置文件
2.rsyslog配置文件重要配置解釋以下:
imudp
且programname爲nginx_access_log
(就是咱們上邊nginx配置裏邊的tag)以後的處理方式,這裏的配置爲匹配到的日誌經過omkafka模塊寫入kafka集羣,還有一些關於omkafka更詳細的配置參考上邊給出的omkafka模塊官方文檔nginx_access_log
的日誌,沒有這一行的話rsyslog服務默認會把全部日誌都記錄到message裏邊一份,咱們已經把日誌輸出到kafka了,本地就不必再記錄了3.omkafka模塊檢查kafka裏邊topic是否存在,若是不存在則建立,無需手動建立kafka的topic
input {
kafka {
bootstrap_servers => "10.82.9.202:9092,10.82.9.203:9092,10.82.9.204:9092"
topics => ["rsyslog_nginx"]
}
}
filter {
mutate {
gsub => ["message", "\\x", "\\\x"]
}
json {
source => "message"
}
date {
match => ["time_local","dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["10.82.9.205", "10.82.9.206", "10.82.9.207"]
index => "rsyslog-nginx-%{+YYYY.MM.dd}"
}
}
複製代碼
重要配置參數解釋以下:
\\x
,否則json格式會報錯配置完成後分別重啓rsyslog服務和nginx服務,訪問nginx產生日誌
1.查看kafka是否有正常生成topic
# bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181
__consumer_offsets
rsyslog_nginx
複製代碼
2.查看topic是否能正常接收日誌
# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic rsyslog_nginx
{"host": "domain.com","server_addr": "172.17.0.2","http_x_forwarded_for":"58.52.198.68","remote_addr":"10.120.89.84","time_local":"28/Aug/2018:14:26:00 +0800","request_method":"GET","request_uri":"/","status":200,"body_bytes_sent":1461,"http_referer":"-","http_user_agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36","upstream_addr":"-","upstream_status":"-","upstream_response_time":"-","request_time":0.000}
複製代碼
3.kibana添加index,查看Elasticsearch中是否有數據,若是前兩步都正常,kibana搜不到index或index沒有數據,多半是index名字寫錯了之類的基礎問題,仔細檢查
打開Kibana添加rsyslog-nginx-*
的Index,並選擇timestamp,建立Index Pattern
進入Discover頁面,能夠很直觀的看到各個時間點請求量的變化,根據左側Field實現簡單過濾,例如咱們想查看全部訪問狀態爲404的uri,能夠點擊request_uri和status後邊的add,這兩項的內容將出如今右側,而後點擊status下邊404狀態碼後邊的加號,則只查看狀態爲404的請求,點擊上方auto-refresh能夠設置頁面自動刷新時間
經過各類條件的組合查詢能夠實現各類各樣的需求,例如每秒請求、帶寬佔用、異常比例、慢響應、TOP IP、TOP URL等等各類狀況,而且能夠經過Visualize很方便的將這些信息繪製圖標,生成Dashboard保存
若是你以爲文章對你有幫助,請轉發分享給更多的人。若是你以爲讀的不盡興,推薦閱讀如下文章: