当前位置: 首页 > 知识库问答 >
问题:

helm3安装了logstash配置好了logback,但是日志记录一直不对,如何解决?

司徒翼
2023-09-27

logstash配置:

global:  storageClass: alibabacloud-cnfs-nasservice:  type: NodePort  ports:    - name: http      port: 8080      targetPort: http      protocol: TCP    - name: syslog-udp      port: 1514      targetPort: syslog-udp      protocol: UDP    - name: syslog-tcp      port: 1514      targetPort: syslog-tcp      protocol: TCPpersistence:  # 云盘  #  storageClass: "alicloud-disk-ssd"  #  size: 20Gi  # NAS  storageClass: alibabacloud-cnfs-nas  size: 2Giinput: |-  udp {    port => 1514    codec => json_lines  }  tcp {    port => 1514    codec => json_lines  }  http { port => 8080 }filter: |-  json {    source => "message"    target => "json"  }output: |-  if [env] != "" {    elasticsearch {      hosts => ["xxx.xxx.xxx.xxx:xxxx"]      index => "logs33--success-%{+YYYY.MM.dd}"    }  } else {    elasticsearch {      hosts => ["xxx.xxx.xxx.xxx:xxxx"]      index => "logs-failure-%{+YYYY.MM.dd}"    }  }  stdout { codec => rubydebug }

logback配置

<?xml version="1.0" encoding="UTF-8"?><configuration debug="false">        <springProfile name="dev">        <!--异步发送日志-->        <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">            <appender-ref ref="LOGSTASH"/>        </appender>        <!-- 日志输出级别 -->        <root level="INFO">            <!-- 添加logstash日志输出 -->            <appender-ref ref="LOGSTASH"/>        </root>        <!-- logstash 设置 -->        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">            <!--            <param name="Encoding" value="UTF-8"/>-->            <!-- logstash 服务器 -->            <destination>xxx.xxx.xxx.xxx:xxx</destination>            <!-- encoder is required -->            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">                <!--                // 索引名-->                <customFields>{"env":"dev"}</customFields>                <providers>                    <timestamp>                        <timeZone>UTC</timeZone>                    </timestamp>                    <pattern>                        {                        "serviceName": "${name}",                        "level": "%level",                        "message": "%message",                        "env": "test",                        "stack_trace": "%exception{5}",                        "pid": "${PID:-}",                        "thread": "%thread",                        "class": "%logger{40}"                        }                    </pattern>                </providers>            </encoder>            <!-- 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝,OFF>ERROR>WARN>INFO>DEBUG>TRACE>ALL -->            <!--        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->            <!--            <level>INFO</level>-->            <!--        </filter>-->        </appender>        <!-- 定义日志输出级别、格式等配置 -->    </springProfile></configuration>

logstash打印的日志:

[2023-09-22T02:26:50,029][INFO ][logstash.codecs.json     ][main][f3916e23ca79e9308acd3be143501936b256d568e41e841a6fd83f731839d2c0] ECS compatibility is enabled but `target` option was not specified. This may cause fields to be set at the top-level of the event where they are likely to clash with the Elastic Common Schema. It is recommended to set the `target` option to avoid potential schema conflicts (if your data is ECS compliant or non-conflicting, feel free to ignore this message){         "event" => {        "original" => ""    },          "json" => nil,       "message" => "",          "host" => {        "ip" => "10.0.125.0"    },           "url" => {        "path" => "/bad-request"    },          "http" => {        "version" => "HTTP/1.0",         "method" => "GET"    },    "@timestamp" => 2023-09-22T02:26:50.030993835Z,      "@version" => "1"}

从打印的日志看,输出的格式明显有问题。

共有1个答案

商德泽
2023-09-27

自己解决了,使用下面的logstash配置就ok了

global:  storageClass: alibabacloud-cnfs-nasservice:  type: NodePort  ports:    - name: http      port: 8080      targetPort: http      protocol: TCP    - name: syslog-udp      port: 1514      targetPort: syslog-udp      protocol: UDP    - name: syslog-tcp      port: 1514      targetPort: syslog-tcp      protocol: TCPpersistence:  enabled: true  # NAS  storageClass: alibabacloud-cnfs-nas  size: 2GicontainerPorts:  - name: http    containerPort: 8080    protocol: TCP  - name: monitoring    containerPort: 9600    protocol: TCP  - name: syslog-udp    containerPort: 1514    protocol: UDP  - name: syslog-tcp    containerPort: 1514    protocol: TCPinput: |-  udp {   port => 1514   type => syslog   codec => json_lines  }  tcp {   port => 1514   type => syslog   codec => json_lines  }  http { port => 8080 }output: |-    if [active] != "" {    elasticsearch {      hosts => ["xxx.xxx.xxx.xxx:xxxx"]      index => "%{active}-logs-%{+YYYY.MM.dd}"    }  } else {    elasticsearch {      hosts => ["xxx.xxx.xxx.xxx:xxxx"]      index => "ignore-logs-%{+YYYY.MM.dd}"    }  }  stdout { }

