您在 Docker 中的何处创建应用程序 运行 的应用程序日志?
Where do you create application logs of app running in Docker?
您在 Docker 中的何处创建应用程序 运行 的应用程序日志,以便我稍后可以将它们映射到主机系统?
我在 documentation 中不清楚我是否应该在没有 root 权限的情况下在某些目录中创建日志(然后是哪个?)或者我可以以某种方式 chown 我需要的目录。
我尝试使用 /var/log/case
和 /opt/case/logs
但没有成功。这是我缩小的 SBT 脚本
object build extends Build {
lazy val root = Project(
id = "case-server",
base = file("."),
settings = Defaults.coreDefaultSettings ++ graphSettings ++ Revolver.settings ++ Seq(
version := "1.15",
scalaVersion := "2.11.7",
libraryDependencies ++= {
val akkaV = "2.4.1"
val akkaStreamV = "2.0.1"
val scalaTestV = "2.2.5"
Seq(
"com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2",
"ch.qos.logback" % "logback-classic" % "1.1.+",
"org.scalatest" %% "scalatest" % scalaTestV % "test"
)
},
dockerBaseImage := "develar/java",
dockerCommands := dockerCommands.value.flatMap {
case cmd@Cmd("FROM", _) => List(cmd, Cmd("RUN", "apk update && apk add bash"))
case other => List(other)
},
dockerExposedVolumes := Seq("/opt/case/logs"),
version in Docker := version.value
)
).enablePlugins(AssemblyPlugin).enablePlugins(JavaAppPackaging).enablePlugins(DockerPlugin)
}
执行此操作的正确方法是什么?
根据我的观点,您应该考虑不创建任何 log-file,而是使用(无缓冲的)stdout 在容器化环境中进行日志记录。
请看这里为什么这是个好主意http://12factor.net/logs
然后您可以使用 'docker logs' 获取日志 like described here
您不希望将应用程序日志写入容器文件系统上的文件中。其他解决方案是:
- 将日志文件写入 docker volume
- 将日志条目写入
stdout
(这样它们将被转发到 Docker 引擎并可通过 docker logs
命令使用)
此外,如果您的应用程序正在将其日志条目写入 stdout
,您可以依靠 Docker logging drivers 将这些日志发送到 syslog
、journald
、gelf
、fluentd
、awslogs
、json 文件,或任何提供 docker 日志驱动程序的日志收集系统。
使应用程序写入 stdout
而不是写入文件的技巧是将其配置为写入特殊文件 /proc/self/fd/1
。写入此特殊文件的任何内容都将发送到 stdout
。
您在 Docker 中的何处创建应用程序 运行 的应用程序日志,以便我稍后可以将它们映射到主机系统?
我在 documentation 中不清楚我是否应该在没有 root 权限的情况下在某些目录中创建日志(然后是哪个?)或者我可以以某种方式 chown 我需要的目录。
我尝试使用 /var/log/case
和 /opt/case/logs
但没有成功。这是我缩小的 SBT 脚本
object build extends Build {
lazy val root = Project(
id = "case-server",
base = file("."),
settings = Defaults.coreDefaultSettings ++ graphSettings ++ Revolver.settings ++ Seq(
version := "1.15",
scalaVersion := "2.11.7",
libraryDependencies ++= {
val akkaV = "2.4.1"
val akkaStreamV = "2.0.1"
val scalaTestV = "2.2.5"
Seq(
"com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2",
"ch.qos.logback" % "logback-classic" % "1.1.+",
"org.scalatest" %% "scalatest" % scalaTestV % "test"
)
},
dockerBaseImage := "develar/java",
dockerCommands := dockerCommands.value.flatMap {
case cmd@Cmd("FROM", _) => List(cmd, Cmd("RUN", "apk update && apk add bash"))
case other => List(other)
},
dockerExposedVolumes := Seq("/opt/case/logs"),
version in Docker := version.value
)
).enablePlugins(AssemblyPlugin).enablePlugins(JavaAppPackaging).enablePlugins(DockerPlugin)
}
执行此操作的正确方法是什么?
根据我的观点,您应该考虑不创建任何 log-file,而是使用(无缓冲的)stdout 在容器化环境中进行日志记录。
请看这里为什么这是个好主意http://12factor.net/logs
然后您可以使用 'docker logs' 获取日志 like described here
您不希望将应用程序日志写入容器文件系统上的文件中。其他解决方案是:
- 将日志文件写入 docker volume
- 将日志条目写入
stdout
(这样它们将被转发到 Docker 引擎并可通过docker logs
命令使用)
此外,如果您的应用程序正在将其日志条目写入 stdout
,您可以依靠 Docker logging drivers 将这些日志发送到 syslog
、journald
、gelf
、fluentd
、awslogs
、json 文件,或任何提供 docker 日志驱动程序的日志收集系统。
使应用程序写入 stdout
而不是写入文件的技巧是将其配置为写入特殊文件 /proc/self/fd/1
。写入此特殊文件的任何内容都将发送到 stdout
。