如何在springboot中使用logback appender进行fluent-logger-java工作

时间:2018-05-22 09:39:36

标签: java spring-boot logback fluentd

我正在尝试将fluent-logger-java与带有logback appender的springboot项目集成。我可以使用https://github.com/fluent/fluent-logger-java

中给出的示例代码将数据发送到流畅的聚合器

但是当作为logback appender添加时,它会抛出NullPointerException。 我曾尝试使用https://mvnrepository.com/artifact/com.sndyuk/logback-more-appenders/1.4.3中的logback-more-appenders。 但它不是从应用程序发送任何数据。

要重现此问题,请使用默认值从https://start.spring.io/生成一个简单的Web项目。

将src \ main \ java \ com \ example \ demo \ FluentLogbackAppender.java添加到项目中

private void DeleteButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             

    String sql1=("Delete From Mory.Boats Where DATE_OF_TRIP='?' and BOAT_NAME='?'"); 

    try {
                myconobj=DriverManager.getConnection("jdbc:derby://localhost:1527/New_Idea","Mory","Mory");
                PreparedStatement ps = myconobj.prepareStatement(sql1);
                ps.setString(1,Date_of_TripDateChooser.getDateFormatString());
                ps.setString(2,Boat_NameTextField.getText());

                mystmobj=myconobj.createStatement();
                mystmobj.toString();
                mystmobj.execute(sql1);

                ((DefaultTableModel)Boats1.getModel()).removeRow(Boats1.getSelectedRow());
                ps.execute();

                JOptionPane.showMessageDialog(null, "Deleted");    

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex);
        }              
}                                            

}

将src \ main \ resources \ logback.xml添加到项目

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();
    }
}

在pom.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>

我删除了一些代码以简化它。 运行时,我会看到

<dependency>
    <groupId>org.fluentd</groupId>
    <artifactId>fluent-logger</artifactId>
    <version>0.3.3</version>
</dependency>

从FluentLogger类中的sender.emit()返回NullPointerException。 有趣的是,这段代码实际上在崩溃之前将数据推送到流畅的聚合器。 有没有办法让这项工作。

1 个答案:

答案 0 :(得分:2)

我猜,您没有在此处粘贴完整的代码。我认为您的班级可能在标签字段上使用了吸气剂,吸气剂。如果是这样,则您的登录配置丢失了<tag>test</tag>,这可能是原因(仍要猜测)。 FluentLogger存在许多未解决的问题,建议使用fluency客户端库来刷新要流利的数据。

一些参考- https://github.com/fluent/fluent-logger-java/issues/72

https://github.com/sndyuk/logback-more-appenders/blob/master/src/main/java/ch/qos/logback/more/appenders/FluencyLogbackAppender.java

https://github.com/komamitsu/fluency