Logstash【从无到有从有到无】【L6】配置Logstash

目录

1.配置Logstash

1.1.配置文件的结构

1.1.1.插件配置

1.1.2.值类型

1.1.2.1.数组(Array)

1.1.2.2.列表(Lists)

1.1.2.3.布尔(Boolean)

1.1.2.3.字节(Bytes)

1.1.2.4.编解码器(codec)

1.1.2.4.Hash

1.1.2.5.Number

1.1.2.6.Password

1.1.2.7.URL

1.1.2.8.Path

1.1.2.9.字符串(String)

1.1.2.10.转义序列(Escape Sequences)

1.1.2.11.评论(Comments)

1.2.访问配置中的事件数据和字段

1.2.1.字段参考

1.2.2.sprintf格式

1.2.3.条件

1.2.4.@metadata字段

1.3.在配置中使用环境变量

1.3.1.概述

1.3.2.示例

1.3.2.1.设置TCP端口

1.3.2.2.设置标签

1.3.2.3.设置文件路径

1.4.Logstash配置示例

1.4.1.配置过滤器

1.4.2.处理Apache日志

1.4.3.使用条件

1.4.4.处理Syslog消息

1.5.多个管道

1.5.1.使用注意事项

1.6.管道到管道通信(测试版)

1.6.1.配置概述

1.6.2.工作原理

1.6.3.交货保证(Delivery Guarantees)

1.6.4.避免循环

1.6.5.建筑模式(Architectural patterns)

1.6.5.1.分销商模式

1.6.5.2.输出隔离器模式

1.6.5.3.分叉路径模式

1.6.5.4.收集器模式

1.7.重新加载配置文件

1.7.1.自动配置重新加载如何

1.8.管理多行事件

1.8.1.多行编解码器配置示例

1.8.1.1.Java Stack Traces

1.8.1.2.线路连续

1.8.1.3.时间戳

1.9.全局模式支持

1.9.1.示例模式

1.10.转换摄取节点管道

1.10.1.运行工具

1.10.2.限制

1.10.3.支持的处理器

1.11.Logstash-to-Logstash通信

1.11.1.配置概述

1.11.2.生成自签名SSL证书和密钥

1.11.3.复制SSL证书和密钥

1.11.4.启动上游Logstash实例

1.11.5.启动下游Logstash实例

1.11.6.验证通信

1.12.配置集中管道管理【X-Pack】

1.12.1.Logstash 配置管理设置

1.13.X-Pack监控(配置Logstash节点的监控)

1.13.1.升级后重新启用Logstash监控

1.13.2.在Logstash 监控设置

1.13.3.常规监控设置

1.13.4.X-Pack监控TLS / SSL设置

1.14.X-Pack安全性

1.14.1.在Logstash配置安全性

1.14.2.配置Logstash以使用基本身份验证

1.14.3.授予用户访问Logstash Indices(索引)权限

1.14.4.配置Elasticsearch输出以使用PKI身份验证

1.14.5.配置Logstash以使用TLS加密

1.14.6.配置Logstash Monitoring的凭据

1.14.7.配置集中管道管理的凭据

1.15.X-Pack设置


1.配置Logstash

要配置logstash,需要创建一个配置文件,指定要使用的插件以及每个插件的设置。您可以引用配置中的事件字段,并在满足某些条件时,使用条件来处理事件。运行logstash时,可以使用-f指定配置文件。

让我们逐步创建一个简单的配置文件并使用它来运行Logstash。创建名为“logstash-simple.conf”的文件并将其保存在与Logstash相同的目录中。

input { stdin { } }
output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

然后,运行logstash并使用该 -f 标志指定配置文件。

bin/logstash -f logstash-simple.conf

Etvoilà!Logstash读取指定的配置文件并输出到Elasticsearch和stdout。请注意,如果您在stdout中看到一条消息,其中显示“Elasticsearch Unreachable”,您需要确保安装Elasticsearch并在端口9200上启动并可以访问。在我们继续讨论一些更复杂的示例之前,让我们仔细看看是什么在配置文件中。

 

1.1.配置文件的结构

对于要添加到事件处理管道的每种类型的插件,Logstash配置文件都有一个单独的部分。例如:

# This is a comment. You should use comments to describe
# parts of your configuration.
input {
  ...
}

filter {
  ...
}

output {
  ...
}

每个部分都包含一个或多个插件的配置选项。如果指定多个筛选器,则会按照它们在配置文件中的外观顺序应用它们。

 

1.1.1.插件配置

插件的配置包括插件名称,后跟该插件的设置块。例如,此输入节配置两个文件输入:

input {
  file {
    path => "/var/log/messages"
    type => "syslog"
  }

  file {
    path => "/var/log/apache/access.log"
    type => "apache"
  }
}

在此示例中,为每个文件输入配置了两个设置:路径类型

您可以配置的设置因插件类型而异。有关每个插件的信息,请参阅输入插件输出插件过滤器插件编解码器插件

 

1.1.2.值类型

插件可能要求设置的值为特定类型,例如布尔值,列表或散列。支持以下值类型。

 

1.1.2.1.数组(Array)

现在,这种类型大多不赞成使用标准类型,例如string定义:list => true属性的插件以便更好地进行类型检查。仍然需要处理不需要类型检查的散列或混合类型的列表。

例:

users => [ {id => 1, name => bob}, {id => 2, name => jane} ]

 

1.1.2.2.列表(Lists)

不是类型本身,但属性类型可以有。这使得可以键入检查多个值。插件作者可以通过指定:list => true何时声明参数来启用列表检查。

例:

path => [ "/var/log/messages", "/var/log/*.log" ]
uris => [ "http://elastic.co", "http://example.net" ]

此示例配置path,这是一个string包含三个字符串中每个字符串的元素的列表。它还将uris参数配置为URI列表,如果提供的任何URI无效,则失败。

 

1.1.2.3.布尔(Boolean)

布尔必须是true或者false。请注意,truefalse关键字不包含在引号中。

例:

ssl_enable => true 

 

1.1.2.3.字节(Bytes)

字节字段是表示有效字节单位的字符串字段。这是在插件选项中声明特定大小的便捷方式。支持SI(k MGTPEZY)和Binary(Ki Mi Gi Ti Pi Ei Zi Yi)单位。二进制单位基数为1024,SI单位基数为1000。此字段不区分大小写,并接受值和单位之间的空格。如果未指定单位,则整数字符串表示字节数。

例子:

  my_bytes => "1113"   # 1113 bytes
  my_bytes => "10MiB"  # 10485760 bytes
  my_bytes => "100kib" # 102400 bytes
  my_bytes => "180 mb" # 180000000 bytes

 

1.1.2.4.编解码器(codec)

编解码器是用于表示数据的Logstash编解码器的名称。编解码器可用于输入和输出。

输入编解码器提供了一种在数据进入输入之前解码数据的便捷方式。输出编解码器提供了一种在数据离开输出之前对其进行编码的便捷方式。使用输入或输出编解码器无需在Logstash管道中使用单独的过滤器。

可以在Codec Plugins页面找到可用编解码器列表。

例:

codec => "json"

 

1.1.2.4.Hash

哈希是格式中指定的键值对的集合"field1" => "value1"。请注意,多个键值条目由空格而不是逗号分隔。

例:

match => {
  "field1" => "value1"
  "field2" => "value2"
  ...
}
# or as a single line. No commas between entries:
match => { "field1" => "value1" "field2" => "value2" }

 

1.1.2.5.Number

数字必须是有效的数值(浮点或整数)。

例:

port => 33

 

1.1.2.6.Password

密码是具有单个值但未记录或打印的字符串。

例:

my_password => "password"

 

1.1.2.7.URL

URI可以是完整的URL,如http://elastic.co/,也可以是像foob​​ar这样的简单标识符。如果URI包含密码,例如http:// user:pass@example.net,则不会记录或打印URI的密码部分。

例:

my_uri => "http://foo:bar@example.net"

 

1.1.2.8.Path

路径是表示有效操作系统路径的字符串。

例:

 my_path => "/tmp/logstash"

 

1.1.2.9.字符串(String)

