Elastic:配置 Elasticsearch 服务器 logs

当我们运行 Elasticsearch 集群时,我们可以看到一些 Elasticsearch 的日志,比如我们可以在如下的目录中找到相应的一些 server 日志:

<cluster name>.log
<cluster name>_server.json

假如我在 config/eleasticsearch.yml 文件中把 cluster.name 定义为如下的值:

cluster.name: liuxg-cluster

那么我们就可以在 logs/ 目录下看到如下的文件:

$ pwd
/Users/liuxg/elastic0/elasticsearch-7.10.0/logs
liuxg:logs liuxg$ ls liuxg-cluster*
liuxg-cluster.log
liuxg-cluster_audit.json
liuxg-cluster_deprecation.json
liuxg-cluster_deprecation.log
liuxg-cluster_index_indexing_slowlog.json
liuxg-cluster_index_indexing_slowlog.log
liuxg-cluster_index_search_slowlog.json
liuxg-cluster_index_search_slowlog.log
liuxg-cluster_server.json

从上面,我们可以看到所有的文件以 liuxg-cluster 开始的文件名。这些日志记录了 elasticsearch 运行的状态。依据不同的日志等级,它会记录不同的事件。

 

Log structure

Log 的结构是这样描述的:

<name of logging hierarchy>=<level>

Log level

可以在网址 https://logging.apache.org/log4j/2.x/manual/customloglevels.html

Standard log levels built-in to Log4J
Standard LevelintLevel
OFF0
FATAL100
ERROR200
WARN300
INFO400
DEBUG500
TRACE600
ALLInteger.MAX_VALUE

在默认的情况下,你将到 INFO 级的日志信息。我们可以改变这个 log level 来记录想要级别的日志信息。

Logger Hierarchy

我们可以在网址找到 logger hierachy 的定义: https://logging.apache.org/log4j/2.x/manual/architecture.html

我们可以把 Log 设置为某个想要的 package,比如在上面,我们对 transport 这个 package 进行配置。我们可以得到各种级别的日志信息。

 

配置 Log

有四种方法可以供我们选择来配置 Log。

Command-Line

当我们使用命令行来启动 Elasticsearch 时,我们可以直接使用命令行参数来启动相应的日志级别:

-E<name of logging hierarchy>=<level>

通常这种用于单节点的临时需要调试的集群。如果你的集群不能正常启动,你可以修改这个配置来查看更多的信息。

我们可以通过如下的方式来启动 Elasticsearch:

./bin/elasticsearch -Elogger.level=WARN

我们不能使用如下的格式来启动,这是由于一个 bug

./bin/elasticsearch -Elogger._root=WARN

当我们不带任何参数直接启动 Elasticsearch 时:

./bin/elasticsearch

我们可以看到许多如上图所示的 INFO 日志,也就是说在默认的情况下,elasticsearch 显示的是 INFO 及以上的日志信息。

如果我们把日志级调整为 WARN 级:

./bin/elasticsearch -Elogger.level=WARN

从上面的输出中,我们可以看到,只有 WARN 及以上级别的日志信息。在之前看到的那些 INFO 级的日志信息不见了。

 

通过 elasticsearch.yml 来进行配置

当我们想永久性地保存我们的日志级别,我们可以通过修改 config/elasticsearch.yml 文件来进行修改。通常我们在 Linux 环境下运行 elasticsearch 作为一个服务,我们没有办法为服务提供参数,那么通过修改 elasticsearch.yml 将是一个绝佳的方法。这种方法非常简单,我们只需要在 config/elasticsearch.yml 文件的后面添加如下的一句:

logger.level: WARN

同样地,如下的方法是不可以使用的:

logger._root: WARN

然后,我们直接启动 elasticsearch 而不用带任何的参数:

./bin/elasticsearch

和之前的一样,我们只看到一个 WARN 及以上的日志信息。

 

通过 cluster settings API

