Docker日志中的Pythonexception标记为stream:stdout

我想parsing和处理docker容器中的所有错误,但是当我期望stderr时,标记为stdout的pythonexception。

例如简单的app.py

raise Exception("!") 

然后我在docker容器中运行这个文件。 但是在/var/lib/docker/containers/…/…-json.log中

 {"log":"Traceback (most recent call last):\n","stream":"stdout","time":"2015-06-17T23:10:01.58636849Z"} {"log":" File \"/var/app.py\", line 1, in \u003cmodule\u003e\n","stream":"stdout","time":"2015-06-17T23:10:01.586581081Z"} {"log":" raise Exception(\"!\")\n","stream":"stdout","time":"2015-06-17T23:10:01.586842665Z"} {"log":"Exception: !\n","stream":"stdout","time":"2015-06-17T23:10:01.587373678Z"} 

docker日志从stderr中分离stdout:

 $ docker run -d --name foo busybox ls abcd 9a432862fb838b422d6b06446bc817d71cef09254059ec1ca92d0742580b81a4 $ docker logs foo > stdout.log 2>stderr.log $ cat stdout.log $ cat stderr.log ls: abcd: No such file or directory $ 

VS

 $ docker run -d --name foo busybox ls / 5aff475fe0aa864c22633e7b915f7271e0a009b003371e9cdf2fbf1bae224709 $ docker logs foo > stdout.log 2>stderr.log $ cat stdout.log bin dev etc home lib lib64 linuxrc media mnt opt proc root run sbin sys tmp usr var $ cat stderr.log $ 

除了之前的回答(和我的评论),还有从文档附加docker run http://docs.docker.com/reference/commandline/cli/#run -a, --attach=[] Attach to STDIN, STDOUT or STDERR

我有一个误解。 我以为docker CLI的命令不会影响主日志(/var/lib/docker/containers/…/…-json.log)

但在以下情况下:

docker run -it my_python python /var/app.py

json.log内容:

 {"log":"Traceback (most recent call last):\n","stream":"stdout","time":"2015-06-18T10:02:55.842010241Z"} {"log":" File \"/var/app.py\", line 1, in \u003cmodule\u003e\n","stream":"stdout","time":"2015-06-18T10:02:55.842252975Z"} {"log":" raise Exception(\"error\")\n","stream":"stdout","time":"2015-06-18T10:02:55.842423153Z"} {"log":"Exception: error\n","stream":"stdout","time":"2015-06-18T10:02:55.842754372Z"} 

但是,如果我在后台运行容器,stream成为stderr:

docker运行-d my_python python /var/app.py

 {"log":"Traceback (most recent call last):\n","stream":"stderr","time":"2015-06-18T10:02:18.905673576Z"} {"log":" File \"/var/app.py\", line 1, in \u003cmodule\u003e\n","stream":"stderr","time":"2015-06-18T10:02:18.90575399Z"} {"log":" raise Exception(\"error\")\n","stream":"stderr","time":"2015-06-18T10:02:18.905802834Z"} {"log":"Exception: error\n","stream":"stderr","time":"2015-06-18T10:02:18.90616668Z"} 

我认为这种行为是隐含的。