Logstash使用詳解
Logstash引數與配置
Logstash巨集觀的配置檔案內容格式如下:
# 輸入
input {
...
}
# 過濾器
filter {
...
}
# 輸出
output {
...
}
配置檔案參考
input {
# 從檔案讀取日誌資訊
file {
path => "/var/log/error.log"
type => "error"//type是給結果增加一個type屬性,值為"error"的條目
start_position => "beginning"//從開始位置開始讀取
# 使用 multiline 外掛,傳說中的多行合併
codec => multiline {
# 通過正規表示式匹配,具體配置根據自身實際情況而定
pattern => "^\d"
negate => true
what => "previous"
}
}
}
#可配置多種處理規則,他是有順序,所以通用的配置寫下面
# filter {
# grok {
# match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
# }
output {
# 輸出到 elasticsearch
elasticsearch {
hosts => ["192.168.22.41:9200"]
index => "error-%{+YYYY.MM.dd}"//索引名稱
}
}
上面的file可以配置多個:
file {
type => "tms_inbound.log"
path => "/JavaWeb/tms2.wltest.com/logs/tms_inbound.es.*.log"
codec => json {
charset => "UTF-8"
}
}
file {
type => "tms_outbound.log"
path => "/JavaWeb/tms2.wltest.com/logs/tms_outbound.es.*.log"
codec => json {
charset => "UTF-8"
}
}
1. 常用啟動引數
2. 配置檔案結構及語法
-
區段
Logstash通過
{}
來定義區域,區域內可以定義外掛,一個區域內可以定義多個外掛,如下:
input {
stdin {
}
beats {
port => 5044
}
}
- 資料型別
Logstash僅支援少量的資料型別:
Boolean:ssl_enable => true
Number:port => 33
String:name => “Hello world”
Commonts:# this is a comment
- 欄位引用
Logstash資料流中的資料被稱之為Event物件,Event以JSON結構構成,Event的屬性被稱之為欄位,如果你像在配置檔案中引用這些欄位,只需要把欄位的名字寫在中括號[]裡就行了,如[type],對於巢狀欄位每層欄位名稱都寫在[]裡就可以了,比如:[tags][type];除此之外,對於Logstash的arrag型別支援下標與倒序下表,如:[tags][type][0],[tags][type][-1]。
- 條件判斷
Logstash支援下面的操作符:
equality:==, !=, <, >, <=, >=
regexp:=~, !~
inclusion:in, not in
boolean:and, or, nand, xor
unary:!
例如:
if EXPRESSION {
...
} else if EXPRESSION {
...
} else {
...
}
- 環境變數引用
Logstash支援引用系統環境變數,環境變數不存在時可以設定預設值,例如:
export TCP_PORT=12345
input {
tcp {
port => "${TCP_PORT:54321}"
}
}
常用輸入外掛(Input Plug)
1. File讀取外掛
檔案讀取外掛主要用來抓取檔案的變化資訊,將變化資訊封裝成Event程式處理或者傳遞。
- 配置事例
input
file {
path => ["/var/log/*.log", "/var/log/message"]
type => "system"
start_position => "beginning"
}
}
- 常用引數
2. Beats監聽外掛
Beats外掛用於建立監聽服務,接收Filebeat或者其他beat傳送的Events;
- 配置事例
input {
beats {
port => 5044
}
}
- 常用引數(空 => 同上)
3. TCP監聽外掛
TCP外掛有兩種工作模式,“Client”和“Server”,分別用於傳送網路資料和監聽網路資料。
- 配置事例
tcp {
port => 41414
}
- 常用引數(空 => 同上)
4. Redis讀取外掛
用於讀取Redis中快取的資料資訊。
- 最小化配置
input {
redis {
data_type => "list" #logstash redis外掛工作方式
key => "logstash-test-list" #監聽的鍵值
host => "127.0.0.1" #redis地址
port => 6379 #redis埠號
}
}
output {
stdout{}
}
- 詳細配置
input {
redis {
batch_count => 1 #EVAL命令返回的事件數目
data_type => "list" #logstash redis外掛工作方式
key => "logstash-test-list" #監聽的鍵值
host => "127.0.0.1" #redis地址
port => 6379 #redis埠號
password => "123qwe" #如果有安全認證,此項為密碼
db => 0 #redis資料庫的編號
threads => 1 #啟用執行緒數量
}
}
output {
stdout{}
}
5.kafka讀取外掛
用於讀取kafka中快取的資料資訊。
- 配置例項
input {
kafka {
bootstrap_servers => "192.168.1.252:9092" #kafka伺服器地址
topics => "252nginx-accesslog"
batch_size => 5
codec => "json" #寫入的時候使用json編碼,因為logstash收集後會轉換成json格式
group_id => "252nginx-access-log"
consumer_threads => 1
decorate_events => true
}
}
6. Syslog監聽外掛
監聽作業系統syslog資訊
- 配置事例
syslog {
}
- 輸出至螢幕
[root@node1 conf.d]# cat syslog.conf
input{
syslog{
type => "system-syslog"
port => 514
}
}
filter{
}
output{
stdout{
codec => rubydebug
}
}
[root@node1 conf.d]# /opt/logstash/bin/logstash -f syslog.conf
- 修改rsyslog配置檔案
[root@node1 ~]# vim /etc/rsyslog.conf
*.* @@192.168.79.103:514
[root@node1 ~]# systemctl restart rsyslog
- 輸出至es
[root@node1 conf.d]# cat syslog.conf
input{
syslog{
type => "system-syslog"
port => 514
}
}
filter{
}
output{
elasticsearch{
hosts => ["192.168.79.103:9200"]
index => "system-syslog-%{+YYYY.MM}"
}
}
[root@node1 conf.d]# /opt/logstash/bin/logstash -f syslog.conf
常用過濾外掛(Filter plugin)
豐富的過濾器外掛的是 logstash威力如此強大的重要因素,過濾器外掛主要處理流經當前Logstash的事件資訊,可以新增欄位、移除欄位、轉換欄位型別,通過正規表示式切分資料等,也可以根據條件判斷來進行不同的資料處理方式。
1. grok正則捕獲
grok 是Logstash中將非結構化資料解析成結構化資料以便於查詢的最好工具,非常適合解析syslog logs,apache log, mysql log,以及一些其他的web log
預定義表示式呼叫
Logstash提供120個常用正規表示式可供安裝使用,安裝之後你可以通過名稱呼叫它們,語法如下:%{SYNTAX:SEMANTIC}
SYNTAX:表示已經安裝的正規表示式的名稱
SEMANTIC:表示從Event中匹配到的內容的名稱
例如:Event的內容為“[debug] 127.0.0.1 - test log content”,匹配%{IP:client}將獲得“client: 127.0.0.1”的結果,前提安裝了IP表示式;如果你在捕獲資料時想進行資料型別轉換可以使用%{NUMBER:num:int}這種語法,預設情況下,所有的返回結果都是string型別,當前Logstash所支援的轉換型別僅有“int”和“float”;
一個稍微完整一點的事例:
日誌檔案http.log內容:55.3.244.1 GET /index.html 15824 0.043
表示式:%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
配置檔案內容:
input {
file {
path => "/var/log/http.log"
}
}
filter {
grok {
match => {"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
}
}
輸出結果:
client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043
- 自定義表示式呼叫
語法:(?<field_name>the pattern here)
舉例:捕獲10或11和長度的十六進位制queue_id可以使用表示式(?<queue_id>[0-9A-F]{10,11})
- 安裝自定義表示式
與預定義表示式相同,你也可以將自定義的表示式配置到Logstash中,然後就可以像於定義的表示式一樣使用;以下是操作步驟說明:
1、在Logstash根目錄下建立資料夾“patterns”,在“patterns”資料夾中建立檔案“extra”(檔名稱無所謂,可自己選擇有意義的檔名稱);
2、在檔案“extra”中新增表示式,格式:patternName regexp,名稱與表示式之間用空格隔開即可,如下:
# contents of ./patterns/postfix:
POSTFIX_QUEUEID [0-9A-F]{10,11}
3、使用自定義的表示式時需要指定“patterns_dir”變數,變數內容指向表示式檔案所在的目錄,舉例如下:
## 日誌內容 ##
Jan 1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>
## Logstash配置 ##
filter {
grok {
patterns_dir => ["./patterns"]
match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
}
}
## 執行結果 ##
timestamp: Jan 1 06:25:43
logsource: mailserver14
program: postfix/cleanup
pid: 21403
queue_id: BEF25A72965
- grok常用配置引數(空 => 同上)
- 其他
- 一般的正規表示式只能匹配單行文字,如果一個Event的內容為多行,可以在pattern前加“(?m)”
- 對於Hash和Array型別,Hash表示鍵值對,Array表示陣列
- Grok表示式線上debug地址:http://grokdebug.herokuapp.com
- 預定義正規表示式參考地址:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
2. date時間處理外掛
該外掛用於時間欄位的格式轉換,比如將“Apr 17 09:32:01”(MMM dd HH:mm:ss)轉換為“MM-dd HH:mm:ss”。而且通常情況下,Logstash會為自動給Event打上時間戳,但是這個時間戳是Event的處理時間(主要是input接收資料的時間),和日誌記錄時間會存在偏差(主要原因是buffer),我們可以使用此外掛用日誌發生時間替換掉預設是時間戳的值。
- 常用配置引數(空 => 同上)
3. mutate資料修改外掛
mutate 外掛是 Logstash另一個重要外掛。它提供了豐富的基礎型別資料處理能力。可以重新命名,刪除,替換和修改事件中的欄位。
# logstash-filter-mutate 外掛是Logstash 另一個重要外掛,它提供了豐富的基礎型別資料處理能力,包括型別轉換,字串處理和欄位處理等
#1.型別轉換
#型別轉換是logstash-filter-mutate 外掛最初誕生時的唯一功能,
#可以設定的轉換型別包括:"integer","float" 和 "string"。示例如下:
input {
stdin {
}
}
filter {
grok {
match =>{
"message" =>"(?<request_time>\d+(?:\.\d+)?)"
}
}
}
output {
stdout {
codec =>rubydebug
}
}
[elk@Vsftp logstash]$ logstash -f t2.conf
Settings: Default pipeline workers: 4
Pipeline main started
23.45
{
"message" => "23.45",
"@version" => "1",
"@timestamp" => "2017-01-11T02:07:33.581Z",
"host" => "Vsftp",
"request_time" => "23.45"
}
#字串 轉換為float型
[elk@Vsftp logstash]$ cat t2.conf
input {
stdin {
}
}
filter {
grok {
match =>{
"message" =>"(?<request_time>\d+(?:\.\d+)?)"
}
}
mutate {
convert => ["request_time", "float"]
}
}
output {
stdout {
codec =>rubydebug
}
}
[elk@Vsftp logstash]$ logstash -f t2.conf
Settings: Default pipeline workers: 4
Pipeline main started
23.45
{
"message" => "23.45",
"@version" => "1",
"@timestamp" => "2017-01-11T02:10:07.045Z",
"host" => "Vsftp",
#字串轉換成數值型:
[elk@Vsftp logstash]$ cat t2.conf
input {
stdin {
}
}
filter {
grok {
match =>{
"message" =>"(?<request_time>\d+(?:\.\d+)?)"
}
}
mutate {
convert => ["request_time", "integer"]
}
}
output {
stdout {
codec =>rubydebug
}
}
[elk@Vsftp logstash]$ logstash -f t2.conf
Settings: Default pipeline workers: 4
Pipeline main started
23.45
{
"message" => "23.45",
"@version" => "1",
"@timestamp" => "2017-01-11T02:11:21.071Z",
"host" => "Vsftp",
"request_time" => 23
4. JSON外掛
JSON外掛用於解碼JSON格式的字串,一般是一堆日誌資訊中,部分是JSON格式,部分不是的情況下
- 配置事例
json {
source => ...
}
## 事例配置,message是JSON格式的字串:"{\"uid\":3081609001,\"type\":\"signal\"}" ##
filter {
json {
source => "message"
target => "jsoncontent"
}
}
## 輸出結果 ##
{
"@version": "1",
"@timestamp": "2014-11-18T08:11:33.000Z",
"host": "web121.mweibo.tc.sinanode.com",
"message": "{\"uid\":3081609001,\"type\":\"signal\"}",
"jsoncontent": {
"uid": 3081609001,
"type": "signal"
}
}
## 如果從事例配置中刪除`target`,輸出結果如下 ##
{
"@version": "1",
"@timestamp": "2014-11-18T08:11:33.000Z",
"host": "web121.mweibo.tc.sinanode.com",
"message": "{\"uid\":3081609001,\"type\":\"signal\"}",
"uid": 3081609001,
"type": "signal"
}
- 常用配置引數(空 => 同上)
5. elasticsearch查詢過濾外掛
用於查詢Elasticsearch中的事件,可將查詢結果應用於當前事件中
- 常用配置引數(空 => 同上)
6. 其他
還有很多其他有用外掛,如:Split、GeoIP、Ruby,這裡就不一一寫了,等以後用到再補充
常用輸出外掛(Output plugin)
1. ElasticSearch輸出外掛
用於將事件資訊寫入到Elasticsearch中,官方推薦外掛,ELK必備外掛
- 配置事例
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "filebeat-%{type}-%{+yyyy.MM.dd}"
template_overwrite => true
}
}
- 常用配置引數(空 => 同上)
2、Redis輸出外掛
用於將Event寫入Redis中進行快取,通常情況下Logstash的Filter處理比較吃系統資源,複雜的Filter處理會非常耗時,如果Event產生速度比較快,可以使用Redis作為buffer使用
- 配置事例
output {
redis {
host => "127.0.0.1"
port => 6379
data_type => "list"
key => "logstash-list"
}
}
- 常用配置引數(空 => 同上)
3. File輸出外掛
用於將Event輸出到檔案內
- 配置事例
output {
file {
path => ...
codec => line { format => "custom format: %{message}"}
}
}
- 常用配置引數(空 => 同上)
4. TCP外掛
Write events over a TCP socket.Each event json is separated by a newline.Can either accept connections from clients or connect to a server, depending on mode.
- 配置事例
tcp {
host => ...
port => ...
}
- 常用配置引數(空 => 同上)
5.kafka外掛
用於將事件資訊寫入到kafka中
output {
if [type] == "nginx-access" {
kafka {
bootstrap_servers => "192.168.1.252:9092" #kafka伺服器地址
topic_id => "252nginx-accesslog"
batch_size => 5
codec => "json" #寫入的時候使用json編碼,因為logstash收集後會轉換成json格式
}
}
}
常用編碼外掛(Codec plugin)
1. JSON編碼外掛
直接輸入預定義好的 JSON 資料,這樣就可以省略掉 filter/grok 配置
- 配置事例
json { }
- 常用配置引數
Logstash例項
1. 接收Filebeat事件,輸出到Redis
input {
beats {
port => 5044
}
}
output {
redis {
host => "127.0.0.1"
port => 6379
data_type => "list"
key => "logstash-list"
}
}
2. 讀取Redis資料,根據“type”判斷,分別處理,輸出到ES
input {
redis {
host => "127.0.0.1"
port => 6379
data_type => "list"
key => "logstash-list"
}
}
filter {
if [type] == "application" {
grok {
match => ["message", "(?m)-(?<systemName>.+?):(?<logTime>(?>\d\d){1,2}-(?:0?[1-9]|1[0-2])-(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) (?:2[0123]|[01]?[0-9]):(?:[0-5][0-9]):(?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?)) \[(?<level>(\b\w+\b)) *\] (?<thread>(\b\w+\b)) \((?<point>.*?)\) - (?<content>.*)"]
}
date {
match => ["logTime", "yyyy-MM-dd HH:mm:ss,SSS"]
}
json {
source => "message"
}
date {
match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
}
}
if [type] == "application_bizz" {
json {
source => "message"
}
date {
match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
}
}
mutate {
remove_field => ["@version", "beat", "logTime"]
}
}
output {
stdout{
}
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "filebeat-%{type}-%{+yyyy.MM.dd}"
document_type => "%{documentType}"
template_overwrite => true
}
}
Logstash注意事項
- 問題記錄
啟動logstash慢,輸入./bin/logstash沒有反應,多出現在新安裝的作業系統上
- 原因
jruby啟動的時候jdk回去從/dev/random中初始化隨機數熵,新版本的jruby會用RPNG演算法產生隨後的隨機數,但是舊版本的jruby會持續從/dev/random中獲取數字。但是不幸的是,random發生器會跟不上生成速度,所以獲取隨機數的過程會被阻塞,直到隨機數池擁有足夠的熵然後恢復。這在某些系統上,尤其是虛擬化系統,熵數池可能會比較小從而會減慢jruby的啟動速度。
檢查一下系統的熵數池 cat /proc/sys/kernel/random/entropy_avail,正常情況這個數字推薦大於1000,對比了一下獨立主機的這個數值,大約在700-900之間晃悠。
- 解決
使用偽隨機,編輯/usr/local/logstash/logstash-5.4.1/config/jvm.options,在最後增加一行:-Djava.security.egd=file:/dev/urandom
相關文章
- Logstash讀取Kafka資料寫入HDFS詳解Kafka
- ElasticSearch實戰系列七: Logstash實戰使用-圖文講解Elasticsearch
- 從一份定義檔案詳解ELK中Logstash外掛結構
- mydumper使用詳解
- babel使用詳解Babel
- Thymeleaf使用詳解
- NSTimer使用詳解
- SourceInsight使用詳解
- git使用詳解Git
- Jpa使用詳解
- Supervisor使用詳解
- Proxy使用詳解
- LOMBOK使用詳解Lombok
- FastJson使用詳解ASTJSON
- nvm 使用詳解
- mitmproxy使用詳解MIT
- Mat使用詳解
- Android AIDL使用詳解AndroidAI
- LiveData && ViewModel使用詳解LiveDataView
- React Hooks 使用詳解ReactHook
- CMAKE的使用詳解
- Go Modules 詳解使用Go
- MFC——SkinMagic使用詳解
- JWT 完整使用詳解JWT
- Postman 使用教程詳解Postman
- APScheduler的使用詳解
- sed指令使用詳解
- Android BroadcastReceiver使用詳解AndroidAST
- 【譯】LiveData 使用詳解LiveData
- Android Gson使用詳解Android
- oracle oradebug使用詳解Oracle
- Logstash Multiple Pipelines
- ElasticSearch + Logstash + kibanaElasticsearch
- Logstash同步ES
- Flutter之DataTable使用詳解Flutter
- Python中字典使用詳解Python
- chrome devtools使用詳解——PerformanceChromedevORM
- Flutter之MaterialApp使用詳解FlutterAPP