springboot在docker中无法输出日志到Logstash

1、背景

在搭建了基于docker的ELK日志系统后,使用springboot(其实和什么开发的无关)开发web app,作为container运行在docker容器里,写入Logstash失败,但是本机运行调试的日志都可以写入。
因为docker的日志似乎必须使用 docker logs指令来查看,记录到container目录下,也不知道为什么就是写入不了Logstash。

=======2021.03.11更新=======
偷懒的办法是直接把ip改为外网IP即可,费点云服务器流量
实际以下介绍的方法,日志格式有很大缺陷,不建议采用

2、解决办法

2.1、以前的错误配置

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="org.springframework.web" level="INFO"/>

    <!-- 开发、测试环境 -->
    <springProfile name="dev,test">
        <appender name="LOGSTASH_dev" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>1.1.1.99:5000</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
                <customFields>{"app_name":"app"}</customFields>
            </encoder>
        </appender>

        <logger name="com.app" level="INFO">
          <appender-ref ref="LOGSTASH_dev"/>
        </logger>
    </springProfile>

    <!-- 生产环境 -->
    <springProfile name="prod">
        <appender name="LOGSTASH_prod" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>127.0.0.1:5000</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
                <customFields>{"app_name":"app"}</customFields>
            </encoder>
        </appender>

        <logger name="org.springframework.web" level="ERROR"/>
        <logger name="com.yuren.yoga.app" level="WARN">
          <appender-ref ref="LOGSTASH_prod"/>
        </logger>
    </springProfile>

</configuration>

启动web app
docker run --name api -d --net host my/api

2.1、正确配置

相当于直接输出日志到控制台,然后让docker输出到logstash。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <springProfile name="dev,test">
        <logger name="org.springframework.web" level="INFO"/>
        <logger name="com.app" level="INFO"/>
    </springProfile>

    <springProfile name="prod">
        <root level="WARN"/>
        <logger name="org.springframework.web" level="ERROR"/>
        <logger name="com.app" level="WARN"/>
    </springProfile>

</configuration>

启动时,加上几个参数就可以输出日志了
docker run --name api -d --net host --log-driver=syslog --log-opt syslog-address=tcp://127.0.0.1:5000 my/api

推荐阅读更多精彩内容