logstash常用配置文件总结

目录

logstash配置文件示例

输入input

filebeat

标准输入(屏幕)

读取文件(File)

读取网络数据(TCP)

读取mysql

处理filter

基础知识

if使用

Grok 正则捕获

时间处理(Date)

数据修改(Mutate)(重要)

变量增减

类型转换

字符串处理

gsub(替换)

split(分割)

join(合并)

merge(合并数组)

rename

update

replace

执行次序

输出output

mysql写入

标准输出(Stdout)

保存成文件(File)


logstash配置文件示例
 

input {
    beats {
        port => "5011"
    }
}
filter {
        
        if  "include" in [tags]  {
            mutate{
                split => ["message","123"]
                add_field => {
                    "beforeinclude" => "%{[message][0]}"
                }
            }
            mutate{
                gsub => ["beforeinclude", ",", ""]
            }
            mutate{
                add_field => {
                    "StandardizedMessage" => "%{beforeinclude}123%{[message][1]}"
                }
            }
        }
        
        if  "include" in [tags] or "exclude" in [tags]{
            #分割“
            mutate{
                add_field => {
                    "StandardizedMessage2" => "%{StandardizedMessage}"
                }                
            }
            mutate{
                #貌似不能用双引号分割
                gsub => ["StandardizedMessage2", "\"", "||"]
            }
            mutate{
                split => ["StandardizedMessage2","||"]    
                add_field => {
                    "PAGE" => "%{[StandardizedMessage2][3]}"
                }
                                    
            }    
            mutate{
                split => ["StandardizedMessage"," "]
                
                add_field => {
                    "URL" => "%{[StandardizedMessage][7]}"
                }                
                add_field => {
                    "INFO" => "%{[StandardizedMessage][0]}"
                }                            
            }
            mutate{
                gsub => ["INFO", "\"", ""]
            }                                
            truncate {
                fields => [ "URL" ]
                length_bytes => 1000
            }
            grok {
                match => { "message" => "%{HTTPDATE:requesttimestamp}" }
            }
            mutate{
                add_field => {
                    "tem1" => "%{requesttimestamp}"
                }
                remove_field => [ "requesttimestamp" ]
            }
            date{
                match=>["tem1","dd/MMM/yyyy:HH:mm:ss Z"]
                target=>"logdatetime"
            }
            mutate{
                remove_field => [ "tem1" ]
            }
            ruby{
                code => "event.set('tem2', (event.get('logdatetime').time.localtime + 8*60*60))"
            }
            mutate{
                add_field => {
                    "tmp3" => "%{tem2}"
                }
                remove_field => [ "tem2" ]
            }
            mutate{
                split => ["tmp3", "."]
                add_field => {
                    "ACCESS_TIME" => "%{[tmp3][0]}"
                }
                remove_field => [ "tmp3" ]
            }
            mutate{
                gsub => ["ACCESS_TIME", "T", " "]
            }
        }
        
}
output{
    
    if "exclude" in [tags] or "include" in [tags] {
        jdbc {
           driver_jar_path => "/home/elk/jar/jdbc/mysql-connector-java-5.1.46-bin.jar"
           driver_class => "com.mysql.jdbc.Driver"
           connection_string => "jdbc:mysql://192.168.2.123:3306/cm?user=123&password=123"
          statement => [ "INSERT INTO buff  (URL,ACCESS_TIME) VALUES(?, ?)", "URL","ACCESS_TIME"]
        }
    }
}

可以参考Logstash最佳实践
http://doc.yonyoucloud.com/doc/logstash-best-practice-cn/index.html

logstash的配置文件总共分为三个部分 输入input  处理filter  输出output


输入input

filebeat


从filebeat中传输过来数据(端口为filebeat中配置的端口)

input {
    beats {
        port => "5011"
    }
}

标准输入(屏幕)
 

input{stdin{}}

读取文件(File)
 

input
    file {
        path => ["/var/log/*.log", "/var/log/message"]
        type => "system"
        start_position => "beginning"
    }
}

有一些比较有用的配置项,可以用来指定 FileWatch 库的行为:
discover_interval
logstash 每隔多久去检查一次被监听的 path 下是否有新文件。默认值是 15 秒。
exclude
不想被监听的文件可以排除出去,这里跟 path 一样支持 glob 展开。
sincedb_path
如果你不想用默认的 $HOME/.sincedb(Windows 平台上在 C:\Windows\System32\config\systemprofile\.sincedb),可以通过这个配置定义 sincedb 文件到其他位置。
sincedb_write_interval
logstash 每隔多久写一次 sincedb 文件,默认是 15 秒。
stat_interval
logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒。
start_position
logstash 从什么位置开始读取文件数据,默认是结束位置,也就是说 logstash 进程会以类似 tail -F 的形式运行。如果你是要导入原有数据,把这个设定改成 "beginning",logstash 进程就从头开始读取,有点类似 cat,但是读到最后一行不会终止,而是继续变成 tail -F。


