一、关于Filebeat 当你要面对成百上千、甚至成千上万的服务器、虚拟机和容器生成的日志时，请告别 SSH 吧！Filebeat 将为你提供一种轻量型方法，用于转发和汇总日志与文件，让简单的事情不再繁杂。 轻量级日志采集器。 输送至 Elasticsearch 或 Logstash，在 Kibana 中实现可视化。 二、Filebeat如何工作 Filebeat由两个主要组件组成：inputs 和 harvesters。这些组件一起工作以跟踪文件，并将事件数据发送到你指定的输出。 2.1、harvester是什么 一个harvester负责读取一个单个文件的内容。 harvester逐行读取每个文件（一行一行地读取每个文件），并把这些内容发送到输出。 每个文件启动一个harvester。 harvester负责打开和关闭这个文件，这就意味着在harvester运行时文件描述符保持打开状态。 在harvester正在读取文件内容的时候，文件被删除或者重命名了，那么Filebeat会续读这个文件。这就有一个问题了，就是只要负责这个文件的harvester没用关闭，那么磁盘空间就不会释放。默认情况下，Filebeat保存文件打开直到close_inactive到达。 2.2、input是什么 一个input负责管理harvesters，并找到所有要读取的源。 如果input类型是log，则input查找驱动器上与已定义的glob路径匹配的所有文件，并为每个文件启动一个harvester。 每个input都在自己的Go例程中运行。 下面的例子配置Filebeat从所有匹配指定的glob模式的文件中读取行： filebeat.inputs: - type: log paths: - /var/log/*.log - /var/path2/*.log 2.3、Filebeat如何保持文件状态 Filebeat保存每个文件的状态，并经常刷新状态到磁盘上的注册文件（registry）。状态用于记住harvester读取的最后一个偏移量，并确保所有日志行被发送（到输出）。如果输出，比如Elasticsearch 或者 Logstash等，无法访问，那么Filebeat会跟踪已经发送的最后一行，并只要输出再次变得可用时继续读取文件。当Filebeat运行时，会将每个文件的状态新保存在内存中。当Filebeat重新启动时，将使用注册文件中的数据重新构建状态，Filebeat将在最后一个已知位置继续每个harvester。 对于每个输入，Filebeat保存它找到的每个文件的状态。因为文件可以重命名或移动，所以文件名和路径不足以标识文件。对于每个文件，Filebeat存储惟一标识符，以检测文件是否以前读取过。 如果你的情况涉及每天创建大量的新文件，你可能会发现注册表文件变得太大了。 （Filebeat保存每个文件的状态，并将状态保存到registry_file中的磁盘。当重新启动Filebeat时，文件状态用于在以前的位置继续读取文件。如果每天生成大量新文件，注册表文件可能会变得太大。为了减小注册表文件的大小，有两个配置选项可用：clean_remove和clean_inactive。对于你不再访问且被忽略的旧文件，建议您使用clean_inactive。如果想从磁盘上删除旧文件，那么使用clean_remove选项。） 2.4、Filebeat如何确保至少投递一次（at-least-once）？ Filebeat保证事件将被投递到配置的输出中至少一次，并且不会丢失数据。Filebeat能够实现这种行为，因为它将每个事件的投递状态存储在注册表文件中。 在定义的输出被阻塞且没有确认所有事件的情况下，Filebeat将继续尝试发送事件，直到输出确认收到事件为止。 如果Filebeat在发送事件的过程中关闭了，则在关闭之前它不会等待输出确认所有事件。当Filebeat重新启动时，发送到输出（但在Filebeat关闭前未确认）的任何事件将再次发送。这确保每个事件至少被发送一次，但是你最终可能会将重复的事件发送到输出。你可以通过设置shutdown_timeout选项，将Filebeat配置为在关闭之前等待特定的时间。 三、模块 Filebeat模块简化了公共日志格式的收集、解析和可视化。 一个典型的模块（例如，对于Nginx日志）是由一个或多个fileset组成的（以Nginx为例，access 和 error）。 一个fileset包含以下内容： Filebeat 输入配置，其中包含要默认的查找或者日志文件路径。这些默认路径取决于操作系统。Filebeat配置还负责在需要的时候拼接多行事件。 Elasticsearch Ingest Node 管道定义，用于解析日志行。 字段定义，用于为每个字段在Elasticsearch中配置正确类型。它们还包含每个字段的简短描述。 简单的Kibana dashboards，用于可视化日志文件。 Filebeat会根据你的环境自动调整这些配置，并将它们加载到相应的 Elastic stack 组件中。 3.1、常用日志格式的模块 Filebeat提供了一组预先构建的模块，你可以使用这些模块快速实现并部署一个日志监控解决方案，包括样例指示板和数据可视化，完成这些大约只需要5分钟。 这些模块支持常见的日志格式，如Nginx、Apache2和MySQL，可以通过一个简单的命令来运行。 3.1.1、先决条件 在运行Filebeat模块之前： 安装并配置Elastic stack 完成Filebeat的安装 安装 Ingest Node GeoIP 和 User Agent 插件。这些插件用来捕获地理位置和浏览器信息，以供可视化组件所用 检查Elasticsearch和Kibana是否正在运行，以及Elasticsearch是否准备好从Filebeat那里接收数据 可以在Elasticsearch主目录下运行下列命令来安装这些插件： sudo bin/elasticsearch-plugin install ingest-geoip sudo bin/elasticsearch-plugin install ingest-user-agent 然后，重启Elasticsearch。 3.1.2、运行Filebeat模块： 第1步：在filebeat.yml配置文件中设置Elasticsearch安装的位置。默认情况下，Filebeat假设Elasticsearch运行在9200端口上。 如果是运行在Elastic Cloud上，指定你的Cloud ID。例如： cloud.id: "staging:dXMtZWFzdC0xLmlOTYyNTc0Mw==" 如果是运行在自己的硬件设备上，设置主机和端口。例如： output.elasticsearch: hosts: ["myEShost:9200"] 第2步：如果Elasticsearch配置了安全策略，需要在filebeat.yml中指定访问的凭证。 如果运行在Elastic Cloud上，请指定授权凭证。例如： cloud.auth: "elastic:YOUR_PASSWORD" 如果运行在自己的硬件设备上，请指定Elasticsearch和Kibana凭证。例如： output.elasticsearch: hosts: ["myEShost:9200"] username: "filebeat_internal" password: "YOUR_PASSWORD" setup.kibana: host: "mykibanahost:5601" username: "my_kibana_user" password: "YOUR_PASSWORD" 第3步：启用想运行的模块。例如： ./filebeat modules enable system nginx mysql 第4步：设置初始环境： ./filebeat setup -e 第5步：运行Filebeat。 ./filebeat -e 第6步：在Kibana中查看数据。 3.1.3、设置路径变量 每个模块和fileset都有变量，你可以设置它们，以改变模块的默认行为，包括模块查找日志文件的路径。 可以在配置文件或者命令行下设置这些路径。例如： - module: nginx access: var.paths: ["/var/log/nginx/access.log*"] 或者 ./filebeat -e -M "nginx.access.var.paths=[/usr/local/var/log/nginx/access.log*]" 3.2、Nginx模块 nginx模块解析Nginx创建的access和error日志。 当你运行模块的时候，它在底层执行一些任务： 设置默认的日志文件路径。 确保将每个多行日志事件作为单个事件发送。 使用ingest节点解析和处理日志行，将数据塑造成适合在Kibana中可视化的结构。 部署显示日志数据的dashboards。 这个模块需要 ingest-user-agent 和 ingest-geoip 两个Elasticsearch插件。 3.2.1、设置并运行模块 第1步：启用模块 ./filebeat modules enable nginx 为了查看启用或者禁用的模块列表，运行： ./filebeat modules list 第2步：设置初始环境 ./filebeat setup -e 第3步：运行 ./filebeat -e 3.3、Kafka模块 3.3.1、配置 - module: kafka log: enabled: true var.paths: - "/path/to/logs/controller.log*" - "/path/to/logs/server.log*" - "/path/to/logs/state-change.log*" - "/path/to/logs/kafka-*.log*" 或者 -M "kafka.log.var.paths=[/path/to/logs/controller.log*, /path/to/logs/server.log*, /path/to/logs/state-change.log*, /path/to/logs/kafka-*.log*]" 四、配置Filebeat 为了配置Filebeat，你可以编辑配置文件 filebeat.yml。还有一个完整的配置文件示例 filebeat.reference.yml 。 4.1、指定运行哪个模块 Filebeat提供了几种启用模块的不同方式： 用modules.d目录下的配置启用模块 运行Filebeat的时候启用模块 用filebeat.yml启用模块配置 1、用modules.d目录启用模块配置 ./filebeat modules enable apache2 mysql 2、运行Filebeat是启用模块 ./filebeat --modules nginx,mysql,system 3、在filebeat.yml中启用模块 如果可能的话，应该用modules.d目录下的配置文件： filebeat.modules: - module: nginx - module: mysql - module: system 4.2、配置inputs 为了手动配置Filebeat（代替用模块），可以在filebeat.yml中的filebeat.inputs区域下指定一个inputs列表。 列表时一个YMAL数组，并且你可以指定多个inputs，相同input类型也可以指定多个。例如： filebeat.inputs: - type: log paths: - /var/log/system.log - /var/log/wifi.log - type: log paths: - "/var/log/apache2/*" fields: apache: true fields_under_root: true 4.2.1、Log input 从日志文件读取行 为了配置这种input，需要指定一个paths列表，列表中的每一项必须能够定位并抓取到日志行。例如： filebeat.inputs: - type: log paths: - /var/log/messages - /var/log/*.log 还可以应用设置其它额外的配置项（比如，fields, include_lines, exclude_lines, multiline等等）来从这些文件中读取行。设置的这些配置对所有这种类型的input在获取日志行的时候都生效。 为了对不同的文件应用不同的配置，需要定义多个input区域： filebeat.inputs: - type: log # 从system.log和wifi.log中读取日志行 paths: - /var/log/system.log - /var/log/wifi.log - type: log # 从apache2目录下的每一个文件中读取日志行，并且在输出的时候会加上额外的字段apache paths: - "/var/log/apache2/*" fields: apache: true fields_under_root: true 配置项： paths 例如：/var/log//.log 将会抓取/var/log子目录目录下所有.log文件。它不会从/var/log本身目录下的日志文件。如果你应用recursive_glob设置的话，它将递归地抓取所有子目录下的所有.log文件。 recursive_glob.enabled 允许将扩展为递归glob模式。启用这个特性后，每个路径中最右边的被扩展为固定数量的glob模式。例如：/foo/扩展到/foo， /foo/， /foo/，等等。如果启用，它将单个扩展为8级深度模式。这个特性默认是启用的，设置recursive_glob.enabled为false可以禁用它。 encoding 读取的文件的编码 下面是一些W3C推荐的简单的编码： plain, latin1, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, hz-gb-2312、euc-kr, euc-jp, iso-2022-jp, shift-jis, 等等 plain编码是特殊的，因为它不校验或者转换任何输入。 exclude_lines 一组正则表达式，用于匹配你想要排除的行。Filebeat会删除，这组正则表达式匹配的行。默认情况下，没有行被删除。空行被忽略。 如果指定了multiline，那么在用exclude_lines过滤之前会将每个多行消息合并成一个单行。（PS：也就是说，多行合并成单行后再支持排除行的过滤） 下面的例子配置Filebeat删除以DBG开头的行： filebeat.inputs: - type: log ... exclude_lines: ['^DBG'] include_lines 一组正则表达式，用于匹配你想要包含的行。Filebeat只会导出那些匹配这组正则表达式的行。默认情况下，所有的行都会被导出。空行被忽略。 如果指定了multipline设置，每个多行消息先被合并成单行以后再执行include_lines过滤。 下面是一个例子，配置Filebeat导出以ERR或者WARN开头的行： filebeat.inputs: - type: log ... include_lines: ['^ERR', '^WARN'] （如果 include_lines 和 exclude_lines 都被定义了，那么Filebeat先执行 include_lines 后执行 exclude_lines，而与这两个选项被定义的顺序没有关系。include_lines 总是在 exclude_lines选项前面执行，即使在配置文件中 exclude_lines 出现在 include_lines的前面。） 下面的例子导出那些除了以DGB开头的所有包含sometext的行： filebeat.inputs: - type: log ... include_lines: ['sometext'] exclude_lines: ['^DBG'] harvester_buffer_size 当抓取一个文件时每个harvester使用的buffer的字节数。默认是16384。 max_bytes 单个日志消息允许的最大字节数。超过max_bytes的字节将被丢弃且不会被发送。对于多行日志消息来说这个设置是很有用的，因为它们往往很大。默认是10MB（10485760）。 json 这些选项使得Filebeat将日志作为JSON消息来解析。例如： json.keys_under_root: true json.add_error_key: true json.message_key: log 为了启用JSON解析模式，你必须至少指定下列设置项中的一个： keys_under_root 默认情况下，解码后的JSON被放置在一个以"json"为key的输出文档中。如果你启用这个设置，那么这个key在文档中被复制为顶级。默认是false。 overwrite_keys 如果keys_under_root被启用，那么在key冲突的情况下，解码后的JSON对象将覆盖Filebeat正常的字段 add_error_key 如果启用，则当JSON反编排出现错误的时候Filebeat添加 “error.message” 和 "error.type: json"两个key，或者当没有使用message_key的时候。 message_key 一个可选的配置，用于在应用行过滤和多行设置的时候指定一个JSON key。指定的这个key必须在JSON对象中是顶级的，而且其关联的值必须是一个字符串，否则没有过滤或者多行聚集发送。 ignore_decoding_error 一个可选的配置，用于指定是否JSON解码错误应该被记录到日志中。如果设为true，错误将被记录。默认是false。 multiline 用于控制Filebeat如何扩多行处理日志消息 exclude_files 一组正则表达式，用于匹配你想要忽略的文件。默认没有文件被排除。 下面是一个例子，忽略.gz的文件 filebeat.inputs: - type: log ... exclude_files: ['\.gz$'] ignore_older 如果启用，那么Filebeat会忽略在指定的时间跨度之前被修改的文件。如果你想要保留日志文件一个较长的时间，那么配置ignore_older是很有用的。例如，如果你想要开始Filebeat，但是你只想发送最近一周最新的文件，这个情况下你可以配置这个选项。 可以用时间字符串，比如2h（2小时），5m（5分钟）。默认是0，意思是禁用这个设置。 必须设置ignore_older比close_inactive更大。 close_* close_*配置项用于在一个确定的条件或者时间点之后关闭harvester。关闭harvester意味着关闭文件处理器。如果在harvester关闭以后文件被更新，那么在scan_frequency结束后改文件将再次被拾起。然而，当harvester关闭的时候如果文件被删除或者被移动，那么Filebeat将不会被再次拾起，并且这个harvester还没有读取的数据将会丢失。 close_inactive 当启用此选项时，如果文件在指定的持续时间内未被获取，则Filebeat将关闭文件句柄。当harvester读取最后一行日志时，指定周期的计数器就开始工作了。它不基于文件的修改时间。如果关闭的文件再次更改，则会启动一个新的harvester，并且在scan_frequency结束后，将获得最新的更改。 推荐给close_inactive设置一个比你的日志文件更新的频率更大一点儿的值。例如，如果你的日志文件每隔几秒就会更新，你可以设置close_inactive为1m。如果日志文件的更新速率不固定，那么可以用多个配置。 将close_inactive设置为更低的值意味着文件句柄可以更早关闭。然而，这样做的副作用是，如果harvester关闭了，新的日志行不会实时发送。 关闭文件的时间戳不依赖于文件的修改时间。代替的，Filebeat用一个内部时间戳来反映最后一次读取文件的时间。例如，如果close_inactive被设置为5分钟，那么在harvester读取文件的最后一行以后，这个5分钟的倒计时就开始了。 可以用时间字符串，比如2h（2小时），5m（5分钟）。默认是5m。 close_renamed 当启用此选项时，Filebeat会在重命名文件时关闭文件处理器。默认情况下，harvester保持打开状态并继续读取文件，因为文件处理器不依赖于文件名。如果启用了close_rename选项，并且重命名或者移动的文件不再匹配文件模式的话，那么文件将不会再次被选中。Filebeat将无法完成文件的读取。 close_removed 当启用此选项时，Filebeat会在删除文件时关闭harvester。通常，一个文件只有在它在由close_inactive指定的期间内不活跃的情况下才会被删除。但是，如果一个文件被提前删除，并且你不启用close_removed，则Filebeat将保持文件打开，以确保harvester已经完成。如果由于文件过早地从磁盘中删除而导致文件不能完全读取，请禁用此选项。 close_timeout 当启用此选项是，Filebeat会给每个harvester一个预定义的生命时间。无论读到文件的什么位置，只要close_timeout周期到了以后就会停止读取。当你想要在文件上只花费预定义的时间时，这个选项对旧的日志文件很有用。尽管在close_timeout时间以后文件就关闭了，但如果文件仍然在更新，则Filebeat将根据已定义的scan_frequency再次启动一个新的harvester。这个harvester的close_timeout将再次启动，为超时倒计时。 scan_frequency Filebeat多久检查一次指定路径下的新文件（PS：检查的频率）。例如，如果你指定的路径是 /var/log/* ，那么会以指定的scan_frequency频率去扫描目录下的文件（PS：周期性扫描）。指定1秒钟扫描一次目录，这还不是很频繁。不建议设置为小于1秒。 如果你需要近实时的发送日志行的话，不要设置scan_frequency为一个很低的值，而应该调整close_inactive以至于文件处理器保持打开状态，并不断地轮询你的文件。 默认是10秒。 scan.sort 如果你指定了一个非空的值，那么你可以决定用scan.order的升序或者降序。可能的值是 modtime 和 filename。为了按文件修改时间排序，用modtime，否则用 filename。默认此选项是禁用的。 scan.order 可能的值是 asc 或者 desc。默认是asc。 这里再重点说一下 ignore_older , close_inactive , scan_frequency 这三个配置项： ignore_older： 它是设置一个时间范围（跨度），不在这个跨度范围之内的文件更新都不管 scan_frequency： 它设置的是扫描文件的频率，看看文件是否更新 close_inactive：它设置的是文件如果多久没更新的话就关闭文件句柄，它是有一个倒计时，如果在倒计时期间，文件没有任何变化，则当倒计时结束的时候关闭文件句柄。不建议设置为小于1秒。 如果文件句柄关了以后，文件又被更新，那么在下一个扫描周期结束的时候变化发现这个改变，于是会再次打开这个文件读取日志行，前面我们也提到过，每个文件上一次读到什么位置（偏移量）都记录在registry文件中。） 4.3、管理多行消息 Filebeat获取的文件可能包含跨多行文本的消息。例如，多行消息在包含Java堆栈跟踪的文件中很常见。为了正确处理这些多行事件，需要在filebeat.yml中配置multiline以指定哪一行是单个事件的一部分。 4.3.1、配置项 可以在filebeat.yml的filebeat.inputs区域指定怎样处理跨多行的消息。例如： multiline.pattern: '^\[' multiline.negate: true multiline.match: after 上面的例子中，Filebeat将所有不以 [ 开始的行与之前的行进行合并。 multiline.pattern 指定用于匹配多行的正则表达式 multiline.negate 定义模式是否被否定。默认false。 multiline.match 指定Filebeat如何把多行合并成一个事件。可选的值是 after 或者 before。 multiline.flush_pattern 指定一个正则表达式，多行将从内存刷新到磁盘。 multiline.max_lines 可以合并成一个事件的最大行数。如果一个多行消息包含的行数超过max_lines，则超过的行被丢弃。默认是500。 4.4、多行配置示例 4.4.1、Java堆栈跟踪 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) 为了把这些行合并成单个事件，用写了多行配置： multiline.pattern: '^[[:space:]]' multiline.negate: false multiline.match: after 这个配置将任意以空格开始的行合并到前一行 下面是一个稍微更复杂的例子 Exception in thread "main" java.lang.IllegalStateException: A book has a null property at com.example.myproject.Author.getBookIds(Author.java:38) at com.example.myproject.Bootstrap.main(Bootstrap.java:14) Caused by: java.lang.NullPointerException at com.example.myproject.Book.getId(Book.java:22) at com.example.myproject.Author.getBookIds(Author.java:35) ... 1 more 为了合并这个，用下面的配置： multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:' multiline.negate: false multiline.match: after 在这个例子中，模式匹配下列行： 以空格开头，后面跟 at 或者 … 的行 以 Caused by: 开头的行 一些编程语言使用行尾的反斜杠()字符表示该行继续，如本例所示: printf ("%10.10ld \t %10.10ld \t %s\ %f", w, x, y, z ); 为了把这样的多行合并成单个事件，用下列配置： multiline.pattern: '\\$' multiline.negate: false multiline.match: before 这段配置合并任意以 \ 结尾的行 4.4.2、时间戳 下面是以时间戳开始的日志 [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] 为了合并这种行，用下列配置： multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' multiline.negate: true multiline.match: after 4.4.3、应用事 有时你的应用日志包含事件，自定义的开始和结束时间，例如： [2015-08-24 11:49:14,389] Start new event [2015-08-24 11:49:14,395] Content of processing something [2015-08-24 11:49:14,399] End event 为了合并这种行，用下面的多行配置： multiline.pattern: 'Start new event' multiline.negate: true multiline.match: after multiline.flush_pattern: 'End event' 4.5、加载外部配置文件 Filebeat允许将配置分隔为多个较小的配置文件，然后加载外部配置文件。 4.5.1、输入配置 filebeat.config.inputs: enabled: true path: configs/*.yml 每一个在path下的文件都必须包含一个或多个input定义，例如： - type: log paths: - /var/log/mysql.log scan_frequency: 10s - type: log paths: - /var/log/apache.log scan_frequency: 5s 4.5.2、模块配置 filebeat.config.modules: enabled: true path: ${path.config}/modules.d/*.yml 每个被发现的配置文件必须包含一个或多个模块定义，例如： - module: apache2 access: enabled: true var.paths: [/var/log/apache2/access.log*] error: enabled: true var.paths: [/var/log/apache2/error.log*] 4.6、配置output 4.6.1、配置Elasticsearch output 当指定Elasticsearch作为output时，Filebeat通过Elasticsearch提供的HTTP API向其发送数据。例如： output.elasticsearch: hosts: ["https://localhost:9200"] index: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}" ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] ssl.certificate: "/etc/pki/client/cert.pem" ssl.key: "/etc/pki/client/cert.key" 为了启用SSL，只需要在hosts下的所有URL添加https即可 output.elasticsearch: hosts: ["https://localhost:9200"] username: "filebeat_internal" password: "YOUR_PASSWORD" 如果Elasticsearch节点是用IP:PORT的形式定义的，那么添加protocol:https。 output.elasticsearch: hosts: ["localhost"] protocol: "https" username: "{beatname_lc}_internal" password: "{pwd}" 配置项： enabled 启用或禁用该输出。默认true。 hosts Elasticsearch节点列表。事件以循环顺序发送到这些节点。如果一个节点变得不可访问，那么自动发送到下一个节点。每个节点可以是URL形式，也可以是IP:PORT形式。如果端口没有指定，用9200。 output.elasticsearch: hosts: ["10.45.3.2:9220", "10.45.3.1:9230"] protocol: https path: /elasticsearch username 用于认证的用户名 password 用户认证的密码 protocol 可选值是：http 或者 https。默认是http。 path HTTP API调用前的HTTP路径前缀。这对于Elasticsearch监听HTTP反向代理的情况很有用。 headers 将自定义HTTP头添加到Elasticsearch输出的每个请求。 ndex 索引名字。（PS：意思是要发到哪个索引中去）。默认是"filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"（例如，“filebeat-6.3.2-2017.04.26”）。如果你想改变这个设置，你需要配置 setup.template.name 和 setup.template.pattern 选项。如果你用内置的Kibana dashboards，你也需要设置setup.dashboards.index选项。 indices 索引选择器规则数组，支持条件、基于格式字符串的字段访问和名称映射。如果索引缺失或没有匹配规则，将使用index字段。例如： output.elasticsearch: hosts: ["http://localhost:9200"] index: "logs-%{[beat.version]}-%{+yyyy.MM.dd}" indices: - index: "critical-%{[beat.version]}-%{+yyyy.MM.dd}" when.contains: message: "CRITICAL" - index: "error-%{[beat.version]}-%{+yyyy.MM.dd}" when.contains: message: "ERR" timeout 请求超时时间。默认90秒。 4.6.2、配置Logstash output output.logstash: hosts: ["127.0.0.1:5044"] 上面是配置Filebeat输出到Logstash，那么Logstash本身也有配置，例如： input { beats { port => 5044 } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } } 4.6.3、配置Kafka output output.kafka: # initial brokers for reading cluster metadata hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"] # message topic selection + partitioning topic: '%{[fields.log_topic]}' partition.round_robin: reachable_only: false required_acks: 1 compression: gzip max_message_bytes: 1000000 4.7、负载均衡 为了启用负载均衡，当你配置输出的时候需要指定 loadbalance: true。 output.logstash: hosts: ["localhost:5044", "localhost:5045"] loadbalance: true 4.8、加载索引模板 在filebeat.yml配置文件的setup.template区域指定索引模板，用来设置在Elasticsearch中的映射。如果模板加载是启用的（默认的），Filebeat在成功连接到Elasticsearch后自动加载索引模板。 可以调整下列设置或者覆盖一个已经存在的模板。 setup.template.enabled 设为false表示禁用模板加载 setup.template.name 模板的名字。默认是filebeat。Filebeat的版本总是跟在名字后面，所以最终的名字是 filebeat-%{[beat.version]} setup.template.pattern 模板的模式。默认模式是filebeat-*。例如： setup.template.name: "filebeat" setup.template.pattern: "filebeat-*" setup.template.fields 描述字段的YAML文件路径。默认是 fields.yml。 setup.template.overwrite 是否覆盖存在的模板。默认false。 setup.template.settings._source setup.template.name: "filebeat" setup.template.fields: "fields.yml" setup.template.overwrite: false setup.template.settings: _source.enabled: false 4.9、监控Filebeat X-Pack监控使得可以很容易从Kibana监控Filebeat。 为了配置Filebeat收集并发送监控信息， 第1步：创建一个具有适当权限向Elasticsearch发送系统级监视数据的用户。 第2步：在Filebeat配置文件中添加xpack.monitoring设置。如果你配置了Elasticsearch输出，指定下面最小的配置： xpack.monitoring.enabled: true 如果你配置的是其它输出，比如Logstash，那么你必须指定一些额外的配置项。例如： xpack.monitoring: enabled: true elasticsearch: hosts: ["https://example.com:9200", "https://example2.com:9200"] username: beats_system password: beatspassword （注意：目前，必须将监视数据发送到与所有其他事件相同的集群。如果你配置了Elasticsearch输出，请不要在监视配置中指定其他主机。） 第3步：在Kibana中配置监控 第4步：在Kibana中查看监控 五、FAQ 5.1、Too many open file handler？（太多打开的文件句柄） Filebeat保持文件处理器打开，以防它到达文件的末尾，以便它可以实时读取新的日志行。如果Filebeat正在收集大量文件，那么打开文件的数量可能成为一个问题。在大多数环境中，主动更新的文件数量很少。应该相应地设置close_inactive配置选项，以关闭不再活动的文件。 5.2、Filebeat没有从一个文件收集行 为了解决这个问题： 确保路径配置正确 检查这个文件是不是比指定的ignore_older值更旧 确保Filebeat能够发送时间到配置的输出。以debug模式运行Filebeat来检查是否可以成功发送事件： ./filebeat -c config.yml -e -d "*" 5.3、Filebeat占用了太多CPU资源 Filebeat可能配置扫描文件太过频繁。检查filebeat.yml中的scan_frequency设置。
一、X-Pack 概览 1.1、利用 X-Pack 拓展可能性。 X-Pack 是集成了多种便捷功能的单个插件 — security、alerting、monitoring、reporting、graph 探索和 machine learning — 您可以在 Elastic Stack 中放心地使用这些功能。 单就其自身而言，Elastic Stack 就是一款值得考虑的强大工具。X-Pack 将诸多强大功能集合到一个单独的程序包中，更将它带上了一个新的层次。 x-pack是elasticsearch的一个扩展包，将安全，警告，监视，图形和报告功能捆绑在一个易于安装的软件包中，虽然x-pack被设计为一个无缝的工作，但是你可以轻松的启用或者关闭一些功能。 1.2、X-Pack 功能介绍 X-Pack 提供以下几个级别保护elastic集群 1）用户验证 2）授权和基于角色的访问控制 3）节点/客户端认证和信道加密 4）审计 通俗讲解： 安全防护功能：访问验证。 实时监控功能：实时监控集群的CPU、磁盘等负载； 生成报告功能：图形化展示你的集群使用情况。 还有，机器学习等功能。 以上这些都是X-pack的核心功能点。 1.3、xpack演变： 5.X版本之前：没有x-pack，是独立的：security安全,watch查看，alert警告等独立单元。 5.X版本：对原本的安全，警告，监视，图形和报告做了一个封装，形成了x-pack。 6.3 版本之前：需要额外安装。 6.3版本及之后：已经集成在一起发布，无需额外安装，基础安全属于付费黄金版内容。 7 .1版本：基础安全免费。 安全部分免费之前，如何保证基础安全？ 场景一：全部“裸奔”，相信这在国内占据了非常大的比重。 内网部署，不对外提供服务。或者ES作为业务基础支撑，不公网开放9200等常用端口，开放的是业务的服务端口。 可能暴露问题：公司或团队内部开放9200、5601端口，基本head插件、kibana都能连接，极易导致线上索引或数据可能被误删。 场景二：加了简单防护。 一般使用Nginx身份认证+防火墙策略控制。 场景三：整合使用了第三方安全认证方案。 比如：SearchGuard、ReadonlyREST。 场景四：付费购买了Elastic-Xpack黄金版或白金版服务。 一般是银行等土豪大客户，对安全、预警、机器学习等付费功能需求迫切。 二、ES集群配置 2.1、生成证书（非集群可以跳过生成证书步骤） 以3台服务器的集群为例。在服务器1（任选一台服务器生成证书就行）bin目录下执行以下命令生成两个证书： ./elasticsearch-certutil ca ./elasticsearch-certutil cert --ca elastic-stack-ca.p12 两条命令一路回车即可，不需要给秘钥再添加密码。执行完以后会生成两个证书，证书在安装目录bin目录的上一级； 将两个证书移动到安装目录的config目录下（非config目录会报错）； 将服务器1上的两个证书复制到另外两个ES服务器的config目录下； 其实生成证书这个步骤很好理解，ES集群之间需要进行数据同步，当给ES集群设置密码以后，ES集群的各服务器之间互相认可对方，证书就是这个作用。 2.2、修改elasticsearch.yml 在elasticsearch.yml中新增如下配置： xpack.security.enabled: true xpack.license.self_generated.type: basic xpack.security.transport.ssl.enabled: true # 非集群不用增加下面三行 xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: /xxxx/xxxx/config/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: /xxxx/xxxx/elasticsearch-7.6.2/config/elastic-certificates.p12 2.3、重启ES服务器 依次重启3台服务器，生产环境ES集群不能停止服务，所以采用每次重启一台，切不可全部停止。 2.4、设置ES账号密码 在服务器1（挑一台服务器执行即可，不需要每台服务器都执行）上ES的bin目录下执行如下命令设置密码： ES内置elastic、apm_system、logstash_system、kibana等内置用户，需要分别为这些账户设置密码，密码中不要包含@符号，有坑。需要记住自己设置的密码，后续过程需要使用。 # interactiv手动设置密码 ./elasticsearch-setup-passwords interactive 也可使用： # 自动生成密码 ./elasticsearch-setup-passwords auto 如果在设置密码的过程中报错，重新执行此命令再设置一次即可，不可跳过报错。 设置完账号密码以后，在命令行中执行如下命令验证一下账号密码是否设置成功： curl -XGET -u elastic ‘http://${ip}:9200/_xpack/security/user?pretty’ 若出现提示输入elastic账户的密码，则账号密码设置成功。 三、Kibana配置 3.1、修改kibana.yml 在kibana.yml文件中新增配置： xpack.reporting.encryptionKey: "a_random_string" xpack.security.encryptionKey: "something_at_least_32_characters" # 明文配置,则加上以下两行。推荐密文配置，参考步骤3.2 elasticsearch.username: "kibana" elasticseacr.password: "kibana_passwd" 3.2、设置账户密码（密文配置） 在bin目录下执行： ./kibana-keystore create ./kibana-keystore add elasticsearch.username # 输入1.4中设置的账户：elastic ./kibana-keystore add elasticsearch.password # 输入1.4中设置的elastic账户的密码 3.3、重启Kibana kibana进程查找命令：netstat -tunlp|grep 5601 启动命令：nohup ./kibana & 四、Logstash配置 4.1、修改logstash.yml logstash.yml（位于安装目录config下）文件中新增如下配置： logstash_system为ES的内置账户，只有监控权限，用于心跳检测ES服务器的状态。此账户权限非常小，所以这里密码采用明文写在配置文件也不要紧。 xpack.monitoring.enabled: true # 账户logstash_system为ES的内置账户 xpack.monitoring.elasticsearch.username: logstash_system # 设置的密码 xpack.monitoring.elasticsearch.password: yourPassword 4.2、设置账户密码 在bin目录下执行： ./logstash-keystore create # 执行后 选Y ./logstash-keystore add ES_USER # 账户：elastic，这里不要使用logstash_system这个账号，这个账号没有增删改索引的权限 ./logstash-keystore add ES_PWD # elastic账户的密码 4.3修改conf文件 修改logstash的配置文件，一般是自己新增的配置文件，位于config文件夹下。 在output模块中新增账号，密码 output { elasticsearch { action => "%{[@metadata][action]}" hosts => ["ip1:9200", "ip2:9200", "ip3:9200"] index => "demo_index" document_id => "%{id}" # 新增如下两行：采用密文配置，要使用明文可自行查看官方文档 user => ${ES_USER} password => ${ES_PWD} } } 4.4、重启Logstash 重启后观察启动日志，有无ERROR报错，无ERROR即正常。或者验证数据有没有通过Logstash同步到ES上面。到这里ELK就全部配置完成。 五、验证集群状态 在服务器中执行如下命令，验证ES集群状态： curl -XGET -u ${username}:${pwd} http://${ip}:9200/_cluster/health?pretty 集群状态为green就大功告成。如果为yellow就稍等一会，说明有副本分片还未恢复。如果集群状态为red，说明有主分片未恢复，需要去查看是否有ES服务器还未重启成功。 参考： https://blog.csdn.net/web15286201346/article/details/123893428?spm=1001.2014.3001.5506
一、身份验证 Elasticsearch 支持多种身份验证方式，包括基本身份验证、LDAP 身份验证、Active Directory 身份验证和 SAML 身份验证等。 1.1、基本身份验证 1、修改配置文件重启 修改配置文件config/elasticsearch.yml，写入以下配置： xpack.security.enabled: true discovery.type: single-node xpack.security.transport.ssl.enabled: true 2、设置密码 ./bin/elasticsearch-setup-passwords interactive 会为4个用户设置密码： elastic, kibana, logstash_system,beats_system 其中： elastic 账号：内置的超级用户，拥有 superuser 角色。 kibana 账号：用来连接 elasticsearch 并与之通信。Kibana 服务器以该用户身份提交请求以访问集群监视 API 和 .kibana 索引，不能访问 index。 logstash_system 账号：用户 Logstash 在 Elasticsearch 中存储监控信息时使用。 3、修改密码 以下命令将 elastic 密码修改为 “123456”： curl -H "Content-Type:application/json" -XPOST -u elastic 'http://127.0.0.1:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }' 1.2、基于令牌的身份验证 1、检查许可证类型： 确认你当前的 Elasticsearch 许可证类型。可以通过以下命令检查当前许可证： GET /_license 2、升级到合适的许可证： 试用许可证: 你可以申请一个免费的 30 天试用许可证，它包含所有的 X-Pack 功能。通过以下 API 请求来激活试用许可证： POST /_license/start_trial?acknowledge=true 基于令牌的身份验证允许用户使用访问令牌（access token）来访问 Elasticsearch。访问令牌是一个短期有效的字符串，可以通过用户名和密码获取。在 Elasticsearch中，可以通过以下步骤配置基于令牌的身份验证： 1、获取访问令牌： POST /_security/oauth2/token { “grant_type” : “password”, “username” : “my_admin”, “password” : “mypassword” } 返回的响应中包含访问令牌： { "access_token": "o5GwAxZDNXBXMEVhMlFBU2haOTFsamhzbG53", "type": "Bearer", "expires_in": 1200, "refresh_token": "o5GwAxY3RU1ZSE1VTFJ0cU5UV0tLSXdhdGp3" } 2、使用访问令牌访问 Elasticsearch： curl -H "Authorization: Bearer AAEAAWVsYXN0aWNzZWFyY2gtdG9rZW4tZm9yLWV4YW1wbGU" http://localhost:9200/_cluster/health 1.3、基于证书的身份验证 基于证书的身份验证允许用户使用客户端证书来访问 Elasticsearch。在 Elasticsearch 中，可以通过以下步骤配置基于证书的身份验证： 在 elasticsearch.yml 配置文件中启用基于证书的身份验证： xpack.security.http.ssl.enabled: true xpack.security.http.ssl.client_authentication: required 配置客户端证书和私钥： xpack.security.http.ssl.keystore.path: “http.p12” xpack.security.http.ssl.truststore.path: “http.p12” 使用客户端证书访问 Elasticsearch： curl --cert client.crt --key client.key https://localhost:9200/_cluster/health 1.4 LDAP 身份验证 LDAP 身份验证是一种常见的身份验证方式，它使用 LDAP 目录来存储用户信息和密码。在 Elasticsearch 中，可以通过配置 elasticsearch.yml 文件来启用 LDAP 身份验证，例如： xpack.security.authc: realms: ldap: type: ldap order: 1 url: "ldap://ldap.example.com:389" bind_dn: "cn=admin,dc=example,dc=com" bind_password: "password" user_search: base_dn: "ou=people,dc=example,dc=com" filter: "(uid={0})" 这里的 ldap 表示使用 LDAP 进行身份验证，url 表示 LDAP 服务器的地址和端口号，bind_dn 和 bind_password 表示 LDAP 管理员的用户名和密码，user_search 表示用户信息的搜索条件。 1.5、Active Directory 身份验证 Active Directory 身份验证是一种常见的身份验证方式，它使用 Active Directory 目录来存储用户信息和密码。在 Elasticsearch 中，可以通过配置 elasticsearch.yml 文件来启用 Active Directory 身份验证，例如： xpack.security.authc: realms: ad: type: active_directory order: 2 url: "ldap://ad.example.com:389" bind_dn: "cn=admin,dc=example,dc=com" bind_password: "password" user_search: base_dn: "ou=people,dc=example,dc=com" filter: "(sAMAccountName={0})" 这里的 ad 表示使用 Active Directory 进行身份验证，其他配置项与 LDAP 身份验证类似。 1.6、SAML 身份验证 SAML 身份验证是一种基于标准的身份验证方式，它使用 SAML 协议来实现身份验证。在 Elasticsearch 中，可以通过配置 elasticsearch.yml 文件来启用 SAML 身份验证，例如： xpack.security.authc: realms: saml: type: saml order: 3 idp: metadata_path: "/path/to/idp-metadata.xml" sp: entity_id: "https://elasticsearch.example.com" acs: "https://elasticsearch.example.com/api/security/v1/saml" 这里的 saml 表示使用 SAML 进行身份验证，idp 表示身份提供者的元数据路径，sp 表示服务提供者的实体 ID 和断言消费服务的URL。 二、授权 授权是确定用户可以访问哪些资源和执行哪些操作的过程。在 Elasticsearch 中，可以通过角色和权限来实现授权。 2.1、角色和权限 在 Elasticsearch 中，角色是一组权限的集合，权限是一组允许或拒绝执行特定操作的规则。角色可以分配给用户，以便控制用户可以访问的资源和执行的操作。 Elasticsearch 提供了一些预定义的角色，例如： superuser：具有所有权限的用户，可以执行任何操作。 kibana_admin：具有管理 Kibana 的权限，可以创建和管理仪表板、可视化等。 monitoring_user：具有访问监控数据的权限，可以查看 Elasticsearch 集群的性能和状态。 2.2、创建自定义角色 除了预定义的角色外，还可以创建自定义角色。例如，创建一个名为 read_only 的角色，只允许用户读取索引中的数据： PUT /_security/role/read_only { "indices": [ { "names": [ "*" ], "privileges": [ "read" ] } ] } 创建一个名为 index_manager 的角色，允许用户创建和删除索引，但不能对数据进行读写操作： PUT /_security/role/index_manager { "indices": [ { "names": [ "*" ], "privileges": [ "create_index", "delete_index" ] } ] } 2.3、分配角色给用户 创建角色后，可以将其分配给用户。例如，将 read_only 角色分配给名为 my_user 的用户： POST /_security/user/my_user { "password" : "mypassword", "roles" : [ "read_only" ], "full_name" : "My User" } 现在，my_user 只能读取索引中的数据，无法执行其他操作，如创建或删除索引。 2.4、使用角色模板 角色模板是一种动态生成角色的方法，可以根据用户的属性来生成角色。例如，创建一个名为 user_specific_index 的角色模板，允许用户访问其用户名作为前缀的索引： PUT /_security/role/user_specific_index { "indices": [ { "names": [ "{user.name}_*" ], "privileges": [ "read", "write" ] } ] } 现在，名为 john 的用户可以访问 john_* 索引，而名为 jane 的用户可以访问 jane_* 索引。 2.5、使用 API 键进行授权 API 键是一种用于授权的机制，允许用户使用 API 键来访问 Elasticsearch，而无需提供用户名和密码。API 键可以具有与用户相同或更少的权限。要创建 API 键，请执行以下操作： POST /_security/api_key { "name": "my_api_key", "role_descriptors": { "read_only": { "indices": [ { "names": [ "*" ], "privileges": [ "read" ] } ] } } } 返回的响应中包含 API 键： { "id" : "VuaCfGcBCdbkQmijuKPS", "name" : "my_api_key", "api_key" : "ui2lp2axTNmsyakw9tvNnw" } 使用 API 键访问 Elasticsearch： curl -H "Authorization: ApiKey VuaCfGcBCdbkQmijuKPS:ui2lp2axTNmsyakw9tvNnw" http://localhost:9200/_cluster/health 2.6、访问控制 基于角色的访问控制（RBAC）是一种授权策略，通过将权限分配给角色，然后将角色分配给用户来实现。在 Elasticsearch 中，可以使用 RBAC来控制用户对索引、文档和字段的访问权限。 2.6.1、索引级别的访问控制 在 Elasticsearch 中，可以为角色分配特定索引的访问权限。例如，创建一个名为 logs_read 的角色，只允许用户读取名为 logs-* 的索引： PUT /_security/role/logs_read { "indices": [ { "names": [ "logs-*" ], "privileges": [ "read" ] } ] } 将 logs_read 角色分配给名为 log_viewer 的用户： POST /_security/user/log_viewer { "password" : "mypassword", "roles" : [ "logs_read" ], "full_name" : "Log Viewer" } 现在，log_viewer 用户只能读取 logs-* 索引，无法访问其他索引。 配置 elasticsearch.yml 文件方式： xpack.security.authz: roles: admin: cluster: - all indices: - names: '*' privileges: - all user: cluster: - monitor indices: - names: 'logs-*' privileges: - read 这里的 admin 和 user 表示角色名称，cluster 表示集群级别的权限，indices 表示索引级别的权限。在定义完角色和权限后，可以将用户分配到不同的角色，例如： POST /_security/user/john/_roles { "roles": ["admin"] } 这里的 john 表示用户名，admin 表示要分配的角色名称。 2.6.2 字段级别的访问控制 (Field-Level Security, FLS) 字段级别的访问控制（FLS）允许您限制用户访问文档中特定字段的权限。例如，创建一个名为 logs_read_sensitive 的角色，只允许用户读取 logs-* 索引中的 timestamp 和 message 字段： PUT /_security/role/logs_read_sensitive { "indices": [ { "names": [ "logs-*" ], "privileges": [ "read" ], "field_security" : { "grant" : [ "timestamp", "message" ] } } ] } 将 logs_read_sensitive 角色分配给名为 sensitive_log_viewer 的用户： POST /_security/user/sensitive_log_viewer { "password" : "mypassword", "roles" : [ "logs_read_sensitive" ], "full_name" : "Sensitive Log Viewer" } 现在，sensitive_log_viewer 用户只能访问 logs-* 索引中的 timestamp 和 message 字段，无法访问其他字段。 配置 elasticsearch.yml 文件方式： xpack.security.field_level_security: enabled: true grant: - field: "user" value: "john" except: ["password"] 这里的 enabled 表示是否启用字段级别的访问控制，grant 表示允许访问的字段和值。在定义完字段级别的访问控制后，可以将其应用到索引中，例如： PUT /logs { "mappings": { "properties": { "user": { "type": "text", "fielddata": true, "fields": { "keyword": { "type": "keyword" } } }, "password": { "type": "text", "fielddata": true, "fields": { "keyword": { "type": "keyword" } } } } }, "settings": { "index": { "query": { "default_field": "user" }, "security": { "field_level_security": { "grant": [ { "field": "user", "value": "john", "except": ["password"] } ] } } } } } 这里的 logs 表示索引名称，user 和 password 表示字段名称。在定义完索引后，可以使用查询 DSL 来访问索引中的数据，例如： GET /logs/_search { "query": { "match": { "user": "john" } } } 2.6.3、文档级别的访问控制 (Document-Level Security, DLS) 文档级别的访问控制（DLS）允许您限制用户访问特定文档的权限。例如，创建一个名为 logs_read_team1 的角色，只允许用户读取 logs-* 索引中 team 字段值为 team1 的文档： PUT /_security/role/logs_read_team1 { "indices": [ { "names": [ "logs-*" ], "privileges": [ "read" ], "query": { "term": { "team": "team1" } } } ] } 将 logs_read_team1 角色分配给名为 team1_log_viewer 的用户： POST /_security/user/team1_log_viewer { "password" : "mypassword", "roles" : [ "logs_read_team1" ], "full_name" : "Team1 Log Viewer" } 现在，team1_log_viewer 用户只能访问 logs-* 索引中 team 字段值为 team1 的文档，无法访问其他文档。 2.6.4、IP 白名单 您可以通过配置 Elasticsearch 的网络层来限制哪些 IP 地址可以访问 Elasticsearch。这可以通过在 elasticsearch.yml 配置文件中设置 http.host 和 http.publish_host 参数来实现。 例如，只允许来自 IP 地址 192.168.1.100 的请求访问 Elasticsearch： http.host: 192.168.1.100 http.publish_host: 192.168.1.100 请注意，这种方法只限制了哪些 IP 地址可以访问 Elasticsearch，而不限制用户可以执行的操作。因此，建议将 IP 白名单与其他访问控制方法（如基于角色的访问控制）结合使用。 2.6.5、匿名访问 Elasticsearch 支持配置匿名访问，允许未经身份验证的用户访问 Elasticsearch。匿名用户将被分配一个或多个预定义的角色，以限制其访问权限。 要启用匿名访问，请在 elasticsearch.yml 配置文件中添加以下配置： xpack.security.authc: anonymous: username: _anonymous roles: read_only authz_exception: true 在此示例中，匿名用户将被分配 read_only 角色，只能读取索引中的数据。请注意，启用匿名访问可能会导致安全风险，因此请谨慎使用。 2.6.6、跨集群复制 (Cross-Cluster Replication, CCR) 跨集群复制（CCR）是一种在多个 Elasticsearch 集群之间同步数据的方法。通过CCR，可以将数据从一个集群（称为领导者集群）复制到另一个集群（称为追随者集群）。这可以用于实现地理冗余、负载均衡和数据访问控制。 在 CCR 中，可以为追随者集群中的用户分配不同的角色和权限，以限制其对领导者集群中的数据的访问。例如，可以允许追随者集群中的用户只读取特定索引，而不允许他们修改数据或访问其他索引。 要配置 CCR，请按照以下步骤操作： 1、在领导者集群和追随者集群中启用 CCR： xpack.security.enabled: true xpack.ccr.enabled: true 2、在追随者集群中创建一个远程集群连接，指向领导者集群： cluster.remote.leader_cluster: seeds: [“leader_cluster_ip:9300”] 3、在追随者集群中创建一个跟随索引，以复制领导者集群中的数据： PUT /follower_index/_ccr/follow { “remote_cluster”: “leader_cluster”, “leader_index”: “leader_index” } 4、为追随者集群中的用户分配角色和权限，以限制其对领导者集群中的数据的访问。 总之，Elasticsearch 提供了多种访问控制功能，包括基于角色的访问控制、字段级别的访问控制和文档级别的访问控制。通过正确配置这些功能，可以确保 Elasticsearch 系统的安全性和满足企业级应用的需求。 三、加密 为了保护数据的安全和隐私，Elasticsearch 提供了多种加密功能，包括传输层安全（TLS）和数据加密。 3.1、传输层安全（TLS） 传输层安全（TLS）是一种加密协议，用于在网络上保护数据的传输。在 Elasticsearch 中，可以通过以下步骤启用 TLS： 1、生成证书和私钥，可以使用 Elasticsearch 的 elasticsearch-certutil 工具生成自签名证书。 2、在 elasticsearch.yml 配置文件中启用 TLS： xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: “elastic-certificates.p12” xpack.security.transport.ssl.truststore.path: “elastic-certificates.p12” 3、重启 Elasticsearch 以应用更改。 3.2、数据加密 3.2.1、磁盘加密 Elasticsearch 本身不提供数据加密功能。但是，你可以使用文件系统级别的加密来保护 Elasticsearch 存储的数据。以下是一些建议： 使用文件系统级别的加密，如 dm-crypt（Linux）、BitLocker（Windows）或 FileVault（macOS）。这些工具可以对 Elasticsearch 数据存储的文件进行加密，从而保护数据的安全。 使用硬件加密，如自加密硬盘（Self-Encrypting Drives，SEDs）。这些硬盘具有内置的加密功能，可以在硬件级别对数据进行加密，提供更高的安全性和性能。 3.2.2、快照加密 Elasticsearch 支持创建快照以备份数据。为了保护快照中的数据，可以使用以下方法对快照进行加密： 使用加密的存储服务，如 Amazon S3 或 Google Cloud Storage。这些服务提供了服务器端加密（Server-Side Encryption，SSE）功能，可以自动对存储的数据进行加密。 使用客户端加密库，如 Amazon S3 Encryption Client 或 Google Cloud Storage Client Libraries。这些库提供了客户端加密（Client-Side Encryption，CSE）功能，可以在上传数据到存储服务之前对数据进行加密。 3.2.3、数据脱敏 数据脱敏是一种数据保护技术，通过对敏感数据进行处理，使其无法识别特定个人，同时保留数据的可用性。在 Elasticsearch 中，可以使用以下方法对数据进行脱敏： 使用 Ingest Node 处理数据。Ingest Node 是 Elasticsearch 的一个功能，可以在数据索引之前对数据进行预处理。可以使用 Ingest Pipelines 和 Processors 对敏感数据进行脱敏处理，如删除、替换或哈希。 使用 Logstash 处理数据。Logstash 是一个数据处理管道，可以从多种来源获取数据，对数据进行处理，然后将数据发送到 Elasticsearch。你可以使用 Logstash 的 Filters 对敏感数据进行脱敏处理，如删除、替换或哈希。 四、 审计 审计是记录和分析用户活动的过程，以确保系统的安全和合规性。Elasticsearch 提供了审计日志功能，可以记录用户执行的操作和产生的事件。 要启用审计日志，需要在 elasticsearch.yml 配置文件中添加以下配置： xpack.security.audit.enabled: true 启用审计日志后，Elasticsearch 将记录用户执行的操作和产生的事件，并将其存储在日志文件中。可以通过 Kibana 或其他日志分析工具查看和分析审计日志。 总之，Elasticsearch 提供了一系列安全和权限管理功能，包括身份验证、授权、加密和审计。通过正确配置这些功能，可以确保 Elasticsearch 系统的安全和合规性。 参考： https://blog.csdn.net/wangluoanquan111/article/details/136620283 https://www.cnblogs.com/Choleen/p/17053514.html
一、elasticsearch.yml cluster.name 配置es的集群名称，默认是elasticsearch，es会自动发现在同一网段下的es，如果在同一网段下有多个集群，就可以用这个属性来区分不同的集群。 node.name 节点名，默认随机指定一个name列表中名字，该列表在es的jar包中config文件夹里name.txt文件中，其中有很多作者添加的有趣名字。 node.master: true 指定该节点是否有资格被选举成为node，默认是true，es是默认集群中的第一台机器为master，如果这台机挂了就会重新选举master。 node.data: true 指定该节点是否存储索引数据，默认为true。 index.number_of_shards 设置默认索引分片个数，默认为5片。 index.number_of_replicas 设置默认索引副本个数，默认为1个副本。 path.conf 设置配置文件的存储路径，默认是es根目录下的config文件夹。 path.data 设置索引数据的存储路径，默认是es根目录下的data文件夹，可以设置多个存储路径，用逗号隔开，例：path.data: /path/to/data1,/path/to/data2 path.work 设置临时文件的存储路径，默认是es根目录下的work文件夹。 path.logs 设置日志文件的存储路径，默认是es根目录下的logs文件夹。 path.plugins 设置插件的存放路径，默认是es根目录下的plugins文件夹。 bootstrap.mlockall: true 设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低，所以要保证它不swap，可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值，并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存，Linux下可以通过ulimit -l unlimited命令。 network.bind_host 设置绑定的ip地址，可以是ipv4或ipv6的，默认为0.0.0.0。 network.publish_host 设置其它节点和该节点交互的ip地址，如果不设置它会自动判断，值必须是个真实的ip地址。 network.host 这个参数是用来同时设置bind_host和publish_host上面两个参数。 transport.tcp.port 设置节点间交互的tcp端口，默认是9300。 transport.tcp.compress 设置是否压缩tcp传输时的数据，默认为false，不压缩。 http.port: 9200 设置对外服务的http端口，默认为9200。 http.max_content_length 设置内容的最大容量，默认100mb http.enabled 是否使用http协议对外提供服务，默认为true，开启。 gateway.type gateway的类型，默认为local即为本地文件系统，可以设置为本地文件系统，分布式文件系统，Hadoop的HDFS，和amazon的s3服务器，其它文件系统的设置方法下次再详细说。 gateway.recover_after_nodes 设置集群中N个节点启动时进行数据恢复，默认为1。 gateway.recover_after_time: 5m 设置初始化数据恢复进程的超时时间，默认是5分钟。 gateway.expected_nodes: 2 设置这个集群中节点的数量，默认为2，一旦这N个节点启动，就会立即进行数据恢复。 cluster.routing.allocation.node_initial_primaries_recoveries: 4 初始化数据恢复时，并发恢复线程的个数，默认为4。 cluster.routing.allocation.node_concurrent_recoveries: 4 添加删除节点或负载均衡时并发恢复线程的个数，默认为4。 indices.recovery.max_size_per_sec: 0 设置数据恢复时限制的带宽，如入100mb，默认为0，即无限制。 indices.recovery.concurrent_streams: 5 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数，默认为5。 discovery.zen.minimum_master_nodes: 1 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1，对于大的集群来说，可以设置大一点的值（2-4）。 discovery.zen.ping.timeout: 3s 设置集群中自动发现其它节点时ping连接超时时间，默认为3秒，对于比较差的网络环境可以高点的值来防止自动发现时出错。 discovery.zen.ping.multicast.enabled: false 设置是否打开多播发现节点，默认是true。 discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"] 设置集群中master节点的初始列表，可以通过这些节点来自动发现新加入集群的节点。 下面是一些查询时的慢日志参数设置： index.search.slowlog.level: TRACE index.search.slowlog.threshold.query.warn: 10s index.search.slowlog.threshold.query.info: 5s index.search.slowlog.threshold.query.debug: 2s index.search.slowlog.threshold.query.trace: 500ms index.search.slowlog.threshold.fetch.warn: 1s index.search.slowlog.threshold.fetch.info: 800ms index.search.slowlog.threshold.fetch.debug:500ms index.search.slowlog.threshold.fetch.trace: 200ms 参考： https://www.jb51.net/program/325620tl1.htm https://www.jb51.net/program/297128cuz.htm Elasticsearch基础2——es配置文件、jvm配置文件、log4j2.properties配置文件详解： https://blog.csdn.net/yi_qingjun/article/details/128660086
一、方式一 FileBeat + logstash 7.5.1 (docker) + ES (docker) + springboot 日志文件应用方式。 采用 ELFK 架构采集日志，直接读取日志生成的文件，不对 Springboot 的日志任何的修改。也就是 FileBeat 通过读取日志文件位置获取日志内容，然后发送至 logstash，logstash 收到日志后再发送至 ES。 1.1、fileBeat 配置文件 fileBeat 配置文件 filebeat.yml ###################### Filebeat Configuration Example ######################### # This file is an example configuration file highlighting only the most common # options. The filebeat.reference.yml file from the same directory contains all the # supported options with more comments. You can use it as a reference. # # You can find the full configuration reference here: # https://www.elastic.co/guide/en/beats/filebeat/index.html # For more available modules and options, please see the filebeat.reference.yml sample # configuration file. # ============================== Filebeat inputs =============================== filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. # filestream is an input for collecting log messages from files. - type: log # Unique ID among all inputs, an ID is required. id: my-avicit-id # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: #- /var/log/*.log - E:\path\to\logs\*.log # Exclude lines. A list of regular expressions to match. It drops the lines that are # matching any regular expression from the list. # Line filtering happens after the parsers pipeline. If you would like to filter lines # before parsers, use include_message parser. #exclude_lines: ['^DBG'] # Include lines. A list of regular expressions to match. It exports the lines that are # matching any regular expression from the list. # Line filtering happens after the parsers pipeline. If you would like to filter lines # before parsers, use include_message parser. #include_lines: ['^ERR', '^WARN'] # Exclude files. A list of regular expressions to match. Filebeat drops the files that # are matching any regular expression from the list. By default, no files are dropped. #prospector.scanner.exclude_files: ['.gz$'] # Optional additional fields. These fields can be freely picked # to add additional information to the crawled log files for filtering #fields: # level: debug # review: 1 # ============================== Filebeat modules ============================== filebeat.config.modules: # Glob pattern for configuration loading path: ${path.config}/modules.d/*.yml # Set to true to enable config reloading reload.enabled: false # Period on which files under path should be checked for changes #reload.period: 10s # ======================= Elasticsearch template setting ======================= setup.template.settings: index.number_of_shards: 1 #index.codec: best_compression #_source.enabled: false # ================================== General =================================== # The name of the shipper that publishes the network data. It can be used to group # all the transactions sent by a single shipper in the web interface. #name: # The tags of the shipper are included in their own field with each # transaction published. #tags: ["service-X", "web-tier"] # Optional fields that you can specify to add additional information to the # output. #fields: # env: staging # ================================= Dashboards ================================= # These settings control loading the sample dashboards to the Kibana index. Loading # the dashboards is disabled by default and can be enabled either by setting the # options here or by using the `setup` command. #setup.dashboards.enabled: false # The URL from where to download the dashboards archive. By default this URL # has a value which is computed based on the Beat name and version. For released # versions, this URL points to the dashboard archive on the artifacts.elastic.co # website. #setup.dashboards.url: # =================================== Kibana =================================== # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. # This requires a Kibana endpoint configuration. setup.kibana: # Kibana Host # Scheme and port can be left out and will be set to the default (http and 5601) # In case you specify and additional path, the scheme is required: http://localhost:5601/path # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601 #host: "localhost:5601" # Kibana Space ID # ID of the Kibana Space into which the dashboards should be loaded. By default, # the Default Space will be used. #space.id: # =============================== Elastic Cloud ================================ # These settings simplify using Filebeat with the Elastic Cloud (https://cloud.elastic.co/). # The cloud.id setting overwrites the `output.elasticsearch.hosts` and # `setup.kibana.host` options. # You can find the `cloud.id` in the Elastic Cloud web UI. #cloud.id: # The cloud.auth setting overwrites the `output.elasticsearch.username` and # `output.elasticsearch.password` settings. The format is `<user>:<pass>`. #cloud.auth: # ================================== Outputs =================================== # Configure what output to use when sending the data collected by the beat. # ---------------------------- Elasticsearch Output ---------------------------- #output.elasticsearch: # Array of hosts to connect to. #hosts: ["172.17.4.55:9200"] # Protocol - either `http` (default) or `https`. #protocol: "https" # Authentication credentials - either API key or username/password. #api_key: "id:api_key" #username: "elastic" #password: "changeme" # ------------------------------ Logstash Output ------------------------------- output.logstash: # The Logstash hosts hosts: ["172.17.4.55:5044"] # Optional SSL. By default is off. # List of root certificates for HTTPS server verifications #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] # Certificate for SSL client authentication #ssl.certificate: "/etc/pki/client/cert.pem" # Client Certificate Key #ssl.key: "/etc/pki/client/cert.key" # ================================= Processors ================================= processors: - add_host_metadata: when.not.contains.tags: forwarded - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~ # ================================== Logging =================================== # Sets log level. The default log level is info. # Available log levels are: error, warning, info, debug #logging.level: debug # At debug level, you can selectively enable logging only for some components. # To enable all selectors use ["*"]. Examples of other selectors are "beat", # "publisher", "service". #logging.selectors: ["*"] # ============================= X-Pack Monitoring ============================== # Filebeat can export internal metrics to a central Elasticsearch monitoring # cluster. This requires xpack monitoring to be enabled in Elasticsearch. The # reporting is disabled by default. # Set to true to enable the monitoring reporter. #monitoring.enabled: false # Sets the UUID of the Elasticsearch cluster under which monitoring data for this # Filebeat instance will appear in the Stack Monitoring UI. If output.elasticsearch # is enabled, the UUID is derived from the Elasticsearch cluster referenced by output.elasticsearch. #monitoring.cluster_uuid: # Uncomment to send the metrics to Elasticsearch. Most settings from the # Elasticsearch output are accepted here as well. # Note that the settings should point to your Elasticsearch *monitoring* cluster. # Any setting that is not set is automatically inherited from the Elasticsearch # output configuration, so if you have the Elasticsearch output configured such # that it is pointing to your Elasticsearch monitoring cluster, you can simply # uncomment the following line. #monitoring.elasticsearch: # ============================== Instrumentation =============================== # Instrumentation support for the filebeat. #instrumentation: # Set to true to enable instrumentation of filebeat. #enabled: false # Environment in which filebeat is running on (eg: staging, production, etc.) #environment: "" # APM Server hosts to report instrumentation results to. #hosts: # - http://localhost:8200 # API Key for the APM Server(s). # If api_key is set then secret_token will be ignored. #api_key: # Secret token for the APM Server(s). #secret_token: # ================================= Migration ================================== # This allows to enable 6.7 migration aliases #migration.6_to_7.enabled: true 1.2、logstash 配置文件 input { beats { port => 5044 host => "172.17.4.55" } } output { elasticsearch { hosts => ["http://172.17.4.55:9200"] index => "logstash-%{+YYYY.MM.dd}" user =>"elastic" password =>"elastic" #document_id => "%{id}" } stdout { codec => rubydebug } } 1.3、控制台输出日志 1、先启动本地 fileBeat .\filebeat -e -c filebeat.yml pause 2、在启动容器中的 logbash 在启动 filebeat 和 logstash 后，可以看到会自动读取已经存在的 springboot 日志并输出到 ogstash 中。在 Springboot 启动后会自动实时刷新输出 springboot 更新的日志到控制台。 用 logstash 7.5.1 (docker) 这种方式测试发现需要配合 FileBeat 才能接收到日志到 logstash 中，但是日志无法通过 logstash 7.5.1 (docker) 发送到 ES 中。所以可以采用方式二。 二、方式二 2.1、Springboot 日志端口方法方式 日志配置 <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="2 seconds"> <timestamp key="TIMESTAMP" datePattern="yyyy-MM-dd"/> <springProperty scope="context" name="application.name" source="spring.application.name" defaultValue="xxxxx"/> <property name="LOGPATH" value="log"/> <springProperty scope="context" name="logstash-host" source="log.logstash-host"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] [traceId=%X{traceId} spanId=%X{spanId}] %-5level %logger{100} - %msg%n </pattern> </encoder> </appender> <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> </appender> <!-- <appender name="AsyncAppender" class="ch.qos.logback.classic.AsyncAppender"> </appender> <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> </appender> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!-- <!–可以访问的logstash日志收集端口–>--> <destination>172.17.4.55:5044</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <logger name="xxxxx" level="info"/> <root level="info"> <appender-ref ref="console"/> <appender-ref ref="rollingFile"/> <!-- <appender-ref ref="AsyncAppender"/>--> <appender-ref ref="errorFile"/> <appender-ref ref="LOGSTASH"/> </root> </configuration> 日志里面需要配置日志的输出地址和日志格式 ，也就 LOGSTASH 的 appender 和 logstash-host 的。 2.2、logstash 的 logstash.conf 配置文件 在测试的时候可以先把 Springboot 接收的日志打印在 logstash 中输出，如果测试没有问题再输出到 ES。 2.3、先输出到控在 logstash 中输出 配置 创建 springbootlog_logstash.conf 配置文件 input { #file { # path => "/home/test/logstash/ml-25m/movies.csv" # start_position => "beginning" # sincedb_path => "/dev/null" #} tcp { port => 5044 host => "172.17.4.55" } } output { #elasticsearch { # hosts => "http://172.17.4.55:9200" # index => "movies" # document_id => "%{id}" # } stdout{ codec => rubydebug } } 启动 ../bin/logstash -f ./springbootlog_logstash.conf 2.4、ES 建立索引 参考： https://blog.csdn.net/tian830937/article/details/140112278
一、Filebeat 使用 Filebeat 来收集系统日志，并把日志传入到 Elasticsearch： 打开Kibana，并按照如下的步骤来进行安装： 由于 Filebeat 是 log 相关的，所以需要选择 “Add log data”。对系统（System）日志进行监控，所以，选择 “System logs”: 然后，根据自己运行的平台，分别使用不同的命令来在平台上进行安装： 1.1、下载 Filebeat 执行如下的指令来安装 Filebeat: curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.0-darwin-x86_64.tar.gz tar xzvf filebeat-7.5.0-darwin-x86_64.tar.gz cd filebeat-7.5.0-darwin-x86_64/ 1.2、配置 Filebeat 在 Filebeat 的安装目录下，可以发现一个叫做 filebeat.yml 的文件。这个文件就是 filebeat 的配置文件： $ pwd /Users/liuxg/elastic8/filebeat-7.5.0-darwin-x86_64 liuxg-2:filebeat-7.5.0-darwin-x86_64 liuxg$ ls LICENSE.txt fields.yml kibana NOTICE.txt filebeat logs README.md filebeat.reference.yml module data filebeat.yml modules.d 打开 filebeat.yml 文件，并找到如下的部分： output.elasticsearch: hosts: ["<es_url>"] username: "elastic" password: "<password>" setup.kibana: host: "<kibana_url>" 在上面，我们需要把我们的 Elasticsearch 及 Kibana 的 host 地址填上。针对本地的情况，填入 localhost:9200 和 localhost:5601。如果是针对本地安装的 Elastic Stack 来说，这些都是默认的配置，我们甚至不需要做任何的修改。如果我们对我们的 Elasticsearch 已经设置用户名及密码的话，那么请填入你自己的用户名及密码。 Elastic cloud 如下的配置只限于 Elastic Cloud。针对 Elastic cloud，可以避免把用户名及密码写到 filebeat.yml 文件中，可以使用 cloud.id 来及 keystore 管理来帮助实现。 首先在 Terminal 中打入如下的命令： ./filebeat keystore create 接着 ./filebeat keystore add CLOUD_PWD 在这一步拷贝在Cloud中所创建的密码，并粘贴下来。 最后，修改 filebeat.yml 文件。 根据上面的提示，一旦设置好 cloud.id，它将覆盖我们的 output.elasticsearch 中的设置。 可以可以使用同样的方法来创建如下的 key： ./filebeat keystore add CLOUD_ID 通过上面的配置，可以在 filebeat.yml 的文件中使用同样的方法来代替我们的 cloud.id。 另外，可以在不用修改 filebeat.yml 的情况下直接使用命令行参数的方法来进行操作，比如在 setup filebeat时： ./filebeat setup -E cloud.id=\${CLOID_ID} -E cloud.auth=elastic:\${CLOUD_PWD} 请注意上面\字符，它是一个转字符，因为后面的 $ 符号有特别的意义。 1.3、启动/禁止 Filebeat 模块 可以通过如下的命令来展示所有 Filebeat 的模块： ./filebeat modules list 在上面，可以看到 redis 模块已经被成功地启动了。如果想启动 system 模块，可以使用如下的命令： ./filebeat modules enable system 上面的命令的返回结果是： Enabled system 如果想不启动 redis 模块，可以使用如下的命令： ./filebeat modules disable redis 上面的命令的返回结果是： Disabled redis 可以使用如下的命令再次查询启动的模块: 在上面，可以清楚地看到 redis 模块已经被成功地关闭了，取而代之的是 system 模块被成功地启动了。可以在 filebeat 的安装目录下的 modules.d 子目录下可以查看到 system 模块的配置文件： 从上面可以清楚地看出来 system.yml 文件已经被成功地启动了。可以修改这个文件的配置。比如，如果已经通过如下的命令启动 nginx 模块： ./filebeat modules enable nginx 那么可以通过修改这个在 modules.d 下的 nginx.yml 文件： # Module: nginx # Docs: https://www.elastic.co/guide/en/beats/filebeat/7.10/filebeat-module-nginx.html - module: nginx # Access logs access: enabled: true # Set custom paths for the log files. If left empty, # Filebeat will choose the paths depending on your OS. #var.paths: # Error logs error: enabled: true # Set custom paths for the log files. If left empty, # Filebeat will choose the paths depending on your OS. #var.paths: # Ingress-nginx controller logs. This is disabled by default. It could be used in Kubernetes environments to parse ingress-nginx logs ingress_controller: enabled: false # Set custom paths for the log files. If left empty, # Filebeat will choose the paths depending on your OS. #var.paths: 比如，可以针对它做如下的配置： modules.d/nginx.yml - module: nginx access: enabled: true var.paths: ["/path/to/log/nginx/access.log*"] error: enabled: true var.paths: ["/path/to/log/nginx/error.log*"] 在上面我们可以对这个模块进行配置。比如，可以配置 access.log 或者 error.log 的位置。当然，也可以直接在运行 filebeat 时，直接在命令行中定义这些参数： ./filebeat --modules nginx \ -M "nginx.access.var.paths=[/path/to/log/nginx/access.log*]" \ -M "nginx.error.var.paths=[/path/to/log/nginx/error.log*]" 每个模块启动一个 Filebeat 的输入（input），并且每个输入启动一个或者多个 harvester。你可以添加或者覆盖任何默认的输入设置，比如，你可以使用如下的配置来关掉一个输入文件，只要文件的末尾已经达到。这个设置针对一些文件只写一次，并且不会有更新的情况非常有用： - module: nginx access: input: close_eof: true 如果需要修改 filebeat.yml 这个配置文件，或者下面的 module 的配置文件，可以通过如下的命令来检查配置文件的正确如否： ./filebeat test config Config OK 如下： $ ./filebeat test output elasticsearch: http://192.168.0.3:9200... parse url... OK connection... parse host... OK dns lookup... OK addresses: 192.168.0.3 dial up... OK TLS... WARN secure connection disabled talk to server... OK version: 7.7.0 针对 Filebeat，它没有相应的命令来对模块进行测试。这一点和下面的 Metricbeat 是不同的。 我们甚至可以在运行 filebeat 的同时来启动相应的模块： ./filebeat --modules nginx, system, mysql 也可以直接在 modules.d 目录下把相应的文件名的 .disabled 去掉，从而使得该文件名是以 .yml 为结束的文件。通过这样的方法。我们也可以启动该模块。 还有一种方法就是在 filebeat.yml 文件中，直接添加相应启动的模块： filebeat.modules: - module: nginx - module: system - module: mysql 比如在 filebeat 启动 elasticsearch 模块的情况下，可以正对它做如下的配置： modules.d/elasticsearch.yml filebeat.modules: - module: elasticsearch server: var.paths: - ../elasticsearch*/logs/*_server.json slowlog: var.paths: - ../elasticsearch*/logs/*_index_search_slowlog.json - ../elasticsearch*/logs/*_index_indexing_slowlog.json gc: var.paths: - ../elasticsearch*/logs/gc/log.[0-9]* - ../elasticsearch*/logs/gc.log audit: var.paths: - ../elasticsearch*/logs/*_audit.json 上面是在启动对 Elasticsearch 的监控情况下，针对 elasticsearch 模块进行配置的示例。 1.4、启动 Filebeat 在上面，已经成功地配置了 filebeat，在接下来的步骤中，我们来启动 Filebeat： ./filebeat setup setup 命令将加载 Kibana 仪表板。 在上面，使用 setup 来加载仪表板等，另外一种方式是，直接修该 filebeat.yml 文件中的如下部分： 这样，当我们在下面的命令启动 Filebeat 时，它会自动帮我们完成上面的 ./filebeat setup 所完成的工作。 如果已经设置了仪表板，请忽略此命令。上面命令的输出结果为： ./filebeat setup Index setup finished. Loading dashboards (Kibana must be running and reachable) Loaded dashboards Loaded machine learning job configurations Loaded Ingest pipelines 在上面，可以看出来在 setup 这一步它帮我们配置好 dashboard，装载机器学习及 ingest pipleline。 接下来运行如下的命令来把我们的 sysetm 模块的数据送入到 Elasticsearch 之中： ./flebeat -e 点击 “Check data” 按钮： 在 Kibana 中，可以看到已经收到数据。 Beats 收集起来的数据被存放于由配置文件中 output.elasticsearch.index 所定义。在默认的情况下，它的值是这样的：{beat}-%{[agent.version]}-%{+yyyy.MM.dd}，比如，针对 Filebeat，在默认的情况下，我们会看到诸如 filebeat-7.13.0-2021-06-18 这样的索引名称。 1.5、运用 Dashboard 展示 Filebeat 数据 由于在上面的 filebeat setup 这一步已经为我们创建好了一个叫做 filebeat-* 的 index pattern，我们可以直接打开 Kibana 中的 Discover: 在右上角选好喜欢的时间区域，然后对数据进行查询： 接着点击 Dashboard： 选择 “[Filebeat System] Syslog dashboard ECS”: 在上面它展示了我电脑里的 Syslog 的所有 log 信息。我们也可以在上面选择 “Sudo commands”，“SSH logins” 及 “New users and groups” 分别进行查看。 从上面的展示可以查看来：Elastic 公司除了提供一个强大的数据搜索引擎之外，也在 Elastic Stack 中提出了开箱即用的工具。我们只需要简单的几部配置，就可以很方便地把我们所需要的日志数据导入到 Elasticsearch 中进行分析。 二、Metricbeat Metricbeat 的使用和 Filebea t的使用非常地相似。打开 Kibana，并按照如下的步骤来进行安装： 由于 Metricbeat 是属于 Metrics 范畴，所以选择 “Add metric data”: 同样地，针对 metrics，我们也想对 sysem 模块来做指标分析： 根据不同的平台，选择不同的方法进行安装。 2.1、下载 Metricbeat 首先安装如下的指令来下载并安装 metribeat: curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.5.0-darwin-x86_64.tar.gz tar xzvf metricbeat-7.5.0-darwin-x86_64.tar.gz cd metricbeat-7.5.0-darwin-x86_64/ 在安装目录的根目录下， 可以发现一个叫做 metribeat.yml 的文件。这个文件就是 metricbeat 的配置文件。 output.elasticsearch: hosts: ["<es_url>"] username: "elastic" password: "<password>" setup.kibana: host: "<kibana_url>" 2.2、配置 Metricbeat 首先进入到 Metricbeat 的安装目录，可看到如下的文件： pwd /Users/liuxg/elastic8/metricbeat-7.5.0-darwin-x86_64 liuxg-2:metricbeat-7.5.0-darwin-x86_64 liuxg$ ls LICENSE.txt fields.yml metricbeat.reference.yml NOTICE.txt kibana metricbeat.yml README.md logs module data metricbeat modules.d 在安装目录的根目录下， 我们可以发现一个叫做 metribeat.yml 的文件。这个文件就是 metricbeat 的配置文件。我们用我们喜爱的编辑器，并打开这个文件。找到如下的部分： output.elasticsearch: hosts: ["<es_url>"] username: "elastic" password: "<password>" setup.kibana: host: "<kibana_url>" 2.3、启动/禁止 Metricbeat 模块 可以通过如下的命令来展示所有 Metricbeat 的模块： 在上面可以看出来 redis 模板已经被启动，其它的模块都被禁止。 在默认的情况下，system 模块就被启动了。如果想启动 system 模块，可以使用如下的命令： ./metricbeat modules enable system 上面命令的返回结果是: Enabled system 如果想禁止 redis 模块，可以使用如下的命令： ./metricbeat modules disable redis 上面命令的返回结果是： Disabled redis 以使用如下的命令再次查询我们启动的模块: 可以看出来我们的 redis 模块已经从 Enabled 里移除了，取而代之的是 system 模块。 可以在 metricbeat 的安装目录下的 modules.d 子目录下可以查看到 system 模块的配置文件： 可以在 system.yml 中找到 system 模块的配置文件。 可以通过如下的命令来测试 metricbeat.yml 的配置是否成功： ./metricbeat test config 如果正确的话，会显示： $ ./metricbeat test config Config OK 也可以来测试某个模块： ./metricbeat test modules system 它将显示： $ ./metricbeat test modules system system... cpu...OK result: { "@timestamp": "2020-07-03T10:48:52.063Z", "event": { "dataset": "system.cpu", "duration": 19621, "module": "system" }, "metricset": { "name": "cpu", "period": 10000 }, "service": { "type": "system" }, ... 如果这个显示太多了。可以使用如下的命令来进行显示： ./metricbeat test modules system | grep OK 上面的命令显示的结果为： $ ./metricbeat test modules system | grep OK cpu...OK load...OK memory...OK network...OK process...OK "OK" "command_line": "grep OK", "cmdline": "grep OK", process_summary...OK socket_summary...OK OK OK uptime...OK 也可显示这个模块中的某个 metricset，比如，可以在 ./modules.d/system.yml 中可以看到如下的一些 metricsets： 可以对上面的 ./modules.d/system.yml 文件进行修改，比如采样的频率以及对各个 metricsets 进行启动或禁止。可以通过如下的命令来进行测试： ./metricbeat test modules system cpu 也可以来测试它的 output: $ ./metricbeat test output elasticsearch: http://localhost:9200... parse url... OK connection... parse host... OK dns lookup... OK addresses: ::1, 127.0.0.1 dial up... OK TLS... WARN secure connection disabled talk to server... OK version: 7.8.0 2.4、重新装载配置 关于配置 Metricbeat，有两个地方可以进行配置： metricbeat.yml：这里的配置对所有的模块都起作用。 模块配置文件：每个模块都有自己的在 modules.d 目录下的配置文件。这里的配置只针对每个模块起作用。 在默认的情况下，针对 metricbeat.yml 所做的任何改变在 metricbeat 运行的情况下都不会立即起作用，除非我们重新启动 metricbeat。为了能够使得 metricbeat 能够对动态修改起作用，可以对 reload.enabled 及 reload.period 进行配置，比如： metricbeat.config.modules: # Glob pattern for configuration loading path: ${path.config}/modules.d/*.yml reload.enabled: true reload.period: 10s 通过上面的配置，metricbeat 将会在每隔10秒钟来检查配置文件的改变。如果配置以及修改，那么将会采用新的配置。 2.5、启动 Metricbeat 在上面，已经成功地配置了 metricbeat，在接下来的步骤中，启动 Metricbeat： ./metricbeat setup setup 命令将加载 Kibana仪表板。 如果已经设置了仪表板，请忽略此命令。上面命令的输出结果为： ./metricbeat setup Index setup finished. Loading dashboards (Kibana must be running and reachable) Loaded dashboards 接下来运行如下的命令来把我们的 sysetm 模块的数据送入到 Elasticsearch 之中： ./metricbeat -e 这个时候，在 Kibana 中点击 “Check data” 按钮： 可以看到数据已经被 Elasticsearch 成功收到了。 2.6、运用 Dashboard 展示 Merticbeat 数据 在 Kibana 中，点击 Dashboard 应用： 点击 “[Metricbeat System] Overview ECS”: 可以看到我们的电脑的 system 指标信息。也可以点击上面的 “Host Overview” 及 “Container overview”。点击上面所示的 liu-2.local host，可以看到关于这个 host 的所有的 system 信息：
一、关于Beats 在集中式日志记录中，数据管道包括三个主要阶段：聚合，处理和存储。 在 ELK 堆栈中，传统上，前两个阶段是堆栈工作量 Logstash 的职责。执行这些任务需要付出一定的代价。 由于与 Logstash 的设计有关的内在问题，性能问题变得经常发生，尤其是在复杂的管道需要大量处理的情况下。将 Logstash 的部分职责外包的想法也应运而生，尤其是将数据提取任务转移到其他工具上。 正如本文中所描述的，这个想法首先在 Lumberjack 中体现出来，然后在 Logstash 转发器中体现出来。 最终，在随后的几个开发周期中，引入了新的改进协议，该协议成为现在所谓的 “Beats” 家族的骨干。 Beats 是轻量级（资源高效，无依赖性，小型）和开放源代码日志发送程序的集合，这些日志发送程序充当安装在基础结构中不同服务器上的代理，用于收集日志或指标（metrics）。这些可以是日志文件（Filebeat），网络数据（Packetbeat），服务器指标（Metricbeat）或 Elastic 和社区开发的越来越多的 Beats 可以收集的任何其他类型的数据。 收集后，数据将直接发送到 Elasticsearch 或 Logstash 中进行其他处理。Beats 建立在名为 libbeat 的 Go 框架之上，该框架用于数据转发，这意味着社区一直在开发和贡献新的 Beats。 1.1、Elastic Beats 1、Filebeat 顾名思义，Filebeat 用于收集和传送日志文件，它也是最常用的 Beat。 Filebeat 如此高效的事实之一就是它处理背压的方式 -- 因此，如果它连接的 Logstash 处于繁忙状态，Filebeat 会减慢其读取速率，并在减速结束后加快节奏。Filebeat 几乎可以安装在任何操作系统上，包括作为 Docker 容器安装，还随附用于特定平台（例如 Apache，MySQL，Docker等）的内部模块，其中包含这些平台的默认配置和 Kibana 对象。 2、Packetbeat 网络数据包分析器 Packetbeat 是第一个引入的 Beat。 Packetbeat 捕获服务器之间的网络流量，因此可用于应用程序和性能监视。Packetbeat 可以安装在受监视的服务器上，也可以安装在其专用服务器上。 Packetbeat 跟踪网络流量，解码协议并记录每笔交易的数据。 Packetbeat 支持的协议包括：DNS，HTTP，ICMP，Redis，MySQL，MongoDB，Cassandra 等。 3、Metricbeat Metricbeat 是一种非常受欢迎的 beat，它收集并报告各种系统和平台的各种系统级指标。 Metricbeat 还支持用于从特定平台收集统计信息的内部模块。你可以使用这些模块和称为指标集的 metricsets 来配置 Metricbeat 收集指标的频率以及要收集哪些特定指标。 4、Heartbeat Heartbeat 是用于 “uptime monitoring” 的。本质上，Heartbeat 是探测服务以检查它们是否可访问的功能，例如，它可以用来验证服务的正常运行时间是否符合你的 SLA。 你要做的就是为 Heartbeat 提供 URL 和正常运行时间指标的列表，以直接发送到Elasticsearch 或 Logstash 以便在建立索引之前发送到你的堆栈。 5、Auditbeat Auditbeat 可用于审核 Linux 服务器上的用户和进程活动。 与其他传统的系统审核工具（systemd，auditd）类似，Auditbeat 可用于识别安全漏洞-文件更改，配置更改，恶意行为等。 6、Winlogbeat Winlogbeat 仅会引起Windows系统管理员或工程师的兴趣，因为它是专门为收集 Windows 事件日志而设计的 Beat。 它可用于分析安全事件，已安装的更新等。 7、Functionbeat Functionbeat 被定义为 “serverless” 的发件人，可以将其部署为收集数据并将其发送到 ELK 堆栈的功能。 Functionbeat 专为监视云环境而设计，目前已针对 Amazon 设置量身定制，可以部署为 Amazon Lambda 函数，以从 Amazon CloudWatch，Kinesis 和 SQS 收集数据。 1.2、社区 Beats 开源社区一直在努力开发新的 Beats。可以在 Beat 讨论论坛的 Community Beats 类别中发布问题并讨论问题。目前有超过90个 Beats。如果大家有发现有用的 Beat，可以直接下载并使用。 1.3、Beats在Elastic堆栈中是如何融入 到目前为止，有如下的三种方式能够把我们所感兴趣的数据导入到 Elasticsearch中: 正如上面所显示的那样，可以通过： Beats：可以通过 beats 把数据直接导入到 Elasticsearch 中 Logstash：可以 Logstash 把数据导入。Logstash 的数据来源也可以是 Beats REST API：可以通过 Elastic 所提供的丰富的 API 来把数据导入到 Elasticsearch中。可以通过 Java, Python, Go, Nodejs 等各种 Elasticsearch API 来完成我们的数据导入。 Beats 是如何和其它的 Elastic Stack 一起工作的呢。 从上面可以看出来，Beats 的数据可以有如下的三种方式导入到 Elasticsearch 中： Beats ==> Elasticsearch Beats ==> Logstash ==> Elasticsearch Beats ==> Kafka ==> Logstash ==> Elasticsearch 正如上面所显示的那样： 可以直接把 Beats 的数据传入到 Elasticsearch 中，甚至在现在的很多情况中，这也是一种比较受欢迎的一种方案。它甚至可以结合 Elasticsearch 所提供的 pipeline 一起完成更为强大的组合。 可以利用 Logstash 所提供的强大的filter组合对数据流进行处理：解析，丰富，转换，删除，添加等等。你可以参阅我之前的文章 “Data转换，分析，提取，丰富及核心操作”。 针对有些情况，如果我们的数据流具有不确定性，比如可能在某个时刻生产大量的数据，从而导致 Logstash 不能及时处理，我们可以通过 Kafka 或者 Redis 做为 Messaging Queue 来做一个缓存。 1.4、摄入管道（ingest pipeline) 在 Elasticsearch 的节点中，有一类节点是 ingest node。ingest pipeline 运行于 ingest node 之上。 它提供了在对文档建立索引之前对其进行预处理的功能： 解析，转换并丰富数据。 管道允许你配置将要使用的处理器。 在上面的图中，可以看出来，我们可以使用在 Elasticsearch 集群里的 ingest node 来运行我们所定义的 processors。这些 processors 定义于 Elastic 的官方文档 Processors。 1.5、Libeat-创建 Beats 的 Go 架构 Libbeat 是一个用于数据转发的库。Beats 构建在名为 libbeat 的 Go 框架之上。 它是一个开源的软件。可以在地址 libbeat 找到它的源码。它可以轻松为你想要发送到 Elasticsearch 的任何类型的数据创建自定义 Beat。 对于一个 beat 来说，它可以分为如下的两个部分：数据收集器，数据处理器及发布器。后面的这个部分由 libbeat 来提供。 上面的 processor 可以由 Define processors 来了解。下面是其中的一些 processor 的例子： - add_cloud_metadata - add_locale - decode_json_fields - add_fields - drop_event - drop_fields - include_fields - add_kubernetes_metadata - add_docker_metadata 二、启动 Filebeat 及 Metricbeat 2.1、Filebeat 总览 Filebeat 是用于转发和集中日志数据的轻量级传送程序。 作为服务器上的代理安装，Filebeat 监视你指定的日志文件或位置，收集日志事件，并将它们转发到 Elasticsearch 或 Logstash 以进行索引。 Filebeat 具有如下的一些特性： 正确处理日志旋转：针对每隔一个时间段生产一个新的日志的案例，Filebeat 可以帮我们正确地处理新生产的日志，并重新启动对新生成日志的处理。 背压敏感：如果日志生成的速度过快，从而导致 Filebeat 生产的速度超过 Elasticsearch 处理的速度，那么 Filebeat 可以自动调节处理的速度，以达到 Elasticsearch 可以处理的范围内。 “至少一次”保证：每个日志生成的事件至少被处理一次。 结构化日志：可以处理结构化的日志数据数据。 多行事件：如果一个日志有多行信息，也可以被正确处理，比如错误信息往往是多行数据。 条件过滤：可以有条件地过滤一些事件。 Filebeat 的工作方式如下：启动 Filebeat 时，它将启动一个或多个输入，这些输入将在为日志数据指定的位置中查找。对于 Filebeat 所找到的每个日志，Filebeat 都会启动收集器（havester）。 每个收割机都读取一个日志以获取新内容，并将新日志数据发送到 libbeat。libbeat 会汇总事件，并将汇总的数据发送到为 Filebeat 配置的输出。 从上面有可以看出来在 spooler 里有一些缓存，这个可以用于重新发送以确保至少一次的事件消费，同时也可以用于背压敏感。一旦 Filebeat 生成的事件的速度超过 Elasticsearch 能够处理的极限，这个缓存可以用于存储一些事件。每个 Filebeat 可以配置多个 input，并且每个 input 可以配置来采集一个或多个文件路径的文件。 就像上面的图显示的那样，Filebeat 支持多种输入方式。你可以在 Filebeat 的配置文件 filebeat.yml 中进行多次的配置： filebeat.yml filebeat.inputs: - type: log paths: - /var/log/system.log - /var/log/wifi.log - type: log paths: - "/var/log/apache2/*" fields: apache: true fields_under_root: true Filbeat 支持如下的一些输出： Elasticsearch Logstash Kafka Redis File Console Cloud 2.2、Metricbeat 总览 Metricbeat 是一种轻量级的数据摄入器，你可以将其安装在服务器上，以定期从操作系统和服务器上运行的服务收集指标。 Metricbeat 会收集它的指标和统计信息，并将其运送到你指定的输出，例如 Elasticsearch 或 Logstash。 Mettric 类型：Metric 可以收集如下两种类型的指标： 为了能够收集指标，我们必须把 Metricbeat 部署在需要监控的机器上。它除了能够对主机机进行指标采集，比如内存，CPU，硬盘等的实用情况，它同时也可以对运用于上面的服务比如 Nginx, Apache, MySQL 等的指标进行采集。 Metricbeat 通过从服务器上运行的系统和服务收集指标来帮助你监视服务器，例如： Apache HAProxy MongoDB MySQL Nginx PostgreSQL Redis System Zookeeper Metricbeat 具有一些特性： 轮询服务的 API 以收集指标。 有效地将指标存储在 Elasticsearch 中。 通过 JMX / Jolokia，Prometheus，Dropwizard，Graphite 的应用程序指标。 自动贴标：表明是从 AWS, Docker， Kubernetes, GoogleCloud 或 Azure 采集的。 Metricbeat 由模块和指标集组成。 Metricbeat 模块定义了从特定服务（例如 Redis，MySQL 等）收集数据的基本逻辑。 该模块指定有关服务的详细信息，包括如何连接，收集指标的频率以及收集哪些指标。 每个模块都有一个或多个指标集。 指标集是模块的一部分，用于获取和构建数据。 指标标准集不是将每个指标收集为单独的事件，而是在对远程系统的单个请求中检索多个相关指标的列表。 因此，例如，Redis 模块提供了一个指标集，该指标集通过运行 INFO 命令并解析返回的结果来从 Redis 收集信息和统计信息。 同样，MySQL 模块提供了一个状态指标集，该指标集通过运行 SHOW GLOBAL STATUS SQL 查询 从 MySQL 收集数据。 通过在远程服务器返回的单个请求中将相关指标标准集组合在一起，指标标准集使你更轻松。 如果没有用户启用的指标标准集，则大多数模块都具有默认指标集。 Metricbeat 通过根据你在配置模块时指定的周期值定期询问主机系统来检索指标。 由于多个指标集可以将请求发送到同一服务，因此 Metricbeat 尽可能重用连接。 如果 Metricbeat 在超时配置设置指定的时间内无法连接到主机系统，它将返回错误。 Metricbeat 异步发送事件，这意味着未确认事件检索。 如果配置的输出不可用，则事件可能会丢失。 三、什么是 Filebeat 和 Merticbeat 模块 一个 Filebeat 模块通常由如下的部分组成： Filebeat 模块简化了常见日志格式的收集，解析和可视化。文件集包含以下内容： Filebeat 输入配置，其中包含在其中查找日志文件的默认路径。 这些默认路径取决于操作系统。 Filebeat 配置还负责在需要时将多行事件缝合在一起。 Elasticsearch Ingest Node 管道定义，用于解析日志行。 字段定义，用于为每个字段配置具有正确类型的 Elasticsearch。 它们还包含每个字段的简短说明。 示例 Kibana 仪表板（如果有）可用于可视化日志文件。 Filebeat 会根据你的环境自动调整这些配置，并将它们加载到相应的 Elastic Stack 组件中。 一个典型的模块（例如，对于 Nginx 日志）由一个或多个文件集（对于 Nginx，访问和错误）组成，比如，Nginx 模块解析 NGINX HTTP 服务器创建的访问和错误日志。它在幕后执行如下的一些任务： 设置日志文件的默认路径（你可以更改） 确保每个多行日志事件都作为单个事件发送 使用 ingest node 来解析和处理日志行 将数据塑造成适合在 Kibana 中进行可视化的结构 部署仪表板以可视化日志数据 针对其它的 Beats 模块来说，基本和 Filebeat 一样。目前针对 Elasticsearch 所提供的模块来说，有非常多的模块可以供使用：
一、写入数据到ES Logstash 的安装根目录下，创建一个如下的配置文件： logstash.conf input { generator { message => "liuxg" count => 1 } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["https://localhost:9200"] index => "data-%{+YYYY.MM.dd}" user => "elastic" password => "ndktp2Xr2h_*Q6EZfq4t" ssl_certificate_verification => true truststore => "/Users/liuxg/elastic/elasticsearch-8.4.1/config/certs/http.p12" truststore_password => "buSYG3l-R0mdN6pggG76VA" } } 在上面的第一个部分，使用 generator 来生成一个 message。我们在 output 里定义两个输出，一个是 stdout，而另外一个是 elasticsearch output。查阅官方文档，并对它做如上的配置。需要指出的是： hosts：这个是 Elasticsearch 集群的终端地址。你需要根据自己的配置进行修改 index：这个在 Elasticsearch 中创建的索引的名称 user：这个是在 Elasticsearch 中创建的用户。此处使用的是超级用户 elastic，尽管这个在生产环境中是不必要的。 password：这个是上面的 user 用户对应的密码 ssl_certificate_verification：当为 true 时，启动 SSL 检验 truststore：这个是 Elasticsearch 的证书所在的地址 truststore_password：这个是 truststore 的密码 可以根据如下的方式来得到这个密码： $ pwd /Users/liuxg/elastic/elasticsearch-8.4.1 $ ./bin/elasticsearch-keystore list keystore.seed xpack.security.http.ssl.keystore.secure_password xpack.security.transport.ssl.keystore.secure_password xpack.security.transport.ssl.truststore.secure_password $ ./bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password buSYG3l-R0mdN6pggG76VA 在上面的最后一个命令中它显示了 keystore 的密码。 $ pwd /Users/liuxg/elastic/elasticsearch-8.4.1 $ ./bin/elasticsearch-keystore list keystore.seed xpack.security.http.ssl.keystore.secure_password xpack.security.transport.ssl.keystore.secure_password xpack.security.transport.ssl.truststore.secure_password $ ./bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password buSYG3l-R0mdN6pggG76VA $ ls config/certs/ http.p12 http_ca.crt transport.p12 在 Logstash 的安装目录下使用如下的方式来进行运行： ./bin/logstash -f logstash.conf 在上面，使用了 http.p12 证书来进行这样的操作。可以使用如下的命令来查看这个证书： $ pwd /Users/liuxg/elastic/elasticsearch-8.4.1 $ ./bin/elasticsearch-keystore list keystore.seed xpack.security.http.ssl.keystore.secure_password xpack.security.transport.ssl.keystore.secure_password xpack.security.transport.ssl.truststore.secure_password $ ./bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password Jn1YI7FMSNaiAXjUsdp4Mw $ cd config/certs/ $ keytool -keystore http.p12 -list Enter keystore password: Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 2 entries http, Sep 26, 2022, PrivateKeyEntry, Certificate fingerprint (SHA-256): 97:D0:50:B0:31:73:42:67:D1:00:7C:71:F2:4D:D4:9E:AC:73:99:39:AC:E8:34:EB:DA:2F:0B:5E:F6:65:D3:CD http_ca, Sep 26, 2022, PrivateKeyEntry, Certificate fingerprint (SHA-256): B4:8C:3E:33:FE:E5:AA:42:CF:1F:36:AC:94:D2:47:B2:3E:A3:B1:27:52:67:C5:6F:7B:CB:FF:9F:30:47:56:99 从上面的输出中，可以看出来，在 http.p12 中有两个 entry，其中一个是私钥。考虑到并不便于发送这个给客户端。我们可以使用如下的方法来创建 truststore： keytool -import -file http_ca.crt -keystore truststore.p12 -storepass password -noprompt -storetype pkcs12 如上所示，它在当前的目录下创建一个叫做 truststore.p12 的文件。它的密码是 password。我们可以使用如下的命令来查看这个 truststore 的内容： keytool -keystore truststore.p12 -list 如下： $ pwd /Users/liuxg/elastic/elasticsearch-8.4.1/config/certs $ ls http.p12 http_ca.crt transport.p12 $ keytool -import -file http_ca.crt -keystore truststore.p12 -storepass password -noprompt -storetype pkcs12 Certificate was added to keystore $ ls http.p12 http_ca.crt transport.p12 truststore.p12 $ keytool -keystore truststore.p12 -list Enter keystore password: Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 1 entry mykey, Sep 30, 2022, trustedCertEntry, Certificate fingerprint (SHA-256): B4:8C:3E:33:FE:E5:AA:42:CF:1F:36:AC:94:D2:47:B2:3E:A3:B1:27:52:67:C5:6F:7B:CB:FF:9F:30:47:56:99 如上所示，我们可以看到在生成的 truststore.p12 中只有一个项目。它的别名叫做 mykey。 根据上面所生成的 truststore.p12 及其访问密码 password，我们可以修改上面的 elasticsearch 配置如下： elasticsearch { hosts => ["https://localhost:9200"] index => "data-%{+YYYY.MM.dd}" user => "elastic" password => "ndktp2Xr2h_*Q6EZfq4t" ssl_certificate_verification => true truststore => "/Users/liuxg/elastic/elasticsearch-8.4.1/config/certs/truststore.p12" truststore_password => "password" } 再次重新运行之前的命令即可。 二、运用 API key 来进行连接 也可以试验 API Key 来连接到 Elasticsearch。首先，创建一个 API Key： 这样就创建了一个 API key。点击上面右边的文档小图标，并拷贝 APK key。这个 key 将在下面的配置中使用。 接着创建如下的一个 Logstash 的配置文件： logstash.conf nput { generator { message => "liuxg" count => 1 } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["https://localhost:9200"] index => "data-%{+YYYY.MM.dd}" ssl => true ilm_enabled => true ssl_certificate_verification => false api_key => "GMl1S4QBW_e6QIS4FQXK:KtC_17NAQt6Ef_7xuqzUCA" } } 把上面的文件保存于 Logstash 安装的根目录下，并使用如下的命令来进行运行： ./bin/logstash -f logstash.conf
一、下载数据 须先得到数据。可以到网址 kaggle.com 进行下载。该网站含有大量的数据可以供下载。 二、Index CSV 文件到 Elasticsearch logstash_cars.config 文件的内容如下： input { file { path => "/Users/liuxg/data/cars.csv" start_position => "beginning" sincedb_path => "/dev/null" } } filter { csv { skip_header => true separator => "," columns => [ "maker", "model", "mileage", "manufacture_year", "engine_displacement", "engine_power", "body_type", "color_slug", "stk_year", "transmission", "door_count", "seat_count", "fuel_type", "date_created", "date_last_seen", "price_eur" ] } mutate { convert => ["mileage", "integer"] } mutate { convert => ["price_eur", "float"] } mutate { convert => ["engine_power", "integer"] } mutate { convert => ["door_count", "integer"] } mutate { convert => ["seat_count", "integer"] } } output { elasticsearch { hosts => "localhost:9200" index => "cars" document_type => "sold_cars" } stdout {} } 这里有几点需要说明的： 由于第一行有一个 header，所以，我们可以设置 skip_header 为 true 来跳过。 在 input 中，我们定义了一个文件，它的 path 指向我们的 csv 文件的位置。start_position 指向 beginning。如果对于- 一个实时的数据源来说，它通常是 ending，这样表示它每次都是从最后拿到那个数据。sincedb_path 通常指向一个文件。这个文件保存上次操作的位置。针对我们的情况，我们设置为 /dev/null，表明，我们不存储这个数据。 在 filter 中，CSV filter 是非常直接的，不太需要很多的解释。这里的 column 都来自于我们的 csv 表格。通常 Logstash 会把每个数据都当做是字符串。针对我们的情况，我们可看到 mileage 是一个整型数，price_eur 是一个浮点数。这些我们都需要进行调整。这个调整我们可以通过 mutate 来完成。 在 output 之中，我们制定本地的 Elasticsearch 为我们的数据库，它的 index 是 cars，同时 document_type 为_doc。我们也同时使用 stdout，这样我们可以在 terminal 屏幕中看出数据在处理之中。 三、装载数据到 Elasticsearch 首先进入到 Logstash 的安装目录，然后打入如下的命令： sudo ./bin/logstash -f ~/data/logstash_cars.config 提示：在运行 Logstash 时使用 -r 标志可让你在更改和保存配置后自动重新加载配置。 在测试新配置时，这将很有用，因为你可以对其进行修改，这样就不必在每次更改配置时都手动启动 Logstash。 然后，可以在屏幕上看到如下的输出： 同时如果这在 Kibana 上可以看到正在 index 的 cars index 数量（count)是一直变化的。 经过一段时间的运行，可以看到屏幕上不再滚动了，表明 Logstash 已经完成了数据的传输。可以在 Kibana 上打入如下的命令： GET cars/_stats 以看到的 cars Index 的统计数据： 可以看到共有 3,167,984 条数据，并且它的大小有 2.466G 这么大的数据。 可以打入如下的命令： GET cars 可以看到 Elasticsearch 已经为我们创建好了 mapping，并且它们的数据类型也可以看到： { "cars" : { "aliases" : { }, "mappings" : { "properties" : { "@timestamp" : { "type" : "date" }, ... "color_slug" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "door_count" : { "type" : "long" }, "engine_power" : { "type" : "long" }, "fuel_type" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "host" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, ... }, "settings" : { "index" : { "creation_date" : "1567949013407", "number_of_shards" : "1", "number_of_replicas" : "1", "uuid" : "tYT-XWpFTGiqwn_rMX4S3A", "version" : { "created" : "7030099" }, "provided_name" : "cars" } } } } 可以看到 door_count 及 engine_power 都已经修改为 long 数据类型了。在默认的情况下已经为我们创建了一个 replica。 四、在 Kibana 上显示数据 五、下载 Apache 例子日志 方法一： 可以到地址 examples/apache_logs at master · elastic/examples · GitHub进行下载。然后存于自己的一个本地目录当中。 方法二： 在本地的目录使用如下的方法： debian： wget https://raw.githubusercontent.com/elastic/examples/master/Common%20Data%20Formats/apache_logs/apache_logs Mac: curl -L -O https://raw.githubusercontent.com/elastic/examples/master/Common%20Data%20Formats/apache_logs/apache_logs Log 的每条记录有如下的格式： 83.149.9.216 - - [17/May/2015:10:05:03 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36" 83.149.9.216 - - [17/May/2015:10:05:43 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-dashboard3.png HTTP/1.1" 200 171717 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36" 为了能够使得应用正确运行，必须下载一个叫做 apache_template.json 的 tempate 文件，并把这个文件置于和 log 文件同一个目录中。这个文件在如下的 Logstash 的配置中将会被用到。 六、安装 Filebeat 需要使用 Filebeat 来把我们的 log 信息进行读取，并传入到 Elastcsearch 之中。 deb: curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-amd64.deb sudo dpkg -i filebeat-7.3.1-amd64.deb rpm: curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm sudo rpm -vi filebeat-7.3.1-x86_64.rpm mac: curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-darwin-x86_64.tar.gz tar xzvf filebeat-7.3.1-darwin-x86_64.tar.gz brew: brew tap elastic/tap brew install elastic/tap/filebeat-full linux: curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-linux-x86_64.tar.gz tar xzvf filebeat-7.3.1-linux-x86_64.tar.gz 这样 Filebeat 就安装好了。请注意：由于 ELK 迭代比较快，可以把上面的版本 7.3.1 替换成需要的版本即可。先不要运行 Filebeat。 在 Filebeat 的安装目录下，可以创建一个这样的 filebeat_apache.yml 文件，它的内容如下： filebeat.inputs: - type: log enabled: true paths: - /Users/liuxg/data/apache_logs output.logstash: hosts: ["localhost:5044"] 七、配置 Logstash 最后看到的信息： { "input" => { "type" => "log" }, "clientip" => "199.16.156.124", "message" => "199.16.156.124 - - [18/May/2015:14:05:13 +0000] \"GET /files/lumberjack/lumberjack-0.3.0.exe HTTP/1.1\" 200 4378624 \"-\" \"Twitterbot/1.0\"", "verb" => "GET", "ecs" => { "version" => "1.0.1" }, "httpversion" => "1.1", "response" => 200, "timestamp" => "18/May/2015:14:05:13 +0000", "referrer" => "\"-\"", "@timestamp" => 2015-05-18T14:05:13.000Z, "log" => { "offset" => 780262, "file" => { "path" => "/Users/liuxg/data/apache_logs" } }, "@version" => "1", "geoip" => { "timezone" => "America/Chicago", "country_code2" => "US", "ip" => "199.16.156.124", "country_code3" => "US", "longitude" => -97.822, "country_name" => "United States", "latitude" => 37.751, "continent_code" => "NA", "location" => { "lon" => -97.822, "lat" => 37.751 } }, "ident" => "-", "tags" => [ [0] "beats_input_codec_plain_applied" ], "bytes" => 4378624, "host" => { "name" => "localhost" }, "agent" => { "hostname" => "localhost", "id" => "c88813ba-fdea-4a98-a0be-468fb53566f3", "ephemeral_id" => "e146fbc1-8073-404e-bc6f-d692cf9303d2", "type" => "filebeat", "version" => "7.3.0" }, "request" => "/files/lumberjack/lumberjack-0.3.0.exe", "auth" => "-" } 八、运行 Logstash 及 Filebeat 可以通过如下的方式来运行 Logstash： ./bin/logstash -f ~/data/apache_logstash.conf 这里的 -f 选项用来指定我们的定义的 Logstash 的配置文件。 进入到 Filebeat 的安装目录，并通过如下的命令来执行 Filebeat 的数据采集，并传入到 Logstash 之中： ./filebeat -c filebeat_apache.yml 这里用 -c 选项来指定我们的 Filebeat 的配置文件。 如果想重新运行 filebeat 并重新让 Logstash 处理一遍数据，可以删除 registry 目录： Filebeat 的 registry 文件存储 Filebeat 用于跟踪上次读取位置的状态和位置信息。 data/registry 针对 .tar.gz and .tgz 归档文件安装 /var/lib/filebeat/registry 针对 DEB 及 RPM 安装包 c:\ProgramData\filebeat\registry 针对 Windows zip 文件 如果想重新运行数据一遍，可以直接到相应的目录下删除那个叫做 registry 的目录即可。针对 .tar.gz 的安装包来说，我们可以直接删除这个文件： localhost:data liuxg$ pwd /Users/liuxg/elastic/filebeat-7.3.0-darwin-x86_64/data localhost:data liuxg$ rm -rf registry/ 等删除完这个 regsitry 目录后，再重新运行 filebeat 命令。 output 直接在屏幕上输出点表示进度。同时输出内容到 Elasticsearch。 九、在 Kibana 里查看索引 apache_logs 的数据成功导入到 Elasticsearch 之中。根据我们上面的配置文件，这个索引的名字叫做 apache_elastic_example。我们可以在 Kibana 中查看： 可以建立一个 Index Pattern，并对数据进行分析： 参考资料： https://blog.csdn.net/UbuntuTouch/article/details/100606857
1、使用ES自带的XPACK开启密码校验 在 es7.0 版本以后（之前的版本没怎么用过，不太清楚）安装包默认自带了 xpack 功能，所以只需要在 es 包下的 config 目录修改一下 es 的默认配置文件elasticsearch.yml即可。 在elasticsearch.yml中追加写入以下参数： xpack.security.enabled: true ## 加密方式 xpack.license.self_generated.type: basic xpack.security.transport.ssl.enabled: true 然后重启es让配置文件生效，再到 es 包下 bin 目录执行以下命令： ./elasticsearch-setup-passwords interactive 运行结果如下： 运行完以后则会出现以上界面，先是提醒你，es链接会需要密码，可能会影响现在的使用，再接下来就是会默认的创建6个用户，并让你设置这六个用户的密码（忽略掉用户名，这些用户权限都是相同的） 设置完成以后，这时候再访问 es 的地址，就会提示安全错误信息了，到此，es 的密码设置完成。 2、使用 postman 访问带密码的 当 es 设置完成密码后，就不能再像之前那样随心所欲的访问了，否则会返回安全错误异常。 这时候我们在访问的时候就需要把用户名和密码的认证信息附加上去，如果你平时使用的是curl命令进行操作 es，那么只需要在curl 后增加 –user 用户名:密码 即可，示例如下： curl 172.1.11.x:9200 --user elastic:123456 但是命令行的操作体验很不好，大部分人还是使用 postman 进行请求的，在 postman 中请求加密的es就比较麻烦一点，要在 request head 里新增Authorization参数。 在浏览器中请求 es 的首页，也就是地址加端口，这时候会让你输入用户名和密码，当输入后，会跳转到首页。 然后打开浏览器的调试功能，从该请求中获取到Authorization参数，如下： 因为在 es 的配置文件中，选用的加密方式为 basic，也就是该项xpack.license.self_generated.type: basic， 所以我们也可以对用户名密码进行手动加密，访问 https://www.base64encode.org/ 地址，在输入框中输入elastic:123456，进行加密，并在头部加上Basic字符串就是最终的Authorization的值了，该值与第一种方式获取的是一致的。 获取到Authorization以后，在 postman 进行设置，即可如常访问：