Как заставить fluent-logger-java работать с приложением logback в springboot
Я пытаюсь интегрировать Fluent-Logger-Java с проектом Springboot с приложением logback. И я могу отправить данные в агрегатор Fluentd с примером кода, приведенным в https://github.com/fluent/fluent-logger-java
Но при добавлении в качестве приложения обратного входа создается исключение NullPointerException. Я пытался использовать logback-more-appenders с https://mvnrepository.com/artifact/com.sndyuk/logback-more-appenders/1.4.3. Но это не отправка каких-либо данных из приложения.
Чтобы воспроизвести проблему, создайте простой веб-проект из https://start.spring.io/ со значениями по умолчанию.
Добавьте в проект файл src\main\java\com\example\demo\FluentLogbackAppender.java
package com.example.demo;
import java.util.HashMap;
import java.util.Map;
import org.fluentd.logger.FluentLogger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
public class FluentLogbackAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
private FluentLogger fluentLogger;
private String label = "test";
@Override
public void start() {
super.start();
this.fluentLogger = FluentLogger.getLogger(label, "localhost", 24224);
Map<String, Object> data = new HashMap<String, Object>();
data.put("msg", "Starting App");
fluentLogger.log(label, data);
}
@Override
protected void append(ILoggingEvent rawData) {
String msg = rawData.toString();
Map<String, Object> data = new HashMap<String, Object>(1);
data.put("msg", msg);
fluentLogger.log(label, data);
}
@Override
public void stop() {
super.stop();
fluentLogger.close();
}
}
Добавьте src\main\resources\logback.xml в проект
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE logback>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<appender name="fluent" class="com.example.demo.FluentLogbackAppender"/>
<root level="info" additivity="false">
<appender-ref ref="fluent" />
</root>
</configuration>
Добавление зависимости в pom.xml
<dependency>
<groupId>org.fluentd</groupId>
<artifactId>fluent-logger</artifactId>
<version>0.3.3</version>
</dependency>
Я удалил некоторый код, чтобы сделать его простым. Когда я запускаю это, мне
2018-05-22 14:39:42.190 ERROR 18788 --- [ main] o.s.boot.SpringApplication : Application run failed
java.lang.IllegalStateException: Logback configuration error detected:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@5:77 - RuntimeException in Action for tag [appender] java.lang.NullPointerException
at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:166)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.reinitialize(LogbackLoggingSystem.java:212)
at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:75)
at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:114)
at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:264)
at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:237)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:200)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:173)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:358)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:317)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
at com.example.demo.DemoApplication.main(DemoApplication.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
NullPointerException возвращается из sender.emit() внутри класса FluentLogger. Интересно то, что этот код на самом деле отправляет данные в агрегатор fluentd непосредственно перед сбоем. Есть ли способ заставить эту работу.
1 ответ
Я думаю, вы не вставили полный код здесь. Я думаю, что ваш класс может иметь геттер, сеттер для поля тега. Если так, то ваша конфигурация входа в систему отсутствует <tag>test</tag>
что может быть причиной (до сих пор думаю). FluentLogger имеет много открытых проблем, и они рекомендуют использовать клиентскую библиотеку беглого языка для сброса данных во флэент.
Некоторые ссылки - https://github.com/fluent/fluent-logger-java/issues/72