将spring boot日志直接发送到logstash,没有文件

Pha*_*ate 12 log4j logstash spring-boot elk

所以,我正在使用 kubernetes 和 spring boot 构建一个完整的云解决方案。

我的 spring boot 应用程序部署到一个容器并直接在控制台上登录。由于容器是短暂的,我也想将日志发送到远程日志存储服务器,以便它们可以被处理并发送到弹性。

通常我会在托管我的应用程序的服务器上安装一个 filebeat,我可以,但是没有任何内置方法可以让我避免在发送之前将日志写入文件吗?

目前我正在使用 log4j,但我认为切换到另一个记录器没有问题,只要它有一个“logbackappender”。

Mar*_*ine 13

您可以尝试logback.xmlresources文件夹中添加:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>

<configuration scan="true">
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <param name="Encoding" value="UTF-8"/>
        <remoteHost>localhost</remoteHost>
        <port>5000</port>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"app_name":"YourApp", "app_port": "YourPort"}</customFields>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="logstash"/>
    </root>

</configuration>
Run Code Online (Sandbox Code Playgroud)

然后添加logstash encoder依赖:

pom.xml

 <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>4.11</version>
 </dependency>
Run Code Online (Sandbox Code Playgroud)

日志文件

input {
    udp {
        port => "5000"
        type => syslog
        codec => json
    }
    tcp {
        port => "5000"
        type => syslog
        codec => json_lines
    }
    http {
        port => "5001"
        codec => "json"
    }
}

filter {
    if [type] == "syslog" {
        mutate {
            add_field => { "instance_name" => "%{app_name}-%{host}:%{app_port}" }
        }
    }
}

output {
    elasticsearch {
        hosts => ["${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}"]
        index => "logs-%{+YYYY.MM.dd}"
    }
}
Run Code Online (Sandbox Code Playgroud)


Gav*_*avi 6

我刚刚在我的存储库中创建了一个完整的工作示例 希望对某人有帮助