如何在 lagom 应用程序中将日志写入文件
How to write logs to a file in a lagom application
作为将我的 lagom 应用程序部署到 kubernetes 生产环境的一部分,除了写入标准输出之外,我还试图将所有日志发布到一个文件中。为此,我根据建议 here.
在资源目录下创建了一个 logback.xml
添加文件附加程序
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${application.home:-.}/logs/application.log</file>
<encoder>
<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern>
</encoder>
</appender>
但是无法在容器工作目录中创建日志文件。我收到以下错误:
09:23:33,209 |-INFO in ch.qos.logback.classic.AsyncAppender[ASYNCSTDOUT] - Setting discardingThreshold to 51
09:23:33,209 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
09:23:33,213 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
09:23:33,217 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
09:23:33,220 |-INFO in ch.qos.logback.core.FileAppender[FILE] - File property is set to [./logs/application.log]
09:23:33,222 |-ERROR in ch.qos.logback.core.FileAppender[FILE] - Failed to create parent directories for [/opt/docker/./logs/application.log]
09:23:33,222 |-ERROR in ch.qos.logback.core.FileAppender[FILE] - openFile(./logs/application.log,true) call failed. java.io.FileNotFoundException: ./logs/application.log (No such file or directory)
at java.io.FileNotFoundException: ./logs/application.log (No such file or directory)
at at java.io.FileOutputStream.open0(Native Method)
我不太清楚为什么在容器工作目录下创建日志目录和日志文件失败。
demiourgos728@ca5fc4a4c1db:/opt/docker$ ls
bin lib share
我试过如下所示提供对容器工作目录的读、写、执行权限,但这也不起作用:
DockerChmodType.UserGroupWriteExecute
求推荐。
- Docker 基本图像配置:
dockerBaseImage := "adoptopenjdk/openjdk8"
。
- 整个日志文件 here.
- K8S definitions
写入容器中的文件很糟糕,原因有二:
1.日志仅在容器内可用,即需要进入容器才能看到日志
2. 它们无法通过 kubectl log
命令获得
3. 它们本质上是短暂的,即如果容器崩溃,日志将消失
改为写入 STDOUT 和 STDERR 被认为是容器环境中的最佳实践。写入 STDOUT 和 STDERR 的日志由 docker 引擎重定向到节点中的某个位置 (/var/log/containers/)。此外,这些日志也可以通过 kubectl logs
命令获得。
实际上,日志甚至没有保存在一个节点上,而是被移动到一个中央日志系统。您可以阅读更多相关信息 here。
作为将我的 lagom 应用程序部署到 kubernetes 生产环境的一部分,除了写入标准输出之外,我还试图将所有日志发布到一个文件中。为此,我根据建议 here.
在资源目录下创建了一个logback.xml
添加文件附加程序
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${application.home:-.}/logs/application.log</file>
<encoder>
<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern>
</encoder>
</appender>
但是无法在容器工作目录中创建日志文件。我收到以下错误:
09:23:33,209 |-INFO in ch.qos.logback.classic.AsyncAppender[ASYNCSTDOUT] - Setting discardingThreshold to 51
09:23:33,209 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
09:23:33,213 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
09:23:33,217 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
09:23:33,220 |-INFO in ch.qos.logback.core.FileAppender[FILE] - File property is set to [./logs/application.log]
09:23:33,222 |-ERROR in ch.qos.logback.core.FileAppender[FILE] - Failed to create parent directories for [/opt/docker/./logs/application.log]
09:23:33,222 |-ERROR in ch.qos.logback.core.FileAppender[FILE] - openFile(./logs/application.log,true) call failed. java.io.FileNotFoundException: ./logs/application.log (No such file or directory)
at java.io.FileNotFoundException: ./logs/application.log (No such file or directory)
at at java.io.FileOutputStream.open0(Native Method)
我不太清楚为什么在容器工作目录下创建日志目录和日志文件失败。
demiourgos728@ca5fc4a4c1db:/opt/docker$ ls
bin lib share
我试过如下所示提供对容器工作目录的读、写、执行权限,但这也不起作用:
DockerChmodType.UserGroupWriteExecute
求推荐。
- Docker 基本图像配置:
dockerBaseImage := "adoptopenjdk/openjdk8"
。 - 整个日志文件 here.
- K8S definitions
写入容器中的文件很糟糕,原因有二:
1.日志仅在容器内可用,即需要进入容器才能看到日志
2. 它们无法通过 kubectl log
命令获得
3. 它们本质上是短暂的,即如果容器崩溃,日志将消失
改为写入 STDOUT 和 STDERR 被认为是容器环境中的最佳实践。写入 STDOUT 和 STDERR 的日志由 docker 引擎重定向到节点中的某个位置 (/var/log/containers/)。此外,这些日志也可以通过 kubectl logs
命令获得。
实际上,日志甚至没有保存在一个节点上,而是被移动到一个中央日志系统。您可以阅读更多相关信息 here。