【问题标题】:Logback and Graylog cannot communicate on a Mac using syslogLogback 和 Graylog 无法在 Mac 上使用 syslog 进行通信
【发布时间】:2020-10-12 11:39:44
【问题描述】:

我想将日志消息从 Java 应用程序发送到 Graylog,在 logback 之上使用 slf4j,一侧使用 logback GELF-appender,另一侧使用 Graylog GELF-input。为了测试它,我在 Docker 容器中运行 Graylog(使用 Docker for Mac)并在本地运行我的 Java 应用程序。我的故事的要点是 Graylog GELF 输入没有从 Java 应用程序接收任何内容。不知何故,Java 应用程序和 Graylog 似乎无法通信。当我切换到不同的附加程序/输入组合(基于系统日志记录的组合)时,这同样适用。但是,当将消息从命令行回显到不同的 Graylog 输入时,即侦听端口 5555 的 RAW 输入,该消息可以正常接收。

知道问题是什么吗? 这是我使用 GELF 的设置:

Java 应用程序:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogDemo {

    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(LogDemo.class);
        logger.error("Hello World 2");
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>logdemo</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>de.appelgriepsch.logback</groupId>
      <artifactId>logback-gelf-appender</artifactId>
      <version>1.5</version>
    </dependency>
  </dependencies>
</project>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="GELF" class="de.appelgriepsch.logback.GelfAppender">
    <server>localhost</server>
    <port>12201</port>
    <protocol>TCP</protocol>
  </appender>

  <root level="error">
    <appender-ref ref="GELF"/>
  </root>
</configuration>

Graylog docker 启动:

$ docker run --name mongo -d mongo:3
$ docker run --name elasticsearch \
    -e "http.host=0.0.0.0" \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -d docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10
$ docker run --link mongo --link elasticsearch \
    -p 9000:9000 -p 12201:12201 -p 1514:1514 -p 5555:5555 \
    -e GRAYLOG_HTTP_EXTERNAL_URI="http://127.0.0.1:9000/" \
    -d graylog/graylog:3.3

Graylog GELF tcp 输入(运行中):

bind_address: 0.0.0.0
decompress_size_limit: 8388608
max_message_size: 2097152
number_worker_threads: 4
override_source: <empty>
port: 12201
recv_buffer_size: 1048576
tcp_keepalive: false
tls_cert_file: <empty>
tls_client_auth: disabled
tls_client_auth_cert_file: <empty>
tls_enable: false
tls_key_file: <empty>
tls_key_password:********
use_null_delimiter: true

如上所述,当我运行 java 应用程序并且 Graylog 在后台作为 Docker 容器运行时,Graylog 没有收到我发送的日志消息。但是,当我在命令行上键入以下内容(在 Mac 上使用终端)时,Graylog RAW 输入会收到消息:

$ echo "Testmessage" | nc localhost 5555

有人知道我做错了什么吗?

【问题讨论】:

  • 可能 logback 配置的 localhost:12201 在您的 java/client 容器中无效?
  • 在 IDE 中运行 java 应用时会发生什么?
  • 当我从 IntelliJ 按原样运行 java 应用程序时,日志(和 Graylog)中没有显示任何测试消息。当我将控制台附加程序添加到根记录器时,只是为了验证 SOMETHING 是否已发送,测试消息在控制台中可见,但在 Graylog 中仍然不可见。
  • 感谢您的帮助赫里!非常感激!关于您的第一个问题:我不是从容器中运行 java 应用程序,而是在本地,立即从我的 IDE (IntelliJ) 运行。

标签: java logback slf4j graylog gelf


【解决方案1】:

我找到了解决方案,但我不确定问题的确切原因是什么。解决方案是使用不同的 Gelf appender。而不是我上面提到的那个,我现在使用以下一个:

<dependency>
  <groupId>de.siegmar</groupId>
  <artifactId>logback-gelf</artifactId>
  <version>2.2.0</version>
</dependency>

成功了,但正如我所说,我不确定为什么我之前使用的那个不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多