这是一个比较快速并常用的方法。这种方法的好处是,你不需要重新启动你的 elasticsearch 集群。我们只需要使用下面的一个 API 命令,它将会为整个集群发生作用。我们不需要为每个节点来分别配置。在做下面的实验之前,请先把在上一步在 config/elasticsearch.yml 中进行的配置移去。我们重新启动 elasticsearch 并不要带任何的参数。在 Kibana 的 console 中打入如下的命令:

PUT _cluster/settings
{
  "transient": {
    "name of logging hierachy": "<level>"
  }
}

在上面我们使用了 transient 而不是 persistent。使用 transient 的好处是当我们重新启动 elasticsearch 集群时,之前所做的设置将会消失。

我们可以通过如下的命令来设置 WARN 级的日志:

PUT _cluster/settings
{
  "transient": {
    "logger._root": "WARN"
  }
}

这里 logger_root 表示适用于所用的 package。上面的命令的返回信息是:

{
  "acknowledged" : true,
  "persistent" : { },
  "transient" : {
    "logger" : {
      "_root" : "WARN"
    }
  }
}

针对这种用法,由于一个 bug 的存在,如下的这种方法不适用:

PUT _cluster/settings
{
  "transient": {
    "logger.level": "WARN"
  }
}

它将产生如下的错误信息:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "transient setting [logger.level], not dynamically updateable"
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "transient setting [logger.level], not dynamically updateable"
  },
  "status" : 400
}

如果我们想设置回默认的状态,我们可以通过如下的方法:

PUT _cluster/settings
{
  "transient": {
    "logger._root": null
  }
}

通过  log4j2.properties 来进行配置

我们可以通过修改 log4j2.properties 并按照如下的方法来进行配置:

logger.<unique_ID>.name = <name of logging hierarch>
logger.<unique_ID>.level = <level>

我们甚至可以配置使得日志记录于另外一个文件中,尽管在多数的情况下,这个并不需要。

比如在一下的位置,我们可以来配置它的文件名及文件的格式等:

appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.json
appender.rolling.layout.type = ESJsonLayout
appender.rolling.layout.type_name = server

我们可以修改如下的位置来修改日志的级别:

rootLogger.level = info
rootLogger.appenderRef.console.ref = console
rootLogger.appenderRef.rolling.ref = rolling
rootLogger.appenderRef.rolling_old.ref = rolling_old

Slow logs

如果你想了解更多关于 slow logs,请阅读我之前的文章 “Elasticsearch:Elasticsearch 中的慢日志”。

 

运用 filebeat 收集 elasticsearch 日志

我们首先安装好 filebeat。你可以参考文章 “Beats 入门教程 (二)” 来安装好自己的 filebeat。在我的安装中,我们的 filebeat 的安装和 elasticsearch 是处于同一目录下的。

$ pwd
/Users/liuxg/elastic0
liuxg:elastic0 liuxg$ find . -type d -depth 1
./elasticsearch-7.10.0
./filebeat-7.10.0-darwin-x86_64
./apm-server-7.10.0-darwin-x86_64
./logstash-7.10.0
./metricbeat-7.10.0-darwin-x86_64
./kibana-7.10.0-darwin-x86_64

紧接着,我们修改 filebeat.yml 文件。在 filebeat.yml 文件的后面添加如下的部分:

filebeat.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

我们接着在 filebeat 的安装根目录下运行如下的命令:

./filebeat -e

等运行完上面的指令后,我们可以在 console 中看到如下的输出:

上面显示被收集的日志文件及路径。

 

查看日志

我们首先打开 Stack monitoring:

我们使用 “Or, set up with self monitoring”,当然你也可以选择 “Set up monitoring with Metricbeat”,这也是生产环境推荐的方法:

从上面可以看出来有日志信息进入到监控的应用。点击 Log 链接:

从上面,我们可以看到一些指标以及一些日志的信息。

我们也可以从 Discover 查看所有的日志:

我们可以搜索我们的日志,比如:

已标记关键词 清除标记
相关推荐