Logback и Graylog не могут обмениваться данными на Mac с помощью системного журнала

Я хочу отправлять сообщения журнала из приложения Java в Graylog, используя slf4j поверх журнала с GELF-приложением журнала с одной стороны и GELF-вводом Graylog с другой. Чтобы проверить это, я запускаю Graylog в контейнере Docker (используя Docker для Mac) и локально запускаю свое Java-приложение. Суть моей истории в том, что GELF-ввод Graylog ничего не получает от Java-приложения. Почему-то приложение Java и Graylog не могут взаимодействовать. То же самое относится, когда я переключаюсь на другую комбинацию добавления/ввода (на основе записей системного журнала). Однако при отображении сообщения из командной строки на другой ввод Graylog, а именно на ввод RAW, прослушивающий порт 5555, это сообщение принимается нормально.

Есть идеи, в чем проблема? Это моя установка с использованием 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");
    }
}

пом.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 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

Ввод tcp Graylog GELF (работает):

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

Кто-нибудь понял, что я делаю неправильно?


person HaBa    schedule 12.10.2020    source источник
comment
Вероятно, локальный хост: 12201 конфигурации журнала недействителен для вашего контейнера java/client?   -  person Heri    schedule 12.10.2020
comment
Что происходит, когда вы запускаете приложение Java в своей среде IDE?   -  person Heri    schedule 12.10.2020
comment
Когда я запускаю java-приложение как есть из IntelliJ, в журнале (и Graylog) не появляется тестовое сообщение. Когда я добавляю приложение консоли к корневому регистратору, просто чтобы убедиться, что ЧТО-ТО отправлено, тестовое сообщение отображается в консоли, но все еще не отображается в Graylog.   -  person HaBa    schedule 12.10.2020
comment
Спасибо за помощь, Хери! Очень признателен! Что касается вашего первого вопроса: я запускаю java-приложение не из контейнера, а локально, сразу из моей IDE (IntelliJ).   -  person HaBa    schedule 12.10.2020


Ответы (1)


Я нашел решение, хотя я не уверен, в чем была точная причина проблемы. Решение заключалось в использовании другого приложения Гельфа. Вместо того, что я упомянул выше, я сейчас использую следующий:

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

Это сработало, но, как я уже сказал, я не уверен, почему тот, который я использовал ранее, не работал.

person HaBa    schedule 12.10.2020