字符串必须是单个字符序列。请注意,字符串值用引号括起来,可以是double或single。

 

1.1.2.10.转义序列(Escape Sequences)

默认情况下,不启用转义序列。如果您希望在带引号的字符串中使用转义序列,则需要config.support_escapes: true在您的字符串中设置 logstash.yml。何时true,引用字符串(double和single)将进行此转换:

文本

结果

\r

carriage return (ASCII 13)

\n

new line (ASCII 10)

\t

tab (ASCII 9)

\\

backslash (ASCII 92)

\"

double quote (ASCII 34)

\'

single quote (ASCII 39)

例:

name => "Hello world"
name => 'It\'s a beautiful day'

 

1.1.2.11.评论(Comments)

注释与perl,ruby和python中的注释相同。注释以字符开头,不需要位于一行的开头。例如:

# this is a comment

input { # comments can appear at the end of a line, too
  # ...
}

 

1.2.访问配置中的事件数据和字段

logstash代理是一个具有3个阶段的处理管道:输入→过滤器→输出。输入生成事件,过滤器修改它们,输出将它们发送到其他地方。

所有活动都有属性。例如,apache访问日志将包含状态代码(200,404),请求路径(“/”,“index.html”),HTTP动词(GET,POST),客户端IP地址等.Logstash调用这些属性“字段”。

Logstash中的一些配置选项需要存在字段才能运行。因为输入生成事件,所以在输入块中没有要评估的字段 - 它们还不存在!

由于它们依赖于事件和字段,因此以下配置选项仅适用于过滤器和输出块。

下面描述的字段引用,sprintf格式和条件不适用于输入块。

 

1.2.1.字段参考

能够通过名称引用字段通常很有用。为此,您可以使用Logstash 字段引用语法

访问字段的基本语法是[fieldname]。如果您指的是 顶级字段,则可以省略[]并简单地使用fieldname。要引用嵌套字段,请指定该字段的完整路径:[top-level field][nested field]

例如,以下事件有五个顶级字段(代理,IP,请求,响应,ua)和三个嵌套字段(状态,字节,操作系统)。

{
  "agent": "Mozilla/5.0 (compatible; MSIE 9.0)",
  "ip": "192.168.24.44",
  "request": "/index.html"
  "response": {
    "status": 200,
    "bytes": 52353
  },
  "ua": {
    "os": "Windows 7"
  }
}

 

要引用该os字段,请指定[ua][os]。要引用顶级字段,例如request,您只需指定字段名称即可。

有关更多详细信息,请参阅Deep Dive字段引用

 

1.2.2.sprintf格式

字段引用格式也用于Logstash调用sprintf格式的内容。此格式使您可以从其他字符串中引用字段值。例如,statsd输出具有增量设置,使您可以按状态代码保留apache日志的计数:

 

output {
  statsd {
    increment => "apache.%{[response][status]}"
  }
}

 

同样,您可以将@timestamp字段中的时间戳转换为字符串。而不是在花括号内指定字段名称,使用+FORMAT语法where FORMAT时间格式

例如,如果要根据事件的日期和小时以及type字段使用文件输出写入日志:

 

 

output {
  file {
    path => "/var/log/%{type}.%{+yyyy.MM.dd.HH}"
  }
}

 

 

1.2.3.条件

有时您只想在特定条件下过滤或输出事件。为此,您可以使用条件。

Logstash中的条件查看和行为与编程语言中的条件相同。条件语句支持ifelse if以及else报表和可以被嵌套。

条件语法是:

 

if EXPRESSION {
  ...
} else if EXPRESSION {
  ...
} else {
  ...
}

 

什么是表达?比较测试,布尔逻辑等等!

您可以使用以下比较运算符:

  • 平等:==, !=, <, >, <=>=
  • regexp:=~!~(检查右边的模式与左边的字符串值)
  • 包含:innot in

支持的布尔运算符是:

  • andornandxor

支持的一元运算符是:

  • !

 

 

表达式可能很长而且很复杂。表达式可以包含其他表达式,您可以使用它来否定表达式!,并且可以使用括号对它们进行分组(...)。例如,secret如果字段 action的值为以下值,则以下条件使用mutate过滤器删除字段login

filter {
  if [action] == "login" {
    mutate { remove_field => "secret" }
  }
}

您可以在单个条件中指定多个表达式:

output {
  # Send production errors to pagerduty
  if [loglevel] == "ERROR" and [deployment] == "production" {
    pagerduty {
    ...
    }
  }
}

您可以使用in运算符来测试字段是否包含特定字符串,键或(对于列表)元素:

filter {
  if [foo] in [foobar] {
    mutate { add_tag => "field in field" }
  }
  if [foo] in "foo" {
    mutate { add_tag => "field in string" }
  }
  if "hello" in [greeting] {
    mutate { add_tag => "string in field" }
  }
  if [foo] in ["hello", "world", "foo"] {
    mutate { add_tag => "field in list" }
  }
  if [missing] in [alsomissing] {
    mutate { add_tag => "shouldnotexist" }
  }
  if !("foo" in ["hello", "world"]) {
    mutate { add_tag => "shouldexist" }
  }
}

not in以相同的方式使用条件。例如,您可以使用not in仅在grok成功时将事件路由到Elasticsearch :

output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch { ... }
  }
}

您可以检查特定字段是否存在,但目前无法区分不存在的字段与完全错误的字段。表达式if [foo]返回false时:

  • [foo] 在事件中不存在,
  • [foo] 存在于事件中,但是是假的,或者
  • [foo] 存在于事件中,但为null

有关更复杂的示例,请参阅使用条件

 

1.2.4.@metadata字段

在Logstash 1.5及更高版本中,有一个名为的特殊字段@metadata。在输出时,@metadata的内容不会成为您的任何事件的一部分,这使得它非常适合用于条件,或者使用字段引用和sprintf格式扩展和构建事件字段。

以下配置文件将从STDIN生成事件。无论什么类型都将成为message事件的领域。mutate过滤器块中的事件将添加一些字段,一些字段嵌套在@metadata字段中。

input { stdin { } }

filter {
  mutate { add_field => { "show" => "This data will be in the output" } }
  mutate { add_field => { "[@metadata][test]" => "Hello" } }
  mutate { add_field => { "[@metadata][no_show]" => "This data will not be in the output" } }
}

output {
  if [@metadata][test] == "Hello" {
    stdout { codec => rubydebug }
  }
}

让我们看看会发生什么:

$ bin/logstash -f ../test.conf
Pipeline main started
asdf
{
    "@timestamp" => 2016-06-30T02:42:51.496Z,
      "@version" => "1",
          "host" => "example.com",
          "show" => "This data will be in the output",
       "message" => "asdf"
}

输入的“asdf”成为message字段内容,条件成功评估了test嵌套在@metadata字段中的字段 的内容。但是输出没有显示被称为字段@metadata或其内容。

如果您添加一个配置标志字段,metadata => true,rubydebug编解码器可显示@metadata的内容

stdout { codec => rubydebug { metadata => true } }

我们看一下这个变化的输出结果:

$ bin/logstash -f ../test.conf
Pipeline main started
asdf
{
    "@timestamp" => 2016-06-30T02:46:48.565Z,
     "@metadata" => {
           "test" => "Hello",
        "no_show" => "This data will not be in the output"
    },
      "@version" => "1",
          "host" => "example.com",
          "show" => "This data will be in the output",
       "message" => "asdf"
}

现在您可以看到该@metadata字段及其子字段。

只有rubydebug编解码器允许您显示该@metadata字段的内容 。

只要您需要临时字段但不希望它在最终输出中,就可以使用@metadata字段。

也许这个新领域最常见的用例之一是使用date 过滤器并具有临时时间戳。

此配置文件已简化,但使用Apache和Nginx Web服务器通用的时间戳格式。在过去,您必须在使用它来覆盖@timestamp 字段后自己删除时间戳字段。随着该@metadata领域,这不再是必要的:

input { stdin { } }

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

output {
  stdout { codec => rubydebug }
}

请注意,此配置将提取的日期放入过滤器的 [@metadata][timestamp]字段中grok。让我们为这个配置提供一个示例日期字符串,看看会出现什么:

