Log4j 直接将日志记录到 Elasticsearch 服务器

9
我有些困惑如何直接将我的日志条目放入elasticsearch(不是logstash)。到目前为止,我找到了一些附加程序(log4j.appender.SocketAppenderlog4j.appender.server等),它们允许将日志发送到远程主机,还有ConversionPattern选项似乎可以将日志转换为“elastic-friendly”的格式,但这种方法看起来很奇怪...或者我搞错了吗?这是将日志发送到elastic 的唯一方式吗?
到目前为止,我有以下配置:
log4j.rootLogger=DEBUG, server
log4j.appender.server=org.apache.log4j.net.SocketAppender
log4j.appender.server.Port=9200
log4j.appender.server.RemoteHost=localhost
log4j.appender.server.ReconnectionDelay=10000
log4j.appender.server.layout.ConversionPattern={"debug_level":"%p","debug_timestamp":"%d{ISO8601}","debug_thread":"%t","debug_file":"%F", "debug_line":"%L","debug_message":"%m"}%n

但是我遇到了一个错误:
log4j:WARN Detected problem with connection: java.net.SocketException: Broken pipe (Write failed)

我找不到任何有用的例子,所以我不明白我做错了什么以及如何修复它。谢谢。

2
那是不可能的。你需要Logstash来处理。如果你想使用已被弃用的log4j插件(https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html),那也可以,但我们建议将log4j日志写入文件并使用Filebeat捕获并发送到Elasticsearch。 - Andrei Stefan
2
请查看此问题:https://dev59.com/5VwY5IYBdhLWcg3ws5oF - diginoise
如果你将logstash指向这个文件,那么这意味着我会将日志写入一个文件,而这不是我所需要的。 - Frankie Drake
4个回答

5

如果您想使用,我已经在这里编写了Log4J2 Elastic REST Appender。它具有基于时间和/或事件数量缓冲日志事件的能力,然后再将其发送到Elastic(使用_bulk API,以便一次性发送所有内容)。

它已发布到Maven Central,所以非常简单易用。


但它还没有发布吗? - Thomas Decaux
我在Maven中央库找不到它。你能分享一个链接吗? - Kira Resari

4

谢谢,graylog 对我来说绝对令人满意。 - Frankie Drake
但是那个有一个漏洞(请参见 https://mvnrepository.com/artifact/org.appenders.log4j/log4j2-elasticsearch-core/1.5.5)... 这个问题会在未来得到修复吗? - Kira Resari
@KiraResari,(易于替换的)依赖项存在漏洞,而非库本身。已在1.5.6中修复。 - rfoltyns

1
我找到了最符合我需求的解决方案。它是一个graylog。 由于它是基于elasticsearch构建的,所以使用起来很熟悉,我能够立即切换到它。
为了使用它,我添加了这个依赖项以及基本的log4j2依赖项:
<dependency>
    <groupId>org.graylog2.log4j2</groupId>
    <artifactId>log4j2-gelf</artifactId>
    <version>1.3.2</version>
</dependency>

使用 log4j2.json 配置:
{
  "configuration": {
    "status": "info",
    "name": "LOGGER",
    "packages": "org.graylog2.log4j2",
    "appenders": {
      "GELF": {
        "name": "GELF",
        "server": "log.myapp.com",
        "port": "12201",
        "hostName": "my-awsome-app",
        "JSONLayout": {
          "compact": "false",
          "locationInfo": "true",
          "complete": "true",
          "eventEol": "true",
          "properties": "true",
          "propertiesAsList": "true"
        },
        "ThresholdFilter": {
          "level": "info"
        }
      }
    },
    "loggers": {
      "logger": [
        {
          "name": "io.netty",
          "level": "info",
          "additivity": "false",
          "AppenderRef": {
            "ref": "GELF"
          }
        }        
      ],
      "root": {
        "level": "info",
        "AppenderRef": [
          {
            "ref": "GELF"
          }
        ]
      }
    }
  }
}

0

你可以使用HttpAppender通过HTTP发送日志,可参考Log4j Appenders


我相信正在考虑使用elasticsearch存储应用程序日志并将log4j与之集成的人都知道http日志记录这样的事情。这不是回答问题的恰当方式。 最糟糕的回答方式是像这样:
  • 如何安装这个东西?
  • 不要安装它,或者明天再试着安装它。
- user11814208

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接