我讲下我的解决过程:
1、刚开始以为是logstash的问题,但是发现使用curl测试发送消息是ok的

➜  ~ kubectl port-forward service/logstash 8080:8080 -nlogstash➜  ~ curl -X POST -d '{"message": "Hello World","env": "dev"}' http://localhost:8080

2、既然logstash没问题我就看看是不是logback有问题,发现不管怎么配置都不行

3、我就打算换个思路既然curl发送日志可以logback不行,我就想抓包试试logback发送的日志请求报文,于是我查看logback配置的时候我发现使用的是net.logstash.logback.appender.LogstashTcpSocketAppender类,再加上我使用的是curl的http请求,我于是推导出可能我的logstash的tcp端口可能不对,于是又回到logstash配置上面

4、最后修改logstash配置让tcp端口ping通才真正解决问题,所以问题就是tcp端口不通导致的,使用下面命令测试

telnet xxx.xxx.xxx.xxx xxxx

5、总结一下就是对logstash不太熟悉导致的,不知道logback是通过tcp发送的请求到logstash,自己还一直处在curl没有问题的状态中,好在最后发现了问题所在。

 类似资料:
  • 问题内容: 如何配置OpenEJB日志记录格式?这就是我现在在日志中看到的内容: 我想禁用消息,并更改其他消息的格式。中的更改无效。 问题答案: 这是我为使事情正常运行所做的工作: 现在工作正常。这是我的: 这是: 现在,由于大卫的支持,我可以在测试期间微调OpenEJB的日志记录:)

  • 我有以下情况:一个使用日志的Spring启动应用程序,以及已经在应用程序中配置的几个日志记录属性 我想添加其他只能通过文件可用的配置选项,但是一旦我将此文件添加到类路径(无论它被命名为还是),它就会覆盖中的所有内容,并且所有日志记录级别/模式以及那里定义的其他选项都不再有效 - 似乎在添加的所有选项 被忽略,我需要在xml文件中重新添加它们而不是yml。 我的问题是:是否可以合并这两个配置?我的意

  • 我的springboot项目中想要异步打印日志到文件,对 logback 做了如下配置 java的controller中使用下面代码打印日志 在日志文件中打印出线程名称,同时在IDEA控制台中也打印线程名称,照理说如果是异步写入的日志这两处的线程名称应该不一样,结果日志文件中输出的结果是 控制台中输出的是 线程ID和名称分别是:86 / http-nio-7076-exec-2 两处的线程名称一样

  • 我正在使用NetworkExtension框架在iOS上使用VPN。我可以安装配置并建立连接。我的问题是,是否有一种方法可以检测VPN配置是否仍在安装,或者检测用户是否已卸载该配置? 我不一定要在后台寻找通知或任何东西,但我要寻找的是当应用程序被带到前台时我所做的一些方法/变通方法? 我正在使用由中间CA颁发的证书进行证书身份验证,并尝试了以下“评估信任”方法:检查iOS上是否安装了配置文件 这对

  • 问题内容: 我正在迁移一个曾经使用log4j进行logback / slf4j的应用程序,并且已经出现问题约2周了……我做了一个小项目来测试logback / slf4j,它的工作效果很好,但是由于某种原因,在应用它时到实际的应用程序,它只是不想工作。 我正在使用JBoss 6.2,将EAR部署到standalone / deployments目录并启动服务器(除了我得到这个异常的事实,这一切都很

  • 但是,在日志配置的xml文件中,冒号后面总是有一个破折号。这是为什么?例如: ” 2.不断变化的财产名称 特别是,此属性在application.properties(或.yml)中没有等价属性来配置它 ${log_file_total_size_cap:-0} 如果要将该属性更改为其他值,则必须设置LOG_FILE_TOTAL_SIZE_CAP属性。我如何在仍然使用spring Boot提供的原