这里记录Logstash配置中注意的事项:

整个配置文件分为三部分:input,filter,output。参考这里的介绍 https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html

1 在Windows中,文件路径中分隔符要使用/而不是\。如果使用了\,那么*匹配将会失败。

2 默认的@timestamp是使用UTC时间表示的,所以对于北京时间会有8小时差,我们很多情况会使用日期来做type区分日志,这时有个办法是在filter中增加ruby来做转换。其实是新加了一个属性来表示日期。

另外有个选项是在date中有timezone的属性,但是如果设置它为UTC,那么整个日志中的时间就是UTC时间了,不是一个理想的做法。

下面是一个配置解释

2016-5-5更新:

#整个配置文件分为三部分:input,filter,output
#参考这里的介绍 https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
input {
#file可以多次使用,也可以只写一个file而设置它的path属性配置多个文件实现多文件监控
file {
#type是给结果增加了一个属性叫type值为"<xxx>"的条目。这里的type,对应了ES中index中的type,即如果输入ES时,没有指定type,那么这里的type将作为ES中index的type。
type => "apache-access"
path => "/apphome/ptc/Windchill_10.0/Apache/logs/access_log*"
#start_position可以设置为beginning或者end,beginning表示从头开始读取文件,end表示读取最新的,这个也要和ignore_older一起使用。
start_position => beginning
#sincedb_path表示文件读取进度的记录,每行表示一个文件,每行有两个数字,第一个表示文件的inode,第二个表示文件读取到的位置(byteoffset)。默认为$HOME/.sincedb*
sincedb_path => "/opt/logstash-2.3.1/sincedb_path/access_progress"
#ignore_older表示了针对多久的文件进行监控,默认一天,单位为秒,可以自己定制,比如默认只读取一天内被修改的文件。
ignore_older =>
#add_field增加属性。这里使用了${HOSTNAME},即本机的环境变量,如果要使用本机的环境变量,那么需要在启动命令上加--alow-env。
add_field => {"log_hostname"=>"${HOSTNAME}"}
#这个值默认是\n 换行符,如果设置为空"",那么后果是每个字符代表一个event
delimiter => ""
#这个表示关闭超过(默认)3600秒后追踪文件。这个对于multiline来说特别有用。... 这个参数和logstash对文件的读取方式有关,两种方式read tail,如果是read
close_older =>
coodec => multiline {
pattern => "^\s"
#这个negate是否定的意思,意思跟pattern相反,也就是不满足patter的意思。
# negate => ""
#what有两个值可选 previous和next,举例说明,java的异常从第二行以空格开始,这里就可以pattern匹配空格开始,what设置为previous意思是空格开头这行跟上一行属于同一event。另一个例子,有时候一条命令太长,当以\结尾时表示这行属于跟下一行属于同一event,这时需要使用negate=>true,what=>'next'。
what => "previous"
auto_flush_interval =>
}
}
file {
type => "methodserver-log"
path => "/apphome/ptc/Windchill_10.0/Windchill/logs/MethodServer-1604221021-32380.log"
start_position => beginning
sincedb_path => "/opt/logstash-2.3.1/sincedb_path/methodserver_process"
# ignore_older =>
}
}
filter{
#执行ruby程序,下面例子是将日期转化为字符串赋予daytag
ruby {
code => "event['daytag'] = event.timestamp.time.localtime.strftime('%Y-%m-%d')"
}
# if [path] =~ "access" {} else if [path] =~ "methodserver" {} else if [path] =~ "servermanager" {} else {} 注意语句结构
if [path] =~ "MethodServer" { #z这里的=~是匹配正则表达式
grok {
patterns_dir => ["/opt/logstash-2.3.1/patterns"] #自定义正则匹配
# Tue // ::: TP-Processor2: hirecode---->77LS
match => { "message" => "%{DAY:log_weekday} %{DATE_US:log_date} %{TIME:log_time}: %{GREEDYDATA:log_data}"}
}
#mutage是做转换用的
mutate {
replace => { "type" => "apache" } #替换属性值
convert => { #类型转换
"bytes" => "integer" #例如还有float
"duration" => "integer"
"state" => "integer"
}
#date主要是用来处理文件内容中的日期的。内容中读取的是字符串,通过date将它转换为@timestamp。参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html#plugins-filters-date-match
# date {
# match => [ "logTime" , "dd/MMM/yyyy:HH:mm:ss Z" ]
# }
}else if [type] in ['tbg_qas','mbg_pre'] { # if ... else if ... else if ... else结构
}else {
drop{} # 将event丢弃
}
}
output {
stdout{ codec=>rubydebug} # 直接输出,调试用起来方便
# 输出到redis
redis {
host => '10.120.20.208'
data_type => 'list'
key => '10.99.201.34:access_log_2016-04'
}
# 输出到ES
elasticsearch {
hosts =>"192.168.0.15:9200"
index => "%{sysid}_%{type}"
document_type => "%{daytag}"
}
}

下面是两个真实的例子,第一个是从应用到redis,第二个是从redis到ES。

input {
file {
type => "log_raw_data"
path => "/apphome/ptc/Windchill_10.0/Windchill/logs/gc/*GC.log"
start_position => end
sincedb_path => "/opt/logstash-2.3.1/sincedb_path/log_progress"
# ignore_older =>
add_field => {"sysid"=>"tbg_qas"}
}
file {
type => "log_raw_data"
path => ["/apphome/ptc/Windchill_10.0/Windchill/logs/*MethodServer*.log","/apphome/ptc/Windchill_10.0/Windchill/logs/ServerManager-*.log"]
start_position => end
sincedb_path => "/opt/logstash-2.3.1/sincedb_path/log_progress"
# ignore_older =>
add_field => {"sysid"=>"tbg_qas"}
close_older =>
codec => multiline {
# patterns_dir => ["D:/app/logstash-2.3.1/patterns"]
pattern => "^%{DAY} %{DATESTAMP}:"
negate => true
what => "previous"
# auto_flush_interval =>
}
}
}
output {
# stdout{ codec=>rubydebug}
redis {
host => '10.120.20.208'
data_type => 'list'
key => 'log_raw_data'
}
redis {
host => '10.120.31.142'
data_type => 'list'
key => 'log_raw_data'
}
}
input {
redis {
host => "localhost"
data_type => "list"
port => ""
key => "log_raw_data"
type => "redis-input"
}
}
filter{
ruby {
code => "event['daytag'] = event.timestamp.time.localtime.strftime('%Y-%m-%d')"
}
if [path] =~ "access" {
grok {
match => { "message" => "%{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:username} \[%{HTTPDATE:logtime}\] \"%{WORD:verb} %{NOTSPACE:request} (?:%{NOTSPACE:httpversion}|)\" (?:%{NUMBER:state}|-) (?:%{NUMBER:bytes}|-) %{NUMBER:duration}"}
}
mutate {
replace => { "type" => "apache" }
convert => {
"bytes" => "integer"
"duration" => "integer"
"state" => "integer"
}
}
date {
match => [ "logtime" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}else if [path] =~ ".*ServerManager.*GC\.log" {
if [message] =~ "\[Full GC" {
grok {
match => {"message" => "%{TIMESTAMP_ISO8601:logtime}: %{GREEDYDATA:gcdetail} \[Times: user=%{BASE10NUM:usertime} sys=%{BASE10NUM:systime}, real=%{BASE10NUM:realtime} secs\]"}
}
date {
match => ["logtime" , "yyyy-MM-dd'T'HH:mm:ss.SSS'+0800'"]
}
}else if [message] =~ "\[GC" {
grok {
match => {"message" => "%{TIMESTAMP_ISO8601:logtime}: %{GREEDYDATA:gcdetail} \[Times: user=%{BASE10NUM:usertime} sys=%{BASE10NUM:systime}, real=%{BASE10NUM:realtime} secs\]"}
}
date {
match => ["logtime" , "yyyy-MM-dd'T'HH:mm:ss.SSS'+0800'"]
}
}else{
drop {}
}
mutate {
replace => {"type" => "smgc" }
convert => {
"usertime" => "float"
"systime" => "float"
"realtime" => "float"
}
}
}else if [path] =~ ".*MethodServer.*GC\.log" {
if [message] =~ "\[Full GC" {
grok {
match => {"message" => "%{TIMESTAMP_ISO8601:logtime}: %{GREEDYDATA:gcdetail} \[Times: user=%{BASE10NUM:usertime} sys=%{BASE10NUM:systime}, real=%{BASE10NUM:realtime} secs\]"}
}
date {
match => ["logtime" , "yyyy-MM-dd'T'HH:mm:ss.SSS'+0800'"]
}
}else if [message] =~ "\[GC" {
grok {
match => {"message" => "%{TIMESTAMP_ISO8601:logtime}: %{GREEDYDATA:gcdetail} \[Times: user=%{BASE10NUM:usertime} sys=%{BASE10NUM:systime}, real=%{BASE10NUM:realtime} secs\]"}
}
date {
match => ["logtime" , "yyyy-MM-dd'T'HH:mm:ss.SSS'+0800'"]
}
}else{
drop {}
}
mutate {
replace => {"type" => "msgc" }
convert => {
"usertime" => "float"
"systime" => "float"
"realtime" => "float"
}
}
}else if [path] =~ "MethodServer" {
grok {
match => { "message" => "%{DAY:weekday} %{DATESTAMP:logtime}: %{GREEDYDATA:logdata}"}
}
date {
match => [ "logtime" , "M/d/yy HH:mm:ss" ]
}
mutate { replace => { "type" => "ms" } }
}else if [path] =~ "ServerManager" {
grok {
match => { "message" => "%{DAY:weekday} %{DATESTAMP:logtime}: %{GREEDYDATA:logdata}"}
}
date {
match => [ "logtime" , "M/d/yy HH:mm:ss" ]
}
mutate { replace => { "type" => "sm" } }
}else if [path] =~ "Process_Archive" {
grok {
patterns_dir => ["/opt/logstash-2.3.1/patterns"]
match => { "message" => "%{PROCESS_DATETIME:logtime} %{GREEDYDATA:logdata}"}
}
date {
match => [ "logtime" , "yyyy MMM dd HH:mm:ss:SSS 'GMT +8'" ]
}
mutate { replace => { "type" => "prc_arc" } }
}else if [path] =~ "ESISAPAdapterConfiguration" {
grok {
patterns_dir => ["/opt/logstash-2.3.1/patterns"]
match => { "message" => "%{PROCESS_DATETIME:logtime} %{GREEDYDATA:logdata}"}
}
date {
match => [ "logtime" , "yyyy MMM dd HH:mm:ss:SSS 'GMT +8'" ]
}
mutate { replace => { "type" => "esi_adp" } }
}else if [path] =~ "LenovoAdapterConfiguration" {
grok {
patterns_dir => ["/opt/logstash-2.3.1/patterns"]
match => { "message" => "%{PROCESS_DATETIME:logtime} %{GREEDYDATA:logdata}"}
}
date {
match => [ "logtime" , "yyyy MMM dd HH:mm:ss:SSS 'GMT +8'" ]
}
mutate { replace => { "type" => "le_adp" } }
}else {
mutate { replace => { "type" => "other" } }
# drop {}
}
# extractnumbers {
# source => "duration"
# }
}
output {
# stdout{ codec=>rubydebug}
elasticsearch {
hosts =>"192.168.0.15:9200"
index => "%{sysid}_%{type}"
document_type => "%{daytag}"
}
}

Logstash配置总结和实例的更多相关文章

  1. Logstash配置安装

    logstash配置 http.host: xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.username:"l ...

  2. LogStash配置、使用(三)

    LogStash配置 官方文档:https://www.elastic.co/guide/en/logstash/current/index.html 查看yum安装路径 rpm -ql logsta ...

  3. CentOS 配置防火墙操作实例(启、停、开、闭端口):

    CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作命令: 查询防火墙状态: [root@localhost ~]# service   iptables status< ...

  4. logstash 配置 logstash-forwarder (前名称:lumberjack)

    logstash-forwarder(曾名lumberjack)是一个用go语言写的日志发送端, 主要是为一些机器性能不足,有性能强迫症的患者准备的. 主要功能: 通过配置的信任关系,把被监控机器的日 ...

  5. CentOS 配置防火墙操作实例(启、停、开、闭端口)CentOS Linux-FTP/对外开放端口(接口)TomCat相关

    链接地址:http://blog.csdn.net/jemlee2002/article/details/7042991 CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作 ...

  6. 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法

    Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法    获取Class类实例的方法:   类名.class   实例名.getClass()   Class.forNam ...

  7. 【ASP.NET Core快速入门】(五)命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options

    命令行配置 我们通过vs2017创建一个控制台项目CommandLineSample 可以看到现在项目以来的是dotnet core framework 我们需要吧asp.net core引用进来,我 ...

  8. CentOS配置防火墙操作实例

    CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作命令: 查询防火墙状态: [root@localhost ~]# service iptables status<回 ...

  9. HAProxy详解(二):HAProxy基础配置与应用实例

    一.HAProxy基础配置与应用实例: 1.快速安装HAProxy集群软件: HAProxy的官网: https://www.haproxy.org/#down下载HAProxy的源码包. 安装: [ ...

随机推荐

  1. Hadoop之MapReduce学习笔记(一)

    主要内容:mapreduce整体工作机制介绍:wordcont的编写(map逻辑 和 reduce逻辑)与提交集群运行:调度平台yarn的快速理解以及yarn集群的安装与启动. 1.mapreduce ...

  2. Prism之初识

    首先,简单地介绍说一下单一应用程序与复合应用程序. 一.单一应用程序 看看上面这张图片,假如我们当前的需求是实现主界面如图所示.如果将其构建成具有用户控件的传统 WPF 应用程序,首先应构建一个顶层窗 ...

  3. 裸函数naked解析

    先分享一个案例: #include <stdio.h> __declspec(naked) void Test() { int x; x = ; __asm ret; } int main ...

  4. nasm 与 masm语法区别

    看到一篇文章,是介绍nasm语法的:http://blog.csdn.net/hitop0609/article/details/4329454 masm是微软专门为windows下汇编而写的,而na ...

  5. C++ std::thread

    std::thread Defined in header class thread The class thread represents a single thread of execution. ...

  6. jQuery绑定事件的四種方式

    这篇文章主要介绍的是jQuery绑定事件的四种方式相关内容,下面我们就与大家一起分享. jQuery绑定事件的四种方式 jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点 ...

  7. 机器学习—集成学习(GBDT)

    一.原理部分: 图片形式~ 二.sklearn实现: 可以看看这个:https://blog.csdn.net/han_xiaoyang/article/details/52663170 1.分类: ...

  8. SQL Server触发器的基本使用

    sqlserver_SQL触发器的使用及语法(转自:百度文库) 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程 ...

  9. 关于 Kafka offset

    查询topic的offset的范围 用下面命令可以查询到topic:Mytopic broker:SparkMaster:9092的offset的最小值: bin/kafka-run-class.sh ...

  10. 使用Intellij Idea连接Team Foundation Server (TFS)实现代码版本管理

    Intellij Idea是一个Java项目开发工具,支持Windows,MAC OS和Linux的跨平台开发环境,具备良好和智能的用户界面,在欧洲市场拥有很多粉丝.https://www.jetbr ...