ElasticSearch:如何配置 logging.yml

ElasticSearch: How to configure logging.yml

我已经在 Ubuntu 机器上安装了 ElasticSearch 1.4.1。

其日志位于默认位置:

/var/log/elasticsearch/

当我 运行 使用 ElasticSearch 时,一段时间后日志文件变大,变得难以处理。

日志已经处于循环文件模式。也就是说,每天都有一个新的日志文件。

我想配置要压缩的日志(例如 = file.log.zip ,目前它们不是)。

我也知道我可以在logging.yml文件里做但是我不知道怎么做

有人可以帮我吗?

经过一番挖掘(也在 ElasticSearch 源代码中),我找到了答案。 :)

通常,当您使用像 ElasticSearch 这样的软件并希望将其用于生产时,您会认为像日志记录这样的基本功能就可以解决所有问题。 遗憾的是,在当前版本(1.4 和之前的版本)中情况并非如此。

ElasticSearch 使用 log4j 作为其日志记录机制。

log4j 正在执行以下操作:

  1. 将日志添加到日志文件
  2. 当日志文件大于 CONFIGURED_VALUE
  3. 时旋转日志文件

如果 ElasticSearch 的使用量很大,日志会堆积起来并最终填满您的整个存储空间。

答案是添加以下内容:

  1. 压缩旧的旋转日志文件
  2. 确保日志文件总数不会超过CONFIGURED_VALUE

答案是还有另一个 API 称为 log4j-extensions,它扩展了 log4j 功能并压缩了旋转日志文件。

遗憾的是,它将仅在下一个版本 1.5 或 master 分支中提供给我们这些从源代码编译 ElasticSearch 的疯子。 (参见 log4j rollingPolicy support)。

但是,有一个更简单的解决方案:

使用 LOGROTATE 来处理您的日志。

如果 ElasticSearch 在 Linux OS 上 运行,您可以使用 logrotate 守护程序。 (看看什么是log rotateUnderstanding logrotate utility

您需要执行以下操作:

  1. 重置日志配置
  2. 创建用于处理日志文件的新文件

重置日志配置

sudo vi /etc/elasticsearch/logging.yml

更改logging.yml

中的以下内容
# Mark the dailyRollingFile Appender
#  file:
#    type: dailyRollingFile
#    file: ${path.logs}/${cluster.name}.log
#    datePattern: "'.'yyyy-MM-dd"
#    layout:
#      type: pattern
#      conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"

# Add the file Appender
file:
  type: file
  file: ${path.logs}/${cluster.name}.log
  datePattern: "'.'yyyy-MM-dd"
  layout:
    type: pattern
    conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"

创建用于处理日志文件的新文件

sudo vi /etc/logrotate.d/elasticsearch

将以下内容添加到 logrotate 文件中:

/var/log/elasticsearch/*.log {
    daily
    rotate 100
    size 50M
    copytruncate
    compress
    delaycompress
    missingok
    notifempty
    create 644 elasticsearch elasticsearch
}

之后重启 ElasticSearch

sudo service elasticsearch stop
sudo service elasticsearch start

这样您就可以将总日志文件存储限制为 5GB(循环 100 * 50M)。

显然,您可以根据需要配置它。

我有点不同意你的回答。首先,我建议不要使用 zip,如果您改用 gzip,您仍然可以从命令行读取文件而无需先解压它们。其次,虽然 logrotation 是一个方便的工具,但 log4j 应该能够本地处理它自己的日志轮换。以下配置应该可以很好地工作:

 file:
    type: org.apache.log4j.rolling.RollingFileAppender
    file: ${path.logs}/${cluster.name}.log
    rollingPolicy: org.apache.log4j.rolling.TimeBasedRollingPolicy
    rollingPolicy.FileNamePattern: ${path.logs}/${cluster.name}.log.%d{yyyy-MM-dd}.gz
    layout:
      type: pattern
      conversionPattern: "%d{ISO8601}[%-5p][%-25c] %m%n"