使用 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,所有输出(容器化应用程序写入 stdout
和 stderr
)默认重定向到 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。因此,我猜一切都进入了某个缓冲区,但没有到达控制台。
我在 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,所有输出(容器化应用程序写入 stdout
和 stderr
)默认重定向到 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。因此,我猜一切都进入了某个缓冲区,但没有到达控制台。