docker的日志

 默认情况下,service docker start或docker -d,docker后台进程默认会在当前终端输出日志,回车几下又可以获得shell,继续执行其他命令,然而当docker有日志需要输出到屏幕时,会再次进入到日志输出,很不方便。
    使用docker -d > /path/to/log/file,把docker的日志输出重定向到文件。
    同时你应该修改 /etc/init.d/docker 的代码,把 start-stop-daemon 的输出也重定向。

    当你运行一个容器,容器的状态存活在 /var/lib/docker/containers/<id>下,例如
root@precise64:/var/lib/docker/containers/fe38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374# ls -la
total 44
drwx------  3 root root  4096 Mar 14 19:56 .
drwx------ 83 root root 12288 Mar 14 21:53 ..
-rw-r--r--  1 root root   106 Mar 14 19:56 config.env
-rw-r--r--  1 root root  1522 Mar 14 19:56 config.json
-rw-------  1 root root   241 Mar 14 19:56 fe38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374-json.log
-rw-r--r--  1 root root   126 Mar 14 19:56 hostconfig.json
-rw-r--r--  1 root root    13 Mar 14 19:56 hostname
-rw-r--r--  1 root root   181 Mar 14 19:56 hosts
drwxr-xr-x  2 root root  4096 Mar 14 19:56 root

文件 e38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374-json.log 是容器的日志文件。每一行是一个 JSON 对象并且对于容器输入和输出的每一行这有一个界限。
{"log":"root@c835298de6dd:/# ls\r\n","stream":"stdout","time":"2014-03-14T22:15:15.155863426Z"}
{"log":"bin  boot  dev\u0009etc  home  lib\u0009lib64  media  mnt  opt\u0009proc  root  run  sbin  selinux\u0009srv  sys  tmp  usr  var\r\n","stream":"stdout","time":"2014-03-14T22:15:15.194869963Z"}

    可通过编写或使用数据收集器,解析日志文件的json对象,并把数据收集到特定的地方。在一个在线环境,实际的日志内容可以被发送到一个 elasticsearch 集群,并使用 kibana 或 graylog2 查看。二选一,这也有使用 JSON 工作的主机服务。
这个方法提供了一下好处:

    主机可以使用一个单独的收集 agent 转发任何容器的日志到一个中央日志服务器.
    不需要要求应用程序使用 syslog 或是写日志到特定的卷。
    主机可以访问容器日志以及任何在容器文件系统上的日志文件。
    主机可以为容器轮转日志。

这个方法的一个缺点就是它直接访问 docker 文件系统而没有使用 API,这意味着它在未来可能出现问题,因为如果未来 docker 版本改变了它怎样在主机文件系统存储容器日志的话。

猜你喜欢

转载自m635674608.iteye.com/blog/2367466