$ bin/logstash -f ../test.conf
Pipeline main started
02/Mar/2014:15:36:43 +0100
{
    "@timestamp" => 2014-03-02T14:36:43.000Z,
      "@version" => "1",
          "host" => "example.com",
       "message" => "02/Mar/2014:15:36:43 +0100"
}

输出中没有额外的字段,以及更简洁的配置文件,因为您不必在date过滤器中转换后删除“timestamp”字段。

另一个用例是CouchDB Changes输入插件(参见 https://github.com/logstash-plugins/logstash-input-couchdb_changes)。该插件自动将CouchDB文档字段元数据捕获到@metadata输入插件本身的 字段中。当事件通过Elasticsearch索引时,Elasticsearch输出插件允许您指定action(删除,更新,插入等)和document_id,如下所示:

output {
  elasticsearch {
    action => "%{[@metadata][action]}"
    document_id => "%{[@metadata][_id]}"
    hosts => ["example.com"]
    index => "index_name"
    protocol => "http"
  }
}

 

1.3.在配置中使用环境变量

 

1.3.1.概述

  • 您可以使用${var}在Logstash插件的配置中设置环境变量引用。
  • 在Logstash启动时,每个引用都将被环境变量的值替换。
  • 替换是区分大小写的。
  • 对未定义变量的引用会引发Logstash配置错误。
  • 您可以使用表单提供默认值${var:default value}。如果未定义环境变量,Logstash将使用默认值。
  • 您可以在任何插件选项类型中添加环境变量引用:string,number,boolean,array或hash。
  • 环境变量是不可变的。如果更新环境变量,则必须重新启动Logstash以获取更新的值。

 

1.3.2.示例

以下示例显示如何使用环境变量来设置一些常用配置选项的值。

1.3.2.1.设置TCP端口

这是一个使用环境变量来设置TCP端口的示例:

input {
  tcp {
    port => "${TCP_PORT}"
  }
}

现在让我们设置值TCP_PORT

export TCP_PORT=12345

在启动时,Logstash使用以下配置:

input {
  tcp {
    port => 12345
  }
}

如果TCP_PORT未设置环境变量,Logstash将返回配置错误。

您可以通过指定默认值来解决此问题:

input {
  tcp {
    port => "${TCP_PORT:54321}"
  }
}

现在,如果变量未定义,而不是返回配置错误,Logstash使用默认值:

input {
  tcp {
    port => 54321
  }
}

如果定义了环境变量,Logstash将使用为变量指定的值而不是默认值。

 

1.3.2.2.设置标签

这是一个使用环境变量来设置标记值的示例:

filter {
  mutate {
    add_tag => [ "tag1", "${ENV_TAG}" ]
  }
}

让我们设置值ENV_TAG

export ENV_TAG="tag2"

在启动时,Logstash使用以下配置:

filter {
  mutate {
    add_tag => [ "tag1", "tag2" ]
  }
}

 

1.3.2.3.设置文件路径

这是一个使用环境变量来设置日志文件路径的示例:

filter {
  mutate {
    add_field => {
      "my_path" => "${HOME}/file.log"
    }
  }
}

让我们设置值HOME

export HOME="/path"

在启动时,Logstash使用以下配置:

filter {
  mutate {
    add_field => {
      "my_path" => "/path/file.log"
    }
  }
}

 

1.4.Logstash配置示例

以下示例说明了如何配置Logstash以过滤事件,处理Apache日志和syslog消息,以及如何使用条件来控制过滤器或输出处理的事件。

如果您需要帮助构建grok模式,请尝试使用 Grok Debugger。Grok Debugger是基本许可证下的X-Pack功能,因此可以免费使用

 

1.4.1.配置过滤器

过滤器是一种在线处理机制,可以灵活地对数据进行切片和切块以满足您的需求。我们来看看一些过滤器。以下配置文件设置grokdate过滤器。

input { stdin { } }

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

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

使用此配置运行Logstash:

bin/logstash -f logstash-filter.conf

现在,将以下行粘贴到终端并按Enter键,以便stdin输入处理它:

127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"

您应该看到返回到stdout的内容如下所示:

{
        "message" => "127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] \"GET /xampp/status.php HTTP/1.1\" 200 3891 \"http://cadenza/xampp/navi.php\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"",
     "@timestamp" => "2013-12-11T08:01:45.000Z",
       "@version" => "1",
           "host" => "cadenza",
       "clientip" => "127.0.0.1",
          "ident" => "-",
           "auth" => "-",
      "timestamp" => "11/Dec/2013:00:01:45 -0800",
           "verb" => "GET",
        "request" => "/xampp/status.php",
    "httpversion" => "1.1",
       "response" => "200",
          "bytes" => "3891",
       "referrer" => "\"http://cadenza/xampp/navi.php\"",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\""
}

正如您所看到的,Logstash(在grok过滤器的帮助下)能够解析日志行(恰好采用Apache“组合日志”格式)并将其分解为许多不同的离散信息位。一旦开始查询和分析我们的日志数据,这非常有用。例如,您将能够轻松地运行HTTP响应代码,IP地址,引用等报告。Logstash包含了很多grok模式,因此很有可能如果您需要解析常见的日志格式,有人已经为您完成了工作。有关更多信息,请参阅GitHub上的Logstash grok模式列表。

此示例中使用的另一个过滤器是date过滤器。此过滤器解析时间戳并将其用作事件的时间戳(无论您何时摄取日志数据)。您会注意到@timestamp此示例中的字段设置为2013年12月11日,即使Logstash之后在某个时间点摄取事件。回填日志时这很方便。它使您能够告诉Logstash“将此值用作此事件的时间戳”。

 

1.4.2.处理Apache日志

让我们做一些实际有用的事情:处理apache2访问日志文件!我们将从localhost上的文件中读取输入,并使用条件根据我们的需要处理事件。首先,使用以下内容创建一个名为logstash-apache.conf的文件(您可以更改日志的文件路径以满足您的需要):

input {
  file {
    path => "/tmp/access_log"
    start_position => "beginning"
  }
}

filter {
  if [path] =~ "access" {
    mutate { replace => { "type" => "apache_access" } }
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
  }
  stdout { codec => rubydebug }
}

然后,使用以下日志条目创建您在上面配置的输入文件(在此示例中为“/ tmp / access_log”)(或使用您自己的Web服务器中的一些):

71.141.244.242 - kurt [18/May/2011:01:48:10 -0700] "GET /admin HTTP/1.1" 301 566 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
134.39.72.245 - - [18/May/2011:12:40:18 -0700] "GET /favicon.ico HTTP/1.1" 200 1189 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E)"
98.83.179.51 - - [18/May/2011:19:35:08 -0700] "GET /css/main.css HTTP/1.1" 200 1837 "http://www.safesand.com/information.htm" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"

现在,使用-f标志运行Logstash以传入配置文件:

bin/logstash -f logstash-apache.conf

现在您应该在Elasticsearch中看到您的apache日志数据!Logstash打开并读取指定的输入文件,处理它遇到的每个事件。记录到此文件的任何其他行也将被捕获,由Logstash作为事件处理,并存储在Elasticsearch中。作为一个额外的好处,它们将“apache_access”替换为“type”(这是由输入配置中的 type ⇒ "apache_access" 行完成的)。

在此配置中,Logstash仅监视apache access_log,但*log通过更改上述配置中的一行,可以轻松地同时查看access_log和error_log(实际上,任何文件匹配):

