使用 java 应用程序中的 logback 配置发送到控制台的日志,使用 kubectl 日志在 Kubernetes 中不可见

Logs sent to console using logback configuration in java app, not visible in Kubernetes using kubectl logs

我在 kubernetes 文档的某个地方读到 kubernetes 从 pods 中的 stdout 和 stderror 读取应用程序日志。 我创建了一个新应用程序并将其配置为将日志发送到远程 splunk hec 端点(使用 splunk-logback jars),同时发送到控制台。 所以默认情况下,logback 中的控制台日志应该转到 System.out,然后使用 kubectl logs 应该可以看到它。 但是我的应用程序中没有发生这种情况。

我的日志文件:

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

<configuration>

    <Appender name="SPLUNK" class="com.splunk.logging.HttpEventCollectorLogbackAppender">
        <url>${splunk_hec_url}</url>
        <token>${splunk_hec_token}</token>
        <index>${splunk_app_token}</index>
        <disableCertificateValidation>true</disableCertificateValidation>
        <batch_size_bytes>1000000</batch_size_bytes>
        <batch_size_count>${batch_size_count}</batch_size_count>
        <send_mode>sequential</send_mode>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%msg</pattern>
        </layout>
    </Appender>

    <Appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%msg</pattern>
        </encoder>
    </Appender>

    <Appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="STDOUT" />
    </Appender>

    <root level="INFO">
        <appender-ref ref="SPLUNK"/>
        <appender-ref ref="ASYNC"/>
    </root>

</configuration>

我可以在 splunk 中看到日志,如果我从后端登录到容器并启动我的 java 应用程序,那么那时我也可以在终端上看到日志。但是,如果我让容器默认自行启动,那么日志只会变成 splunk,我无法使用 kubectl logs <POD_NAME>

查看它们

我的记录器应用程序的 kubernetes yml 文件:

apiVersion: v1
kind: Pod
metadata:
    name: logging-pod
    labels:
       app: logging-pod
spec:
  containers:
     - name: logging-container
       image: logger-splunk:latest
       command: ["java", "-jar", "logger-splunk-1.0-SNAPSHOT.jar"]
       resources:
          requests:
             cpu: 1
             memory: 1Gi
          limits:
             cpu: 1
             memory: 1Gi

根据 Kubenetes documentation,所有输出(容器化应用程序写入 stdoutstderr)默认重定向到 JSON 文件。您可以使用 kubectl logs 访问它。

让我们通过创建一个在 stdout 中输出数字的简单 pod 来测试此功能:

kubectl create -f https://k8s.io/docs/tasks/debug-application-cluster/counter-pod.yaml

反-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']

其中:
counter - 广告连播的名称
count - "counter" pod

中容器的名称

您可以通过运行访问该文件的内容:

$ kubectl logs counter

您可以通过以下命令访问 pod 中先前崩溃的容器的日志文件:

$ kubectl logs --previous

如果pod中有多个容器,则应按如下方式添加容器名称:

$ kubectl logs counter -c count

当 pod 从集群中删除时,它的所有日志(当前和以前的)也将被删除。

确保您在应用程序中正确配置了 stdout,并且您的应用程序中到 stdout 的输出不会因任何原因被静默跳过。

好的,所以这个问题终于解决了。问题是日志没有被刷新。

PatternLayout 中缺少 %n。因此,我猜一切都进入了某个缓冲区,但没有到达控制台。