【实战】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`
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 就可以一段一段的识别出来数据 —— **反过来说,也就是可以一段一段压缩了添加在后面!**
* 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 个小时?怎么修改成北京时间?
@timestamp 比我们早了 8 个小时?怎么修改成北京时间?
Elasticsearch 内部,对时间类型字段,是统一采用 UTC 时间,存成 long 长整形数据的!对日志统一采用 UTC 时间存储,是国际安全/运维界的一个通识。
对于页面查看,ELK 的解决方案是在 Kibana 上,读取浏览器的当前时区,然后在页面上转换时间内容的显示。
建议接受这种设定。否则,即便用 `.getLocalTime` 修改,也还要面临在 Kibana 上反过去修改,以及 Elasticsearch 原有的 `["now-1h" TO "now"]` 这种方便的搜索语句无法正常使用。
建议接受这种设定。否则,即便用 `.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条左右