input {
  file {
    path => "/tmp/*_log"
...

重新启动Logstash时,它将处理错误和访问日志。但是,如果您检查数据(可能使用elasticsearch-kopf),您将看到access_log被分解为离散字段,但error_log不是。那是因为我们使用grok过滤器来匹配标准组合的apache日志格式,并自动将数据拆分为单独的字段。如果我们可以根据其格式控制线的解析方式,那不是很好吗?好吧,我们可以......

请注意,Logstash不会重新处理已在access_log文件中看到的事件。从文件中读取时,Logstash会保存其位置,并仅在添加新行时处理它们。

 

1.4.3.使用条件

您可以使用条件来控制过滤器或输出处理的事件。例如,您可以根据它出现的文件(access_log,error_log和以“log”结尾的其他随机文件)标记每个事件。

input {
  file {
    path => "/tmp/*_log"
  }
}

filter {
  if [path] =~ "access" {
    mutate { replace => { type => "apache_access" } }
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    date {
      match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
  } else if [path] =~ "error" {
    mutate { replace => { type => "apache_error" } }
  } else {
    mutate { replace => { type => "random_logs" } }
  }
}

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

此示例使用该type字段标记所有事件,但实际上并不解析errorrandom文件。有很多类型的错误日志,它们应该如何标记,实际上取决于您正在使用的日志。

同样,您可以使用条件将事件定向到特定输出。例如,您可以:

  • 任何状态为5xx的apache事件的警报nagios
  • 将任何4xx状态记录到Elasticsearch
  • 通过statsd记录所有状态代码命中

要告诉nagios任何具有5xx状态代码的http事件,首先需要检查type字段的值。如果是apache,那么您可以检查该status字段是否包含5xx错误。如果是,请将其发送给nagios。如果不是5xx错误,请检查该status字段是否包含4xx错误。如果是这样,请将其发送给Elasticsearch。最后,无论status字段包含什么,都将所有apache状态代码发送到statsd :

output {
  if [type] == "apache" {
    if [status] =~ /^5\d\d/ {
      nagios { ...  }
    } else if [status] =~ /^4\d\d/ {
      elasticsearch { ... }
    }
    statsd { increment => "apache.%{status}" }
  }
}

 

1.4.4.处理Syslog消息

Syslog是Logstash最常见的用例之一,它处理得非常好(只要日志行大致符合RFC3164)。Syslog是事实上的UNIX联网日志记录标准,它将消息从客户端计算机发送到本地文件,或通过rsyslog发送到集中式日志服务器。对于此示例,您将不需要正常运行的syslog实例; 我们将从命令行中伪造它,以便您了解发生的情况。

首先,让我们为Logstash + syslog创建一个简单的配置文件,名为logstash-syslog.conf

input {
  tcp {
    port => 5000
    type => syslog
  }
  udp {
    port => 5000
    type => syslog
  }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

使用以下新配置运行Logstash:

bin/logstash -f logstash-syslog.conf

通常,客户端计算机将连接到端口5000上的Logstash实例并发送其消息。对于这个例子,我们只是telnet到Logstash并输入一个日志行(类似于我们之前在STDIN中输入日志行的方式)。打开另一个shell窗口以与Logstash syslog输入交互并输入以下命令:

telnet localhost 5000

将以下行复制并粘贴为样本。(请随意尝试一些自己的,但请记住,如果grok过滤器对您的数据不正确,他们可能无法解析)。

Dec 23 12:11:43 louis postfix/smtpd[31499]: connect from unknown[95.75.93.154]
Dec 23 14:42:56 louis named[16000]: client 199.48.164.7#64817: query (cache) 'amsterdamboothuren.com/MX/IN' denied
Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)
Dec 22 18:28:06 louis rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="2253" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.

现在,您应该在处理和解析消息时在原始shell中看到Logstash的输出!

{
                 "message" => "Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)",
              "@timestamp" => "2013-12-23T22:30:01.000Z",
                "@version" => "1",
                    "type" => "syslog",
                    "host" => "0:0:0:0:0:0:0:1:52617",
        "syslog_timestamp" => "Dec 23 14:30:01",
         "syslog_hostname" => "louis",
          "syslog_program" => "CRON",
              "syslog_pid" => "619",
          "syslog_message" => "(www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)",
             "received_at" => "2013-12-23 22:49:22 UTC",
           "received_from" => "0:0:0:0:0:0:0:1:52617",
    "syslog_severity_code" => 5,
    "syslog_facility_code" => 1,
         "syslog_facility" => "user-level",
         "syslog_severity" => "notice"
}

 

1.5.多个管道

如果需要在同一进程中运行多个管道,Logstash提供了一种通过调用的配置文件来执行此操作的方法pipelines.yml。此文件必须放在path.settings文件夹中并遵循以下结构:

- pipeline.id: my-pipeline_1
  path.config: "/etc/path/to/p1.config"
  pipeline.workers: 3
- pipeline.id: my-other-pipeline
  path.config: "/etc/different/path/p2.cfg"
  queue.type: persisted

此文件以YAML格式化,并包含字典列表,其中每个字典描述一个管道,每个键/值对指定该管道的设置。该示例显示了由ID和配置路径描述的两个不同管道。对于第一个管道,值pipeline.workers设置为3,而在另一个管道中,启用持久队列功能。未在pipelines.yml文件中显式设置的设置值将回退到logstash.yml 设置文件中指定的默认值。

当您启动没有参数的Logstash时,它将读取pipelines.yml文件并实例化文件中指定的所有管道。另一方面,当您使用-e或时-f,Logstash会忽略该pipelines.yml文件并记录有关它的警告。

 

1.5.1.使用注意事项

如果当前配置的事件流不共享相同的输入/过滤器和输出,并且使用标签和条件将彼此分开,则使用多个管道尤其有用。

在单个实例中具有多个管道还允许这些事件流具有不同的性能和持久性参数(例如,管道工作者和持久队列的不同设置)。这种分离意味着一个管道中的阻塞输出不会在另一个管道中施加背压。

也就是说,考虑到为单个管道调整默认值,考虑管道之间的资源竞争非常重要。因此,例如,考虑减少每个管道使用的管道工作者的数量,因为默认情况下每个管道将使用每个CPU核心1个工作线程。

持久队列和死信队列是按管道隔离的,其位置由pipeline.id值命名。

 

1.6.管道到管道通信(测试版)

使用Logstash的多管道功能时,您可能希望在同一个Logstash实例中连接多个管道。此配置可用于隔离这些管道的执行,以及帮助分解复杂管道的逻辑。所述pipeline输入/输出使一些稍后在本文档中所讨论的先进架构模式。

如果需要 Logstash实例之间设置通信,请使用Logstash-to-Logstash通信或中间队列(如Kafka或Redis)。

 

1.6.1.配置概述

使用 pipeline输入和 pipeline输出来连接在同一Logstash实例中运行的两个管道。这这些输入使用客户机-服务器方法,其中管道(pipeline)输入 注册 管道(pipeline)输出,可以连接到的虚拟地址。

  1. 创建一个侦听虚拟地址上的事件的下游管道。
  2. 创建一个生成事件的上游管道,通过pipeline输出将它们发送到一个或多个虚拟地址。

以下是此配置的简单示例。

# config/pipelines.yml
- pipeline.id: upstream
  config.string: input { stdin {} } output { pipeline { send_to => [myVirtualAddress] } }
- pipeline.id: downstream
  config.string: input { pipeline { address => myVirtualAddress } }

 

1.6.2.工作原理

pipeline输入作为一个虚拟服务器监听在本地处理单个虚拟地址。只有在同一本地Logstash上运行的pipeline输出才能将事件发送到此地址。管道outputs可以将事件发送到虚拟地址列表。如果下游管道(pipeline)被阻塞或不可用pipeline输出将被阻止。

通过管道发送事件时,将完全复制其数据。对下游管道中的事件的修改不会影响任何上游管道中的该事件。

pipeline插件可能是管道之间沟通的最有效的方式,但它仍然会带来性能开销。Logstash必须在Java堆上为每个下游管道完全复制每个事件。使用此功能可能会影响Logstash的堆内存利用率。

 

1.6.3.交货保证(Delivery Guarantees)

在其标准配置中,pipeline输入/输出具有至少一次传送保证。如果地址被阻止或不可用,将阻止输出。

默认情况下,输出ensure_delivery上的选项pipeline设置为true.如果将ensure_delivery标志更改为false则不可用的下游管道会导致发送的消息被丢弃。请注意,管道仅在启动或重新加载时才被视为不可用,而不是在其可能包含的任何插件被阻止时。阻塞下游管道块发送输出/管线不论ensure_delivery标记的值。使用ensure_delivery => false时,要暂时禁用下游管道而不阻塞任何上游管线输送到它的能力。

这些传递保证还可以通知此功能的关闭行为。执行管道重新加载时,将在用户请求时立即进行更改,即使这意味着删除从上游管道接收事件的下游管道。这将导致上游管道阻塞。您必须还原下游管道以干净地关闭Logstash。您可以发出强制终止,但除非为该管道启用了持久队列,否则可能会丢失运行中事件。

 

1.6.4.避免循环

连接管道时,请保持数据在一个方向上流动。循环数据或将管道连接到循环图可能会导致问题。Logstash在关闭之前等待每个管道的工作完成。管道循环可以防止Logstash干净地关闭。

 

1.6.5.建筑模式(Architectural patterns)

您可以使用pipeline输入和输出来更好地组织代码,简化控制流并隔离复杂配置的性能。有无限的方法来连接管道。这里介绍的提供了一些想法。

  • 分销商模式
  • 输出隔离器模式
  • 分叉路径模式
  • 收集器模式

这些示例用于config.string说明流程。您还可以使用配置文件进行管道到管道的通信。

 

1.6.5.1.分销商模式

在通过单个输入存在多种类型的数据的情况下,您可以使用分发器模式,每种类型都有自己复杂的处理规则集。使用分配器模式,一个管道用于根据类型将数据路由到其他管道。每种类型都路由到一个管道,只有处理该类型的逻辑。通过这种方式,可以隔离每种类型的逻辑。

作为示例,在许多组织中,单个节拍输入可用于从各种源接收流量,每个源具有其自己的处理逻辑。处理此类数据的常用方法是将许多if条件分开,并以不同方式处理每种类型。当配置冗长而复杂时,这种方法很快就会变得混乱。

这是一个示例分配器模式配置。

# config/pipelines.yml
- pipeline.id: beats-server
  config.string: |
    input { beats { port => 5044 } }
    output {
        if [type] == apache {
          pipeline { send_to => weblogs }
        } else if [type] == system {
          pipeline { send_to => syslog }
        } else {
          pipeline { send_to => fallback }
        }
    }
- pipeline.id: weblog-processing
  config.string: |
    input { pipeline { address => weblogs } }
    filter {
       # Weblog filter statements here...
    }
    output {
      elasticsearch { hosts => [es_cluster_a_host] }
    }
- pipeline.id: syslog-processing
  config.string: |
    input { pipeline { address => syslog } }
    filter {
       # Syslog filter statements here...
    }
    output {
      elasticsearch { hosts => [es_cluster_b_host] }
    }
- pipeline.id: fallback-processing
    config.string: |
    input { pipeline { address => fallback } }
    output { elasticsearch { hosts => [es_cluster_b_host] } }

请注意,由于每个管道仅适用于单个特定任务,因此跟随数据流是如此简单。

 

1.6.5.2.输出隔离器模式

如果多个输出中的一个遇到临时故障,您可以使用输出隔离器模式来防止Logstash被阻止。默认情况下,Logstash在任何单个输出关闭时被阻止。此行为对于保证至少一次传送数据非常重要。

使用输出隔离器模式和持久队列,即使一个输出关闭,我们也可以继续发送到Elasticsearch。

以下是使用输出隔离器模式的此方案的示例。

# config/pipelines.yml
- pipeline.id: intake
  queue.type: persisted
  config.string: |
    input { beats { port => 5044 } }
    output { pipeline { send_to => [es, http] } }
- pipeline.id: buffered-es
  queue.type: persisted
  config.string: |
    input { pipeline { address => es } }
    output { elasticsearch { } }
- pipeline.id: buffered-http
  queue.type: persisted
  config.string: |
    input { pipeline { address => http } }
    output { http { } }

在此体系结构中,每个阶段都有自己的队列,并具有自己的调整和设置。请注意,此方法使用的磁盘空间最多为三倍,并且产生的序列化/反序列化成本是单个管道的三倍。

 

1.6.5.3.分叉路径模式

对于必须根据不同的规则集多次处理单个事件的情况,可以使用分叉路径模式。在pipeline输入和输出可用之前,通常通过创造性地使用clone过滤器和if/else规则来解决此需求。

让我们假设一个用例,我们在自己的系统中接收数据并索引完整事件,但是将编辑后的数据版本发布到合作伙伴的S3存储桶。我们可能会使用上面描述的输出隔离器模式来解耦我们对任一系统的写入。分叉路径模式的显着特征是下游管道中存在附加规则。

# config/pipelines.yml
- pipeline.id: intake
  queue.type: persisted
  config.string: |
    input { beats { port => 5044 } }
    output { pipeline { send_to => ["internal-es", "partner-s3"] } }
- pipeline.id: buffered-es
  queue.type: persisted
  config.string: |
    input { pipeline { address => "internal-es" } }
    # Index the full event
    output { elasticsearch { } }
- pipeline.id: partner
  queue.type: persisted
  config.string: |
    input { pipeline { address => "partner-s3" } }
    filter {
      # Remove the sensitive data
      mutate { remove_field => 'sensitive-data' }
    }
    output { s3 { } } # Output to partner's bucket

 

1.6.5.4.收集器模式

如果要定义许多不同管道可能使用的公共输出和预输出过滤器,则可以使用收集器模式。这种模式与分销商模式相反。在这种模式中,许多管道流入单个管道,在那里它们共享输出和处理。这种模式以减少隔离为代价简化了配置,因为所有数据都是通过单个管道发送的。

这是收集器模式的一个例子。

# config/pipelines.yml
- pipeline.id: beats
  config.string: |
    input { beats { port => 5044 } }
    output { pipeline { send_to => [commonOut] } }
- pipeline.id: kafka
  config.string: |
    input { kafka { ... } }
    output { pipeline { send_to => [commonOut] } }
- pipeline.id: partner
  # This common pipeline enforces the same logic whether data comes from Kafka or Beats
  config.string: |
    input { pipeline { address => commonOut } }
    filter {
      # Always remove sensitive data from all input sources
      mutate { remove_field => 'sensitive-data' }
    }
    output { elasticsearch { } }

 

1.7.重新加载配置文件

从Logstash 2.3开始,您可以设置Logstash以自动检测和重新加载配置更改。

要启用自动配置重新加载,请使用指定的--config.reload.automatic(或-r)命令行选项启动Logstash 。例如:

bin/logstash –f apache.config --config.reload.automatic

--config.reload.automatic指定-e要从命令行传递配置设置的标志时,该选项不可用。

默认情况下,Logstash每3秒检查一次配置更改。要更改此间隔,请使用--config.reload.interval <interval>选项,其中interval指定Logstash检查配置文件的更改频率。

如果Logstash已在未启用自动重新加载的情况下运行,则可以强制Logstash重新加载配置文件,并通过向运行Logstash的进程发送SIGHUP(信号挂断)来重新启动管道。例如:

kill -SIGHUP 14175

其中14175是运行Logstash的进程的ID。

 

1.7.1.自动配置重新加载如何

当Logstash检测到配置文件中的更改时,它会通过停止所有输入来停止当前管道,并尝试创建使用更新配置的新管道。验证新配置的语法后,Logstash会验证是否可以初始化所有输入和输出(例如,所有必需的端口都已打开)。如果检查成功,Logstash将使用新管道交换现有管道。如果检查失败,则旧管道继续运行,并将错误传播到控制台。

在自动配置重新加载期间,JVM不会重新启动。管道的创建和交换都发生在同一个过程中。

还会重新加载对grok模式文件的更改,但仅当配置文件中的更改触发重新加载(或重新启动管道)时才会重新加载。

 

1.8.管理多行事件

一些用例生成跨越多行文本的事件。为了正确处理这些多行事件,Logstash需要知道如何分辨哪些行是单个事件的一部分。

多行事件处理很复杂,依赖于正确的事件排序。保证有序日志处理的最佳方法是尽可能早地在管道中实现处理。

编解码器是在Logstash管道处理多事件的首选工具。多行编解码器使用一组简单的规则合并来自单个输入的行。

如果您使用的是支持多个主机的Logstash输入插件,例如beats输入插件,则不应使用 多行编解码器来处理多行事件。这样做可能会导致流混合和损坏的事件数据。在这种情况下,您需要在将事件数据发送到Logstash之前处理多行事件。

配置多行编解码器的最重要方面如下:

  • pattern选项指定正则表达式。与指定正则表达式匹配的行被视为前一行的延续或新多行事件的开始。您可以使用此配置选项使用 grok正则表达式模板。
  • what选项有两个值:previousnext。该previous值指定与pattern选项中的值匹配的行是上一行的一部分。该next值指定与pattern选项中的值匹配的行是以下行的一部分。*该negate选项将多行编解码器应用于与选项中指定的正则表达式匹配的行 pattern

有关配置选项的更多信息,请参阅多行编解码器插件的完整文档。

 

1.8.1.多行编解码器配置示例

节中的示例涵盖以下用例:

  • 将Java堆栈跟踪组合到单个事件中
  • 将C风格的线条延续组合成一个单一的事件
  • 结合时间戳事件中的多行

 

1.8.1.1.Java Stack Traces

Java堆栈跟踪由多行组成,初始行后面的每一行以空格开头,如下例所示:

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

要将这些行合并到Logstash中的单个事件中,请对多行编解码器使用以下配置:

input {
  stdin {
    codec => multiline {
      pattern => "^\s"
      what => "previous"
    }
  }
}

此配置将以空格开头的任何行合并到上一行。

 

1.8.1.2.线路连续

一些编程语言使用\行尾的字符来表示该行继续,如下例所示:

printf ("%10.10ld  \t %10.10ld \t %s\
  %f", w, x, y, z );

要将这些行合并到Logstash中的单个事件中,请对多行编解码器使用以下配置:

input {
  stdin {
    codec => multiline {
      pattern => "\\$"
      what => "next"
    }
  }
}

此配置将以\字符结尾的任何行与下一行合并。

 

1.8.1.3.时间戳

来自Elasticsearch等服务的活动日志通常以时间戳开头,后跟特定活动的信息,如下例所示:

[2015-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]

要将这些行合并到Logstash中的单个事件中,请对多行编解码器使用以下配置:

input {
  file {
    path => "/var/log/someapp.log"
    codec => multiline {
      pattern => "^%{TIMESTAMP_ISO8601} "
      negate => true
      what => previous
    }
  }
}

此配置使用该negate选项指定不以时间戳开头的任何行都属于上一行。

 

1.9.全局模式支持

只要允许使用glob模式,Logstash就支持以下模式:

  • *

匹配任何文件。您还可以使用  来限制glob中的其他值。例如,*conf匹配所有结尾的文件conf*apache*匹配apache名称中的任何文件。此模式与类Unix操作系统上的隐藏文件(点文件)不匹配。要匹配点文件,请使用类似的模式{*,.*}

  • **

       递归匹配目录。

  • ?

       匹配任何一个角色。

  • [set]

       匹配集合中的任何一个字符。例如,[a-z]。还支持set negation([^a-z])。

  • {p,q}

       匹配文字p或文字q。匹配的文字可以是多个字符,您可以指定两个以上的文字。此模式相当于在正则表达式(foo|bar)中使用垂直条的交替。

  • \

       逃离下一个元字符。这意味着您不能在Windows中使用反斜杠作为glob的一部分。该模式c:\foo*不起作用,所以请foo*改用。

 

1.9.1.示例模式

以下是glob模式的一些常见示例:

"/path/to/*.conf"

匹配.conf以指定路径结尾的配置文件。

"/var/log/*.log"

匹配.log以指定路径结尾的日志文件。

"/var/log/**/*.log

匹配.log以指定路径下的子目录结尾的日志文件。

"/path/to/logs/{app1,app2,app3}/data.log"

匹配的应用程序的日志文件app1app2以及app3指定路径下的子目录。

 

1.10.转换摄取节点管道

在实施摄取管道以解析数据之后,您可能决定要利用Logstash中更丰富的转换功能。例如,如果要执行以下操作,则可能需要使用Logstash而不是摄取管道:

  • 从更多输入中摄取。Logstash可以本地从许多其他来源(如TCP,UDP,syslog和关系数据库)中提取数据。
  • 使用多个输出。Ingest节点被设计为仅支持Elasticsearch作为输出,但您可能希望使用多个输出。例如,您可能希望将传入数据存档到S3以及在Elasticsearch中对其进行索引。
  • 利用Logstash中更丰富的转换功能,例如外部查找。
  • 在摄取数据时使用持久队列功能来处理尖峰(来自Beats和其他来源)。

为了便于您迁移配置,Logstash提供了一个摄取管道转换工具。转换工具将摄取管道定义作为输入,并在可能的情况下创建等效的Logstash配置作为输出。

有关工具限制的完整列表,请参阅限制

 

1.10.1.运行工具

您将在Logstash安装目录bin中找到转换工具。请参阅Logstash目录布局以查找bin系统上的位置。

要运行转换工具,请使用以下命令:

bin/ingest-convert.sh --input INPUT_FILE_URI --output OUTPUT_FILE_URI [--append-stdio]

Where:

  • INPUT_FILE_URI 是一个文件URI,它指定定义摄取节点管道的JSON文件的完整路径。
  • OUTPUT_FILE_URI 是将由该工具生成的Logstash DSL文件的文件URI。
  • --append-stdio 是一个可选标志,它将stdin和stdout部分添加到配置中,而不是添加默认的Elasticsearch输出。

此命令需要文件URI,因此请确保使用正斜杠并指定文件的完整路径。

例如:

bin/ingest-convert.sh --input file:///tmp/ingest/apache.json --output file:///tmp/ingest/apache.conf

 

1.10.2.限制

  • 不支持无痛脚本转换。
  • 转换仅支持可用处理器的子集 。对于不受支持的处理器,该工具会生成警告并继续尽力转换。

 

1.10.3.支持的处理器

此工具目前支持以下摄取节点处理器进行转换:

  • Append
  • Convert
  • Date
  • GeoIP
  • Grok
  • Gsub
  • Json
  • Lowercase
  • Rename
  • Set

 

1.11.Logstash-to-Logstash通信

您可以通过将Lumberjack输出连接到Beats输入来设置两个Logstash计算机之间的通信。例如,如果数据路径跨越网络或防火墙边界,则可能需要此配置。如果您没有迫切需要Logstash-to-Logstash通信,那么请不要实现它。

如果要查找有关在一个Logstash实例中连接多个管道的信息,请参阅管道到管道通信(Beta)

 

1.11.1.配置概述

使用Lumberjack协议连接两台Logstash机器。

  1. 生成受信任的SSL证书( 要求lumberjack协议)。
  2. 将SSL证书复制到上游Logstash计算机。
  3. 将SSL证书和密钥复制到下游Logstash计算机。
  4. 设置上游Logstash机器以使用Lumberjack输出发送数据。
  5. 设置下游Logstash机器以通过Beats输入侦听传入的Lumberjack连接。
  6. 测试一下。

 

1.11.2.生成自签名SSL证书和密钥

使用该openssl req命令生成自签名证书和密钥。该openssl req命令适用于某些操作系统。您可能需要为其他人安装openssl命令行程序。

运行以下命令:

openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout lumberjack.key -out lumberjack.cert -subj /CN=localhost
  • lumberjack.key 是要创建的SSL密钥的名称
  • lumberjack.cert 是要创建的SSL证书的名称
  • localhost 是上游Logstash计算机的名称

此命令生成类似于以下内容的输出:

Generating a 2048 bit RSA private key
.................................+++
....................+++
writing new private key to 'lumberjack.key'

1.11.3.复制SSL证书和密钥

将SSL证书复制到上游Logstash计算机。

将SSL证书和密钥复制到下游Logstash计算机。

 

1.11.4.启动上游Logstash实例

启动Logstash并生成测试事件:

bin/logstash -e 'input { generator { count => 5 } } output { lumberjack { codec => json hosts => "mydownstreamhost" ssl_certificate => "lumberjack.cert" port => 5000 } }'

此示例命令使用提供的SSL证书向mydownstreamhost:5000发送五个事件。

 

1.11.5.启动下游Logstash实例

启动Logstash的下游实例:

bin/logstash -e 'input { beats { codec => json port => 5000 ssl => true ssl_certificate => "lumberjack.cert" ssl_key => "lumberjack.key"} }'

此示例命令设置端口5000以侦听传入的Beats输入。

 

1.11.6.验证通信

观察下游Logstash机器以获取传入事件。您应该看到五个类似于以下的递增事件:

{
  "@timestamp" => 2018-02-07T12:16:39.415Z,
  "sequence"   => 0
  "tags"       => [
    [0] "beats_input_codec_json_applied"
  ],
  "message"    => "Hello world",
  "@version"   => "1",
  "host"       => "ls1.semicomplete.com"
}

 

1.12.配置集中管道管理【X-Pack】

要配置 集中管道管理

  1. 确认您使用的是包含管道管理功能的许可证。

    有关更多信息,请参阅https://www.elastic.co/subscriptions和 许可证管理

  2. logstash.yml 文件中指定 配置管理设置。至少设置:

    • xpack.management.enabled: true 启用集中配置管理。
    • xpack.management.elasticsearch.hosts 指定将存储Logstash管道配置和元数据的Elasticsearch实例。
    • xpack.management.pipeline.id 注册要集中管理的管道。
  3. 重新启动Logstash。
  4. 如果您的Elasticsearch集群受基本身份验证保护,请将该logstash_admin角色分配给将使用集中管道管理的任何用户。请参阅X-Pack安全性

在配置和启用X-Pack安全性之前,将禁用集中管理。

在将Logstash配置为使用集中管道管理之后,您将无法再指定本地管道配置。这意味着启用此功能时,pipelines.yml文件和设置类似于path.config和 config.string处于非活动状态。

 

1.12.1.Logstash 配置管理设置

您可以设置以下xpack.management设置logstash.yml以启用 集中管道管理。有关配置Logstash的更多信息,请参阅logstash.yml

以下示例显示了假设Elasticsearch和Kibana安装在localhost上并且启用了基本AUTH但没有SSL的基本设置。如果您使用的是SSL,则需要指定其他SSL设置。

xpack.management.enabled: true
xpack.management.elasticsearch.hosts: "http://localhost:9200/"
xpack.management.elasticsearch.username: logstash_admin_user
xpack.management.elasticsearch.password: t0p.s3cr3t
xpack.management.logstash.poll_interval: 5s
xpack.management.pipeline.id: ["apache", "cloudwatch_logs"]
  • xpack.management.enabled

          设置为true为Logstash启用X-Pack集中配置管理。

  • xpack.management.logstash.poll_interval

           Logstash实例多长时间轮询Elasticsearch的管道更改。默认值为5秒。

  • xpack.management.pipeline.id

          指定以逗号分隔的管道ID列表,以注册集中管道管理。更改此设置后,您需要重新启动Logstash以获取更改。

  • xpack.management.elasticsearch.hosts

          将存储Logstash管道配置和元数据的Elasticsearch实例。这可能与outputs Logstash配置中的部分中指定的Elasticsearch实例相同,也可能是其他实例。默认为 http://localhost:9200

  • xpack.management.elasticsearch.username 和 xpack.management.elasticsearch.password

          如果您的Elasticsearch集群受基本身份验证保护,则这些设置提供Logstash实例用于进行身份验证以访问配置数据的用户名和密码。您在此处指定的用户名应具有该logstash_admin角色,该角色提供对.logstash-* 用于管理配置的索引的访问。

  • xpack.management.elasticsearch.ssl.certificate_authority

          可选设置,使您可以.pem为Elasticsearch实例的证书颁发机构指定文件的路径。

  • xpack.management.elasticsearch.ssl.truststore.path

          可选设置,提供Java密钥库(JKS)的路径以验证服务器的证书。

  • xpack.management.elasticsearch.ssl.truststore.password

          可选设置,为信任库提供密码。

  • xpack.management.elasticsearch.ssl.keystore.path

          可选设置,提供Java密钥库(JKS)的路径以验证客户端的证书。

  • xpack.management.elasticsearch.ssl.keystore.password

          可选设置,为密钥库提供密码。

 

1.13.X-Pack监控(配置Logstash节点的监控)

要监视Logstash节点:

  1. 确定监控数据的发送位置。此群集通常称为生产群集。有关典型监视体系结构的示例,请参阅 监视工作原理

     

    要将Logstash可视化为Elastic Stack的一部分(如步骤6所示),请将指标发送到生产群集。将度量标准发送到专用监视集群将显示监视集群下的Logstash度量标准。

  2. 验证该xpack.monitoring.collection.enabled设置是否true在生产群集上。如果是该设置false,则在Elasticsearch中禁用监视数据的集合,并从所有其他源中忽略数据。
  3. 配置Logstash节点以通过设置在logstash.yml文件中的xpack.monitoring.elasticsearch.hosts 来发送指标。如果启用了X-Pack安全性,则还需要指定内置logstash_system用户的凭据 。有关这些设置的详细信息,请参阅监控设置

    xpack.monitoring.elasticsearch.hosts: ["http://es-prod-node-1:9200", "http://es-prod-node-2:9200"] 
    xpack.monitoring.elasticsearch.username: "logstash_system" 
    xpack.monitoring.elasticsearch.password: "changeme"

    xpack.monitoring.elasticsearch.hosts:如果在生产群集上启用了SSL / TLS,则必须通过HTTPS进行连接。从v5.2.1开始,您可以将多个Elasticsearch主机指定为数组,并将单个主机指定为字符串。如果指定了多个URL,则Logstash可以将请求循环到这些生产节点。

    xpack.monitoring.elasticsearch.username:如果在生产群集上禁用了X-Pack安全性,则可以省略这些 usernamepassword设置。

  4. 如果在生产Elasticsearch集群上启用了SSL / TLS,请指定将用于验证集群中节点标识的可信CA证书。

    要将CA证书添加到Logstash节点的可信证书,您可以使用以下certificate_authority设置指定PEM编码证书的位置 :

    xpack.monitoring.elasticsearch.ssl.certificate_authority: /path/to/ca.crt
    

    或者,您可以使用信任库(包含证书的Java密钥库文件)配置受信任证书:

    xpack.monitoring.elasticsearch.ssl.truststore.path: /path/to/file
    xpack.monitoring.elasticsearch.ssl.truststore.password: password

    此外,您可以选择使用密钥库(包含证书的Java密钥库文件)设置客户端证书:

    xpack.monitoring.elasticsearch.ssl.keystore.path: /path/to/file
    xpack.monitoring.elasticsearch.ssl.keystore.password: password

    设置嗅探以true启用Elasticsearch集群的其他节点的发现。它默认为false

    xpack.monitoring.elasticsearch.sniffing: false
  5. 重新启动Logstash节点。
  6. 要验证X-Pack监视配置,请将Web浏览器指向Kibana主机,然后从侧面导航中选择“ 监视 ”。Logstash部分中应显示Logstash节点报告的度量标准。启用安全性后,要查看监视仪表板,您必须以具有kibana_usermonitoring_user角色的用户身份登录Kibana 。

 

1.13.1.升级后重新启用Logstash监控

从旧版本的X-Pack升级时,logstash_system 出于安全原因禁用内置用户。要恢复监视,请 更改密码并重新启用logstash_system用户

 

1.13.2.在Logstash 监控设置

您可以设置以下xpack.monitoring设置logstash.yml以控制从Logstash节点收集监视数据的方式。但是,默认情况下在大多数情况下效果最佳。有关配置Logstash的更多信息,请参阅logstash.yml

 

1.13.3.常规监控设置

  • xpack.monitoring.enabled

        默认情况下禁用监控。设置为true启用X-Pack监控。

  • xpack.monitoring.elasticsearch.hosts

        要将Logstash指标发送到的Elasticsearch实例。这可能与outputsLogstash配置中的部分中指定的Elasticsearch实例相同,也可能是其他实例。这不是专用监控集群的URL。即使您使用的是专用监控集群,也必须通过生产集群路由Logstash指标。您可以将单个主机指定为字符串,也可以将多个主机指定为数组。默认为 http://localhost:9200

  • xpack.monitoring.elasticsearch.username 和 xpack.monitoring.elasticsearch.password

        如果您的Elasticsearch受基本身份验证保护,则这些设置会提供Logstash实例用于对传送监视数据进行身份验证的用户名和密码。

 

1.13.4.X-Pack监控TLS / SSL设置

您可以配置以下传输层安全性(TLS)或安全套接字层(SSL)设置。有关更多信息,请参阅 配置Logstash监控的凭据

  • xpack.monitoring.elasticsearch.ssl.certificate_authority

       可选设置,使您可以.pem为Elasticsearch实例的证书颁发机构指定文件的路径。

  • xpack.monitoring.elasticsearch.ssl.truststore.path

       可选设置,提供Java密钥库(JKS)的路径以验证服务器的证书。

  • xpack.monitoring.elasticsearch.ssl.truststore.password

       为信任库提供密码的可选设置。

  • xpack.monitoring.elasticsearch.ssl.keystore.path

       可选设置,提供Java密钥库(JKS)的路径以验证客户端的证书。

  • xpack.monitoring.elasticsearch.ssl.keystore.password

       为密钥库提供密码的可选设置。

 

1.14.X-Pack安全性

1.14.1.在Logstash配置安全性

Logstash Elasticsearch插件(输出, 输入, 过滤 和监视)支持HTTP上的身份验证和加密。

要将Logstash与安全群集一起使用,您需要为Logstash配置身份验证凭据。如果身份验证失败,Logstash会抛出异常并停止处理管道。

如果在群集上启用了加密,则还需要在Logstash配置中启用TLS / SSL。

如果要使用X-Pack监视来监视Logstash实例,并将监视数据存储在安全的Elasticsearch集群中,则必须使用具有相应权限的用户的用户名和密码配置Logstash。

除了为Logstash配置身份验证凭据之外,还需要授予授权用户访问Logstash索引的权限。

 

1.14.2.配置Logstash以使用基本身份验证

Logstash需要能够管理索引模板,创建索引,以及在它创建的索引中写入和删除文档。

要为Logstash设置身份验证凭据:

  1. 使用Kibana中UI上的 Management> Roles  或  role API 上创建 logstash_writer角色。对于群集权限,请添加manage_index_templatesmonitor。对于指数的特权,加writecreatedelete,和create_index

    如果您计划使用索引的生命周期管理,还增加manage_ilm了集群,managemanage_ilm为指数。

    POST _xpack/security/role/logstash_writer
    {
      "cluster": ["manage_index_templates", "monitor", "manage_ilm"], 
      "indices": [
        {
          "names": [ "logstash-*" ], 
          "privileges": ["write","create","delete","create_index","manage","manage_ilm"]  
        }
      ]
    }

    cluster:  manage_ilm如果 启用了索引生命周期管理,则群集需要该权限 。

    name:  如果使用自定义Logstash索引模式,请指定自定义模式而不是默认logstash-*模式。

    privileges: 如果启用了索引生命周期管理,则该角色需要managemanage_ilm 权限来加载索引生命周期策略,创建转滚别名以及创建和管理转滚索引。

  2. 创建logstash_internal用户并为其分配logstash_writer角色。您可以从Kibana中UI的Management > Users或通过 user API 创建用户:

    POST _xpack/security/user/logstash_internal
    {
      "password" : "x-pack-test-password",
      "roles" : [ "logstash_writer"],
      "full_name" : "Internal Logstash User"
    }
  3. 您刚刚创建的用户以logstash_internal进行身份验证来配置Logstash。在Logstash .conf文件中,您可以为每个Elasticsearch插件单独配置凭据。例如:

    input {
      elasticsearch {
        ...
        user => logstash_internal
        password => x-pack-test-password
      }
    }
    filter {
      elasticsearch {
        ...
        user => logstash_internal
        password => x-pack-test-password
      }
    }
    output {
      elasticsearch {
        ...
        user => logstash_internal
        password => x-pack-test-password
      }
    }

 

1.14.3.授予用户访问Logstash Indices(索引)权限

要访问Logstash创建的索引,用户需要read和 view_index_metadata权限:

  1. 创建一个logstash_reader的角色,该角色具有readview_index_metadata权限。您可以从Kibana中UI的Management > Roles  或通过 role API 创建角色 :

    POST _xpack/security/role/logstash_reader
    {
      "indices": [
        {
          "names": [ "logstash-*" ], 
          "privileges": ["read","view_index_metadata"]
        }
      ]
    }

    name: 如果使用自定义Logstash索引模式,请指定该模式而不是默认logstash-*模式。

  2. 为Logstash用户分配logstash_reader角色。如果Logstash用户将使用 集中管道管理,则还要分配logstash_admin角色。您可以从Kibana中 UI的Management > Users或通过user API 创建和管理用户:

    POST _xpack/security/user/logstash_user
    {
      "password" : "x-pack-test-password",
      "roles" : [ "logstash_reader", "logstash_admin"], 
      "full_name" : "Kibana User for Logstash"
    }

    roles: logstash_admin是一个内置角色,提供对  .logstash-* 用于管理配置的索引的访问。

1.14.4.配置Elasticsearch输出以使用PKI身份验证

elasticsearch输出支持PKI认证。要使用X.509客户端证书进行身份验证,请在Logstash .conf文件中配置keystore和 keystore_password选项:

output {
  elasticsearch {
    ...
    keystore => /path/to/keystore.jks
    keystore_password => realpassword
    truststore =>  /path/to/truststore.jks 
    truststore_password =>  realpassword
  }
}

              truststore: 如果使用单独的信任库,则还需要信任库路径和密码。

 

1.14.5.配置Logstash以使用TLS加密

如果在Elasticsearch集群上启用了TLS加密,则需要在Logstash .conf文件中配置sslcacert选项:

output {
  elasticsearch {
    ...
    ssl => true
    cacert => '/path/to/cert.pem' 
  }
}
                   cacert: 包含证书颁发机构证书的本地.pem文件的路径。

 

1.14.6.配置Logstash Monitoring的凭据

如果您计划将Logstash 监控 数据发送到安全集群,则需要配置Logstash用于对运输监控数据进行身份验证的用户名和密码。

为此,X-Pack安全性预先配置了 logstash_system内置用户。此用户具有监视功能所需的最低权限,应用于任何其他目的 - 它特别不适用于 Logstash管道。

默认情况下,logstash_system用户没有密码。在设置密码之前,不会启用用户。通过更改密码API设置密码:

PUT _xpack/security/user/logstash_system/_password
{
  "password": "t0p.s3cr3t"
}

然后在logstash.yml配置文件中配置用户和密码:

xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: t0p.s3cr3t

如果您最初安装了旧版本的X-Pack,然后进行了升级,则出于安全原因, logstash_system用户可能已默认使用disabled。您可以通过userAPI 启用用户:

PUT _xpack/security/user/logstash_system/_enable

1.14.7.配置集中管道管理的凭据

如果您计划使用Logstash 集中管道管理,则需要配置Logstash用于管理配置的用户名和密码。

您在logstash.yml配置文件中配置用户和密码:

xpack.management.elasticsearch.username: logstash_admin_user 
xpack.management.elasticsearch.password: t0p.s3cr3t

   xpack.management.elasticsearch.username:    您在此处指定的用户必须具有内置logstash_admin角色以及您之前创建的logstash_writer角色。

 

1.15.X-Pack设置

您可以配置设置,在对X-Pack功能elasticsearch.yml, kibana.yml以及logstash.yml配置文件。您还可以使用群集更新设置API动态更新某些设置 。

X-Pack功能Elasticsearch设置Kibana设置Logstash设置

APM UI

No

Yes

No

跨群集复制(Cross cluster replication)

Yes

No

No

开发工具(Development Tools)

No

Yes

No

图形(Graph)

No

Yes

No

基础设施UI(Infrastructure UI)

No

Yes

No

Logs UI

No

Yes

No

机器学习(Machine learning)

Yes

Yes

No

管理(Management)

No

No

Yes

监控(Monitoring)

Yes

Yes

Yes

报告(Reporting)

No

Yes

No

安全(Security)

  • 审计(Auditing)

Yes

Yes

No

Yes

No

No

Watcher

Yes

No

No

还有X-Pack许可证设置中 elasticsearch.yml的文件。

有关更多Logstash配置设置,请参阅logstash.yml

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值