在 elasticsearch 中向 appender 添加过滤器 - 记录 yml 语法

Add a filter to appender in elasticsearch - logging yml syntax

我正在使用 Elasticsearch v1.3.2。

我想打开缓慢搜索执行时间的日志记录,但我想过滤掉针对 marvel 的搜索。

Elasticsearch 似乎说我们可以根据 log4j v1.2 文档自定义日志记录(参见 w ww.elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html 的底部)

我查看了 log4j v1.2 文档 (https://logging.apache.org/log4j/1.2/apidocs/index.html, and http://wiki.apache.org/logging-log4j/Log4jXmlFormat?highlight=%28filter%29),看起来我应该能够将 stringMatchFilter 添加到 index_search_slow_log_file appender,但是一切我试着吐出来。

这是我期望在 logging.yml:

中应该起作用的
index_search_slow_log_file:
  type: dailyRollingFile
  file: ${path.logs}/${cluster.name}_index_search_slowlog.log
  datePattern: "'.'yyyy-MM-dd"
  layout:
    type: pattern
    conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"
  filter: 
      type: stringMatchFilter
        acceptOnMatch: true
        stringToMatch: "marvel"

这给出了这个例外:

log4j:WARN Failed to set property [filter] to value "stringMatchFilter".
log4j:ERROR Could not instantiate class [true].
java.lang.ClassNotFoundException: true
     at ..........

我也试过:

index_search_slow_log_file:
  ...
  filter: 
      type: stringMatch
        acceptOnMatch: true
        stringToMatch: "marvel"

以及我能想到的所有其他组合,包括删除引号。

谁能看出我做错了什么?

谢谢!

伊莎贝尔

您的语法有点不完整:-),请使用以下内容,看看它是否适合您。过滤器语法使用标识符,因此在我下面的配置中使用 1。另外,请注意,如果你想过滤掉 "marvel" 个,那么你需要 acceptOnMatch: false.

filter:
  1:
    type: org.apache.log4j.varia.StringMatchFilter
    StringToMatch: "marvel"
    AcceptOnMatch: false

我刚刚意识到您登录到 index_search_slow_log_file 的级别可以特定于索引。

所以我实际上不需要过滤掉 marvel 日志,我可以将默认设置为不登录 elasticsearch.yml(即不要更改它),启用登录到 index_search_slow_log_file然后通过索引设置 API.

放置一个特定于索引的覆盖

elasticsearch.yml:无变化

logging.yml:

additivity:
  index.search.slowlog: true
  ...

索引设置API:

PUT /index_name/_settings
{
  "index": {
    "search": {
      "slowlog": {
        "threshold": {
          "fetch": {
            "trace": "0ms",
            "info": "500ms",
            "warn": "1s"
          }
        }
      }
    }
  }
}

要添加到andrei-stefan's答案,您还可以将匹配意义反转为AcceptOnMatch: true,但这需要在后面添加一个明确的DenyAllFilter。完整示例如下所示:

filter:
  1:
    type: org.apache.log4j.varia.StringMatchFilter
    StringToMatch: "my-important-index"
    AcceptOnMatch: true
  2:
    type: org.apache.log4j.varia.DenyAllFilter