读取网络数据(TCP)
 

input {
    tcp {
        port => 8888
        mode => "server"
        ssl_enable => false
    }
}

读取mysql
 

input {
 stdin { }
    jdbc {
        jdbc_connection_string => "jdbc:mysql://localhost:3306/database"
 
        jdbc_user => "root"
 
        jdbc_password => "root"
 
        jdbc_driver_library => "C:/Program Files (x86)/MySQL/Connector.J 5.1/mysql-connector-java-5.1.40-bin.jar"
 
        jdbc_driver_class => "com.mysql.jdbc.Driver"
         
        jdbc_paging_enabled => "true"
         
        jdbc_page_size => "50000"<br>
        statement => "SELECT * FROM session"<br>
        schedule => "* * * * *"
    }
 }

 

处理filter

基础知识

变量message为logstash 从input得到的一整条字符串。
可以用"%{AAA}"代表变量名AAA这个变量的值
"%{[AAA][3]}"代表变量名AAA这个数组变量(通常用split分割后)的第四个变量的值(数组从0开始)
filter 区段之内,是顺序执行的。

if使用

第一种用法是if 标签
如果这一次进入的流是job-exclude标签或job-include标签,则执行大括号内的操作
if  "job-exclude" in [tags] or "job-include" in [tags]{
    mutate{
        split => ["message","123"]
        add_field => {
            "beforeexclude" => "%{[message][0]}"
        }
    }
    
}
第二种用法是变量的表达式
 if "123" in [Name] {
        mutate { remove_field => [ "Name" ] }
 }
 如果Name变量中有123这个字符串,则。。。

 

Grok 正则捕获

grok {
	match => { "beforeinclude" => "%{DATA:PROXY_IP}, %{IP:CLIENT_IP} %{DATA}" }
}

 将beforeinclude匹配  前面为data类型(啥都可以),然后是逗号空格,然后是一个ip类型的数据,数据注入为client_ip的变量,剩下的是其他的东西

grok {
    match => { "message" => "%{HTTPDATE:requesttimestamp}" }
}

将message中匹配httpdate格式的东西放入变量requesttimestamp

logstash自带的正则表达式

https://www.cnblogs.com/vijayfly/p/6705339.html

我们还需要对相关类型进行转换(如将字符串转换为整数),例如我们所需要的端口为整数,表达式为%{NUMBER:dport:int}。需要注意的是,grok也就支持两种数据类型转换,分别为float与int。

 


 

         

时间处理(Date)

filter {
    grok {
        match => ["message", "%{HTTPDATE:logdate}"]
    }
    date {
        match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
    }
}


注意:时区偏移量只需要用一个字母 Z 即可。
将变量匹配为相应格式
具体格式:
http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html


数据修改(Mutate)(重要)

filters/mutate 插件是 Logstash 另一个重要插件。它提供了丰富的基础类型数据处理能力。

变量增减

mutate{
    add_field => {
        "StandardizedMessage2" => "%{StandardizedMessage}"
    }                
}


新建变量名为StandardizedMessage2,它的值为名字为StandardizedMessage这个变量的值

mutate{
    remove_field => [ "tem1" ]
}


删除tem1这个变量

类型转换

类型转换是 filters/mutate 插件最初诞生时的唯一功能。
可以设置的转换类型包括:"integer","float" 和 "string"。示例如下:

filter {
    mutate {
        convert => ["request_time", "float"]
    }
}


注意:mutate 除了转换简单的字符值,还支持对数组类型的字段进行转换,即将 ["1","2"] 转换成 [1,2]。但不支持对哈希类型的字段做类似处理。有这方面需求的可以采用稍后讲述的 filters/ruby 插件完成。


字符串处理

gsub(替换)

仅对字符串类型字段有效
例如

gsub => ["beforeinclude", ",", "|"]
将beforeinclude这个变量的逗号换为|

gsub => ["urlparams", "[\\?#]", "_"]

如果是替换数组中的东西

mutate{
    gsub => ["beforeinclude[0]", ",", ""]
}


split(分割)

filter {
    mutate {
        split => ["message", "|"]
    }
}

注意:如果a变量分割后,再分割a[?],此时需要再重开一个mutate,如,否则两个split在一个mutate,第二个split不生效

if "SESSIONID=" in [COOKIE] {
			        mutate{
					add_field => {
						"tem3" => "1%{COOKIE}"
					}
				}
				mutate{	
					split => ["tem3","SESSIONID="]				
					add_field => {
						"tem4" => "%{[tem3][1]}"
					}
				}
				mutate{	
					split => ["tem4",";"]
					add_field => {
						"SESSION_ID" => "%{[tem4][0]}"
					}			
				}
			}
			
		}


