【實戰】Logstash 探討


一、環境搭建

    § 192.168.196.58/...(windows8):Logstash : Shipper
    § 192.168.1.192(windows7):Redis : Broker
   § 192.168.196.154(windows7):Lostash : Indexer, ES : Storage&Search, Kibana : Web Interface
 
 
二、ftp實例 log文件讀取
一、 Logstash : Shipper(192.168.1.192(windows7))
 
input {  
file {
        path => "D:\File\logs\test.log"  #日志文件路徑
         type => "ftp_log"                          #類型
start_position => "beginning"     #文件讀取開始位置
     }
output {   
stdout{ }     
redis {
     host => "192.168.1.192"   #redis服務器地址 
     port => 6379                    #redis對應端口
     data_type => "list"           #數據類型
     key => "ftp"                     #名稱列表或通道 
   }
* start_position
logstash 從什么位置開始讀取文件數據,默認是結束位置,也就是說 logstash 進程會以類似 `tail -F` 的形式運行。如果你是要導入原有數據,把這個設定改成 "beginning",logstash 進程就從頭開始讀取,有點類似 `cat`,但是讀到最后一行不會終止,而是繼續變成 `tail -F`
 
二、Redis : Broker(192.168.1.192(windows7))
Redis 服務器是 logstash 官方推薦的 broker 選擇。
redis:在這里做一個緩存的機制,logstash shipper將log轉發到redis(只做隊列處理不做存儲)。Logstash indexer從redis中讀取數據並轉發給elasticsearch。 這里加上redis是為了提高Logstash shipper的日志提交到Logstash indexer的速度,同時避免由於突然斷電等導致的數據的丟失。
官網下載你需要的Redis壓縮包解壓
把這個文件夾復制到其它地方,比如D:\redis 目錄下。
打開一個cmd窗口  使用cd命令切換目錄到d:\redis  運行 redis-server.exe redis.conf  
這樣Redis就開始運行了
 
三、Logstash : indexer(192.168.196.154(windows7))
input {
  redis {
    host => "192.168.1.192"
    data_type => "list"
    key => "ftp"
  }
}
output {
file {
         path => "D:\File\logs\%{+yyyy-MM-dd}\%{+HH}\%{host}.log.gz"          #新建日志文件壓縮包
         message_format => "%{message} %{host} %{path} "                              #截取數據
         gzip => true                                                                                           #寫入磁盤之前用GZIP輸出流
     }
   elasticsearch {
    host => "192.168.196.154"  
port =>9300
index=>"ftp_log-%{+YYYY-MM-dd}"                                                    #索引名字
   }
}
 
gzip 格式是一個非常奇特而友好的格式。其格式包括有:
* 10字節的頭,包含幻數、版本號以及時間戳
* 可選的擴展頭,如原文件名
* 文件體,包括DEFLATE壓縮的數據
* 8字節的尾注,包括CRC-32校驗和以及未壓縮的原始數據長度
這樣 gzip 就可以一段一段的識別出來數據 —— **反過來說,也就是可以一段一段壓縮了添加在后面!**
 
三、Log4j實例
一、 Logstash : Shipper(192.168.196.58(windows8))
 
input {
log4j {
mode => "server"
host => "192.168.196.58"
port => 56789
type => "log4j_log"
}
}
output {   
stdout { codec => rubydebug }  
redis {
     host => "192.168.196.154"
port => 6379    
     data_type => "list"
     key => "log4j"
   }
}  
 
Log4j配置文件
# logstash
log4j.appender.logstash=org.apache.log4j.net.SocketAppender
log4j.appender.logstash.port=56789
log4j.appender.logstash.remoteHost=192.168.196.58
log4j.rootLogger=DEBUG,Stdout,File,logstash
 
 
 
log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.ConversionPattern=[%d{HH:mm:ss}] %-5p [%C] (%F:%L) - %m%n
 
log4j.appender.File=org.apache.log4j.RollingFileAppender
log4j.appender.File.File=F:\\File\\logs\\test.log
log4j.appender.File.MaxFileSize=1024KB
log4j.appender.File.layout=org.apache.log4j.PatternLayout 
log4j.appender.File.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}: %r] %-5p [%t] ( %F,%L ) - %m%n
 
二、Redis :  Broker(192.168.1.192(windows7))
在這里做一個緩存的機制
打開一個cmd窗口  使用cd命令切換目錄到d:\redis  運行 redis-server.exe redis.conf  
 
 
三、Logstash : indexer(192.168.196.154(windows7))
input {
  redis {
    host => "192.168.1.192"
    data_type => "list"
    key => "log4j"
    codec => json
  }
}
output {
file {
         path => "D:\File\logs\%{+yyyy-MM-dd}\%{+HH}\log4j.log.gz"    #新建日志文件壓縮包
         message_format => "%{message} %{host} %{path} "                          #截取數據信息
         gzip => true                                                                                           #Gzip the output stream before writing to disk
                                                                                                                                #( 寫入磁盤之前GZIP輸出流)
     }
   elasticsearch {
    host => "192.168.196.154"  
port =>9300
index=>"log4j_log-%{+YYYY-MM-dd}"                                                    #索引名字
   }
}
 
 
四、探討
 
一、 時區問題的解釋
 @timestamp 比我們早了 8 個小時?怎么修改成北京時間?
Elasticsearch 內部,對時間類型字段,是統一采用 UTC 時間,存成 long 長整形數據的!對日志統一采用 UTC 時間存儲,是國際安全/運維界的一個通識。
對於頁面查看,ELK 的解決方案是在 Kibana 上,讀取瀏覽器的當前時區,然后在頁面上轉換時間內容的顯示。
建議接受這種設定。否則,即便用 `.getLocalTime` 修改,也還要面臨在 Kibana 上反過去修改,以及 Elasticsearch 原有的 `["now-1h" TO "now"]` 這種方便的搜索語句無法正常使用。
 
二、日志文件讀取時遺漏問題
Logstash 使用一個名叫 FileWatch的 Ruby Gem 庫來監聽文件變化。這個庫支持 glob 展開文件路徑,而且會記錄一個叫 .sincedb的數據庫文件來跟蹤被監聽的日志文件的當前讀取位置。所以,不要擔心 logstash 會漏過你的數據。
sincedb 文件中記錄了每個被監聽的文件的 inode, major number, minor number 和 pos。
 
三、Redis對內存的需求
Redis 服務器通常都是用作 NoSQL 數據庫,不過 logstash 只是用來做消息隊列。所以不要擔心 logstash 里的 Redis 會撐爆你的內存和磁盤。
 
四、Logstash內部es
 logstash 進程內部運行一個**內嵌**的 elasticsearch 服務器。內嵌服務器默認會在 `$PWD/data` 目錄里存儲索引。如果想變更這些配置,在 `$PWD/elasticsearch.yml` 文件里寫自定義配置即可,logstash 會嘗試自動加載這個文件。
 
五、性能測試
shipper(logstash)+broker(redis)+indexer(logstash)+Storage&Search(es)
192.168.196.58           192.168.1.192                            192.168.196.154
日志文件中有10000條日志,從shipper到es展示用時1分鍾左右,每秒160條左右


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM