继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

将日志输出到Docker容器外

慕姐8265434
关注TA
已关注
手记 1147
粉丝 221
获赞 1064

1.1 使用 Docker 容器日志

我们可以利用 docker logs 命令查看 Docker 容器内部应用程序运行时所产生的日志,可以免除首先进入 Docker 容器,再打开应用程序的日志文件的过程。docker logs 会监控容器中操作系统的标准输出设备(STDOUT),一旦 STDOUT 有数据产生,就会将这些数据传输到另一个“设备”中,该 Docker 的被称为“日志驱动(Logging Driver)”

1.2 Docker 日志驱动

例如,我们有一个容器实例 ID 为 “da6743d61e1a” ,随后我们使用 docker logs 命令,查看 da6743d61e1a 容器的日志

docker logs -f da6743d61e1a

此时,Docker 日志也在同步输出,输出的日志类似下面这样。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.3.RELEASE)

2018-08-31 14:39:34.608  INFO 8 --- [           main] com.ctego.inventory.server.Server        : Starting Server on ctego-inventory-srv-55798d4965-lfdxn with PID 8 (/var/ctego/server.jar started by root in /)
2018-08-31 14:39:34.696 DEBUG 8 --- [           main] com.ctego.inventory.server.Server        : Running with Spring Boot v1.5.3.RELEASE, Spring v4.3.8.RELEASE
2018-08-31 14:39:34.697  INFO 8 --- [           main] com.ctego.inventory.server.Server        : No active profile set, falling back to default profiles: default
2018-08-31 14:39:46.125  INFO 8 --- [           main] c.l.s.valid.DefaultValidConfig           : 开启参数校验
2018-08-31 14:39:48.102  INFO 8 --- [           main] org.xnio                                 : XNIO version 3.3.6.Final
2018-08-31 14:39:48.208  INFO 8 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.3.6.Final
2018-08-31 14:39:48.602  WARN 8 --- [           main] io.undertow.websockets.jsr               : UT026009: XNIO worker was not set on WebSocketDeploymentInfo, the default worker will be used
2018-08-31 14:39:48.602  WARN 8 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2018-08-31 14:39:48.701  INFO 8 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext

Docker 是怎样做到的呢?或者说,所谓的 Docker 日志驱动,到底做了些什么事情?
我们使用 docker info 命令,可以看到 Docker 容器的相关信息,其中有一项 Logging Driver 的字段。

docker info | grep 'Logging Driver'

通过输入以上命令,将得到Docker 当前所设置的日志驱动类型:journald

Logging Driver: journald

其实,Docker 已为我们提供了大量的日志驱动类型。

  • none:容器不输出任何日志;

  • json-file:容器输出的日志以 JSON 格式写入文件中(默认);

  • syslog:容器输出的日志写入宿主机的 Syslog 中;

  • journald:容器输出的日志写入宿主机的 Journald 中;

  • gelf:容器输出到日志以 GELF(Graylog Extended Log Format)格式写入 Graylog中;

  • fluentd:容器输出的日志写入宿主机的 Fluented 中;

  • awslogs:容器输出的日志写入 Amazon CloudWatch Logs 中;

  • splunk:容器输出的日志写入 splunk 中;

  • etwlogs:容器输出的日志写入 ETW (Event Tracing for Windows);

  • mats:容器输出的日志写入 NATS 服务中;
    我们可以在 docker run 命令中通过  --log-driver 参数来设置具体的 Docker 日志驱动,也可以通过 --log-opt 参数来指定对应日志驱动的相关选项。就拿 json-file 来说,其实可以这样启动 Docker 容器:

docker run \
-d \
-p 80:80 \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
--name nginx \
nginx

通过 --log-opt 参数为 json-file 日志驱动添加了两个选项,max-size=10m 表示  JSON 文件最大为 10MB(超过 10MB 就会自动生成新文件),max-file=3 表示 JSON 文件最多为3个(超过3个就会自动删除多余的旧文件)
除了在启动 Docker 容器时,可指定日志驱动以外,还可以通过修改 Docker 配置文件来指定日志驱动。
打开配置文件 /etc/sysconfig/docker,找到以下配置片段:

OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
    DOCKER_CERT_PATH=/etc/docker
fi

可以看出,默认的日志驱动为 journald,把它修改为 syslog

--log-driver=syslog

然后重启 docker

systemctl restart docker

本文中所使用的 docker 版本为 1.13.1
新版本的docker中,已废弃/etc/sysconfig/docker这种配置方式,转而采用/etc/docker/daemon.json来配置
详情请阅读 官方文档

以上众多日志驱动类型中,较为常用 的是 Syslog,因为 Syslog 是 Linux 的日志系统,很多日志分析工具都可以从 Syslog 中获取日志,比如流行的 ELK(Elasticsearch、Logstash、Kibana)日志中心。Logstash 用于收集日志,Syslog 中写入的日志可转发到 Logstash 中,随后将日志存入 Elasticsearch 中,最后可通过 Kibana 来查询日志。
接下来咱们的目标是将 Docker 容器中输出的日志写入 Syslog,那么后面需要做的就是将 Syslog 接入 ELK 了。

1.3 Linux 日志系统:Syslog

默认,Linux 操作系统已经安装了 Syslog 软件包,但它叫 Rsyslog。实际上,Rsyslog 是 Syslog 标准的一种实现,还有一种叫 Syslog-ng 的第三方实现。虽然 Syslog-ng 的功能较为强大,但我们还是选择使用 Rsyslog,因为操作系统已经预装了,我们无须单独安装,可以通过以下命令查看 Rsyslog 是否已安装。

[root@uat-k8s-master1 ~]# rsyslogd -v
rsyslogd 8.24.0, compiled with:
    PLATFORM:               x86_64-redhat-linux-gnu
    PLATFORM (lsb_release -d):      
    FEATURE_REGEXP:             Yes
    GSSAPI Kerberos 5 support:      Yes
    FEATURE_DEBUG (debug build, slow code): No
    32bit Atomic operations supported:  Yes
    64bit Atomic operations supported:  Yes
    memory allocator:           system default
    Runtime Instrumentation (slow code):    No
    uuid support:               Yes
    Number of Bits in RainerScript integers: 64

如果要开启 Rsyslog 服务,我们必须对 Rsyslog 进行配置,打开文件 vi /etc/rsyslog.conf
在 rsyslog.conf 文件中有一段配置,我们需要手工去开启

$ModLoad imtcp$InputTcpServerRun 514

重启 Rsyslog 服务,否则配置无法生效

systemctl restart rsyslog

此时,我们可以查看本地是否对外开启了 514 端口

[root@uat-k8s-master1 ~]# netstat -anpt | grep 514
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      20681/rsyslogd      
tcp6       0      0 :::514



作者:CPChen
链接:https://www.jianshu.com/p/bf2eb121ac62


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP