logstash配置使用参数详解

logstash配置参数

  • logstash条件判断参数
    • ==(等于), !=(不等于), <(小于), >(大于), <=(小于等于), >=(大于等于)
    • =~(匹配正则), !~(不匹配正则)
    • in(包含), not in(不包含)
    • and(与), or(或), nand(非与), xor(非或)
    • ()(复合表达式), !()(对复合表达式结果取反)

命令行参数

  • -f/–config :
制定配置文件运行
  • -t/–configtest :
测试,用来测试logstash读取的conf文件是否能够正确的解析
  • -l/–log :
默认输出日志到标准错误,在生产环境中你可以通过 >bin/logstash -l logs/logstash.log 命令来统一存储日志
  • -w/–pipeline-workers :
允许filter和output的pipeline线程数量,默认是CPU核数
  • -b/–pipeline-batch-size :
每个 Logstash pipeline 线程,在执行具体的 filter 和 output 函数之前,最多能累积的日志条数。默认是 125 条。越大性能越好,同样也会消耗越多的 JVM 内存。
  • -u/–pipeline-batch-delay :
每个 Logstash pipeline 线程,在打包批量日志的时候,最多等待几毫秒。默认是 5 ms。
  • -P/–pluginpath :
可以写自己的插件,然后用 bin/logstash –pluginpath /path/to/own/plugins 加载它们
  • –verbose :
输出一定的调试日志
  • –debug:
输出更多的调试日志,在logstash 5.0 开始,提供了logstash.yaml配置文件,可以将命令行的所有参数都通过YAML文件方式设置

input/filter/output

input

  • Logstash 使用一个名叫 FileWatch 的 Ruby Gem 库来监听文件变化。这个库支持 glob 展开文件路径,而且会记录一个叫 .sincedb 的数据库文件来跟踪被监听的日志文件的当前读取位置。所以,不要担心 logstash 会漏过你的数据。sincedb 文件中记录了每个被监听的文件的 inode, major number, minor number 和 pos。
  • 读取文件(File)
input {
    file {
        path => ["/var/log/*.log", "/var/log/message"]
        type => "system"
        start_position => "beginning"
    }
}
  • 相关配置: 有一些比较有用的配置项,可以用来指定 FileWatch 库的行为: ● discover_interval logstash 每隔多久去检查一次被监听的 path 下是否有新文件。默认值是 15 秒。 ● exclude 不想被监听的文件可以排除出去,这里跟 path 一样支持 glob 展开。 ● close_older 一个已经监听中的文件,如果超过这个值的时间内没有更新内容,就关闭监听它的文件句柄。默认是 3600 秒,即一小时。 ● ignore_older 在每次检查文件列表的时候,如果一个文件的最后修改时间超过这个值,就忽略这个文件。默认是 86400 秒,即一天。 ● 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 进程就从头开始读取,类似 less +F 的形式运行。

标准输入(stdin)

输出插件 output

  • 输出到elasticsearch
output {
    elasticsearch {
        hosts => ["192.168.0.2:9200"]
        index => "logstash-%{type}-%{+YYYY.MM.dd}"
        document_type => "%{type}"
        flush_size => 20000
        idle_flush_time => 10
        sniffing => true
        template_overwrite => true
    }
}
  • 批量发送
在过去的版本中,主要由本插件的 flush_size 和 idle_flush_time 两个参数共同控制 Logstash 向 Elasticsearch 发送批量数据的行为。以上面示例来说:Logstash 会努力攒到 20000 条数据一次性发送出去,但是如果 10 秒钟内也没攒够 20000 条,Logstash 还是会以当前攒到的数据量发一次。默认情况下,flush_size 是 500 条,idle_flush_time 是 1 秒。这也是很多人改大了 flush_size 也没能提高写入 ES 性能的原因——Logstash 还是 1 秒钟发送一次。从 5.0 开始,这个行为有了另一个前提:flush_size 的大小不能超过 Logstash 运行时的命令行参数设置的 batch_size,否则将以 batch_size 为批量发送的大小。
  • 索引名
写入的 ES 索引的名称,这里可以使用变量。为了更贴合日志场景,Logstash 提供了 %{+YYYY.MM.dd} 这种写法。在语法解析的时候,看到以 + 号开头的,就会自动认为后面是时间格式,尝试用时间格式来解析后续字符串。所以,之前处理过程中不要给自定义字段取个加号开头的名字……
此外,注意索引名中不能有大写字母,否则 ES 在日志中会报 InvalidIndexNameException,但是 Logstash 不会报错,这个错误比较隐晦,也容易掉进这个坑中。
  • 轮询
Logstash 1.4.2 在 transport 和 http 协议的情况下是固定连接指定 host 发送数据。从 1.5.0 开始,host 可以设置数组,它会从节点列表中选取不同的节点发送数据,达到 Round-Robin 负载均衡的效果。
  • stdout 输出
output {
    stdout {
        codec => rubydebug
        workers => 2
    }
}
  • 输出到文件中
output {
    file {
        path => "/path/to/%{+yyyy}/%{+MM}/%{+dd}/%{host}.log.gz"
        message_format => "%{message}"
        gzip => true
    }
}