因此我们可以将 docker 容器作为守护进程运行:
docker run -d --name foo foo
然后读取日志:
docker logs -f foo
但我想知道如何仅写入 stdout/stderr,以便我可以将日志发送到 splunk 或 cloudwatch 等。类似于:
(
docker run --name foo foo &| capture_logs
) & disown
官方的做法是什么?
答案1
您可以使用@Michael指出的日志记录选项,如下所述文档
一般来说,至少有两种方法可以做到这一点,下面将简要讨论。
- 使用
splunk
驱动程序,如下所示这里。
首先创建一个事件收集器令牌,如文档. 该令牌将在 splunk 驱动程序配置中使用。
docker cli 示例
docker run -d \
--log-driver=splunk \
--log-opt splunk-token=176FCEBF-4CF5-4EDF-91BC-703796522D20 \
--log-opt splunk-url=https://splunkhost:8088 \
--log-opt tag=foo-logs \
--name foo foo
docker-compose 示例
version: '3.7'
services:
foo_app:
...
logging:
driver: splunk
options:
tag: foo-logs
splunk-token: 176FCEBF-4CF5-4EDF-91BC-703796522D20
splunk-url: https://splunkhost:8088
...
- 使用
syslog
驱动程序,如下所示这里。
docker cli示例:
docker run \
-–log-driver syslog –-log-opt tag=foo-logs \
--name foo foo
docker-compose示例:
version: '3.7'
services:
foo_app:
...
logging:
driver: syslog
options:
tag: foo-logs
...
这会将所有容器日志发送到本地系统日志,您可以从那里获取这些日志并将其转发到外部 udp 端口,splunk 已准备好接收您的日志。
因此,假设 Splunk 服务器将接收端口上的日志,514
那么您需要将其添加到rsyslogd
配置中,然后重新启动 rsyslogd 服务
# /etc/rsyslog.d/20-splunk.conf
:syslogtag, contains, "foo-logs" @splunk_url:514;RSYSLOG_SyslogProtocol23Format
或者,如果您打算将其设置为所有容器的全局变量,那么您可以/etc/docker/daemon.json
像下面这样通过文件本身配置日志记录(并且不要忘记重新启动 docker 服务):
的情况下syslog
{
"log-driver": "syslog"
}
的情况下splunk
{
"log-driver": "splunk",
"log-opts": {
"splunk-token": "176FCEBF-4CF5-4EDF-91BC-703796522D20",
"splunk-url": "https://splunkhost:8088",
...
}
}
查看列表支持的日志驱动程序