随意输入一串以|分割的字符,比如 "123|321|adfd|dfjld*=123",可以看到如下输出:
{
    "message" => [
        [0] "123",
        [1] "321",
        [2] "adfd",
        [3] "dfjld*=123"
    ],
    "@version" => "1",
    "@timestamp" => "2014-08-20T15:58:23.120Z",
    "host" => "raochenlindeMacBook-Air.local"
}
注意split分割是永久性的,如果要用两种东西分割,请先用变量A=这个变量B,再分割变量a和b
具体使用如
 

mutate{
    split => ["message","123"]
    add_field => {
        "before" => "%{[message][0]}"
    }
}

join(合并)

仅对数组类型字段有效
我们在之前已经用 split 割切的基础再 join 回去。配置改成:

filter {
    mutate {
        split => ["message", "|"]
    }
    mutate {
        join => ["message", ","]
    }
}


12|23 改为12,34

merge(合并数组)

合并两个数组或者哈希字段。把后面的变量合并到前面的那个
依然在之前 split 的基础上继续:

filter {
    mutate {
        split => ["message", "|"]
    }
    mutate {
        merge => ["message", "message"]
    }
}


把后面的变量合并到前面的那个

我们会看到输出:

{
       "message" => [
        [0] "123",
        [1] "321",
        [2] "adfd",
        [3] "dfjld*=123",
        [4] "123",
        [5] "321",
        [6] "adfd",
        [7] "dfjld*=123"
    ],
      "@version" => "1",
    "@timestamp" => "2014-08-20T16:05:53.711Z",
          "host" => "raochenlindeMacBook-Air.local"
}
如果 src 字段是字符串,会自动先转换成一个单元素的数组再合并。把上一示例中的来源字段改成 "host":

filter {
    mutate {
        split => ["message", "|"]
    }
    mutate {
        merge => ["message", "host"]
    }
}


结果变成:

{
       "message" => [
        [0] "123",
        [1] "321",
        [2] "adfd",
        [3] "dfjld*=123",
        [4] "raochenlindeMacBook-Air.local"
    ],
      "@version" => "1",
    "@timestamp" => "2014-08-20T16:07:53.533Z",
          "host" => [
        [0] "raochenlindeMacBook-Air.local"
    ]
}
看,目的字段 "message" 确实多了一个元素,但是来源字段 "host" 本身也由字符串类型变成数组类型了!

rename

重命名某个字段,如果目的字段已经存在,会被覆盖掉:

filter {
    mutate {
        rename => ["syslog_host", "host"]
    }
}


update


更新某个字段的内容。如果字段不存在,不会新建。

replace


作用和 update 类似,但是当字段不存在的时候,它会起到 add_field 参数一样的效果,自动添加新的字段。

执行次序

需要注意的是,filter/mutate 内部是有执行次序的。其次序如下:

    rename(event) if @rename
    update(event) if @update
    replace(event) if @replace
    convert(event) if @convert
    gsub(event) if @gsub
    uppercase(event) if @uppercase
    lowercase(event) if @lowercase
    strip(event) if @strip
    remove(event) if @remove
    split(event) if @split
    join(event) if @join
    merge(event) if @merge

    filter_matched(event)
而 filter_matched 这个 filters/base.rb 里继承的方法也是有次序的。

  @add_field.each do |field, value|
  end
  @remove_field.each do |field|
  end
  @add_tag.each do |tag|
  end
  @remove_tag.each do |tag|
  end

 


输出output

mysql写入

output{    
    if "exclude" in [tags] or "include" in [tags] {
        jdbc {
           driver_jar_path => "/home/elk/jar/jdbc/mysql-connector-java-5.1.46-bin.jar"
           driver_class => "com.mysql.jdbc.Driver"
           connection_string => "jdbc:mysql://192.168.2.123:3306/cm?user=123&password=123"
          statement => [ "INSERT INTO buff  (URL,ACCESS_TIME) VALUES(?, ?)", "URL","ACCESS_TIME"]
        }
    }
}


注意 jar包位置,数据库位置,用户名密码,以及变量的数量与values的?,后面的那些为变量的名称,
意味第一个?的值为url变量的值

标准输出(Stdout)

output {
    stdout {
        codec => rubydebug
        workers => 2
    }
}


解释
输出插件统一具有一个参数是 workers。Logstash 为输出做了多线程的准备。
其次是 codec 设置。codec 的作用在之前已经讲过。可能除了 codecs/multiline ,其他 codec 插件本身并没有太多的设置项。所以一般省略掉后面的配置区段。换句话说。上面配置示例的完全写法应该是:

output {
    stdout {
        codec => rubydebug {
        }
        workers => 2
    }
}

单就 outputs/stdout 插件来说,其最重要和常见的用途就是调试。所以在不太有效的时候,加上命令行参数 -vv 运行,查看更多详细调试信息。


保存成文件(File)

 

配置示例

output {
 file {
   path => "/home/elk/logstash-6.3.1/job.log"
   codec => line { format => "custom format: %{message}"}
 }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值