JavaアプリケーションからGraylogにログメッセージを送信したい.logbackの上にslf4jを使用し、一方にlogback GELF-appenderを、もう一方にGraylog GELF-inputを使用します。それをテストするために、Docker コンテナーで (Docker for Mac を使用して) Graylog を実行し、Java アプリケーションをローカルで実行しています。私の話の要点は、Graylog GELF 入力が Java アプリケーションから何も受信しないということです。どういうわけか、Java アプリケーションと Graylog が通信できないようです。別のアペンダー/入力の組み合わせ (syslog レコードに基づくもの) に切り替えた場合も同様です。ただし、コマンドラインから別のグレイログ入力、つまりポート 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>
グレイログ ドッカーの起動:
$ 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
誰かが私が間違っていることを理解していますか?