如何将手动执行进程的日志输出到Kubernetes Pod日志中?
解决Kubernetes Pod内手动执行spark-submit日志无法被Fluentd采集的问题
把日志重定向到容器主进程的标准流
Fluentd默认采集Pod容器的stdout和stderr,手动执行spark-submit时,直接将日志输出到这两个流就能被捕获。执行命令时加上重定向参数:spark-submit [你的提交参数] 1>/proc/1/fd/1 2>/proc/1/fd/2
其中/proc/1/fd/1是容器主进程的标准输出,/proc/1/fd/2是标准错误,这样手动执行的日志会混入主进程的输出流,被Fluentd正常采集。修改Spark日志配置输出到标准流
可以调整Spark的日志配置文件(log4j.properties或logback.xml),强制将日志输出到stdout。比如在log4j.properties中设置:log4j.rootLogger=INFO, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n之后执行spark-submit时,日志会直接输出到容器的标准输出,自然被Fluentd采集。
用Sidecar容器单独采集日志
如果需要隔离手动进程的日志,可以给Pod添加一个Sidecar容器,共享一个emptyDir存储卷。手动执行spark-submit时将日志写入该卷的文件,Sidecar容器用tail -f命令把文件内容输出到自己的stdout,这样Fluentd就能捕获到。
示例Pod配置片段:volumes: - name: shared-logs emptyDir: {} containers: - name: main-app volumeMounts: - name: shared-logs mountPath: /shared-logs - name: log-forwarder image: busybox:latest command: ["sh", "-c", "tail -f /shared-logs/spark-test.log"] volumeMounts: - name: shared-logs mountPath: /shared-logs执行spark-submit时指定日志输出路径为
/shared-logs/spark-test.log即可。
内容的提问来源于stack exchange,提问作者adesai
相关产品推荐
相关产品推荐

