【问题标题】:Logs sent to console using logback configuration in java app, not visible in Kubernetes using kubectl logs使用 java 应用程序中的 logback 配置发送到控制台的日志,在使用 kubectl 日志的 Kubernetes 中不可见
【发布时间】:2018-10-20 04:23:20
【问题描述】:

我在 kubernetes 文档中读到 kubernetes 从 pod 中的 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 &lt;POD_NAME&gt;查看它们

我的记录器应用的 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

【问题讨论】:

  • 如果我从后端登录容器并启动我的 java 应用程序这是什么意思?
  • 只是为了测试,能不能把AsyncAppender去掉,直接登录STDOUT?这有什么不同吗?
  • @MatthewLDaniel 记录到容器,我的意思是以交互方式附加到 pod kubectl exec -it &lt;pod&gt; -- /bin/sh,然后从 shell 运行命令“java -jar logger-splunk-1.0-SNAPSHOT.jar”
  • @ewramner 首先我只尝试了 STDOUT,后来我应用了 asyncAppender,但两者都不起作用
  • Ashu,只是想让您知道还有一些其他选项可以让您从 Splunk 中的应用程序获取日志并将它们保存在本地节点上,以便能够使用 kubectl logs 命令.您可以尝试我们的解决方案 outcoldsolutions.com,它将应用程序日志、指标、主机日志等转发到 Splunk,并提供用于探索这些数据的仪表板。

标签: kubernetes logback kubectl kubelet


【解决方案1】:

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

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

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

counter-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 - “计数器”容器内的容器名称

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

$ kubectl logs counter

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

$ kubectl logs --previous

如果 pod 中有多个容器,则应添加容器名称,如下所示:

$ kubectl logs counter -c count

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

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

【讨论】:

    【解决方案2】:

    好的,所以这终于解决了。问题在于未刷新日志。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2020-10-26
      相关资源
      最近更新 更多