如何访问Docker容器中Windows事件日志

30

如何从主机访问 Microsoft Docker 容器的 Windows 事件日志?

我在 Windows Server 2016 上有一个 Docker 容器。

该容器基于镜像:microsoft/iis

我可以使用以下命令获取容器的 IP 地址:

docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" my-running-site

如何通过Windows主机上的事件查看器连接到它?


1
好问题!当然可以使用PowerShell进入容器并像预期的那样使用get-eventlog,但是从主机连接到容器意味着容器正在监听外部请求以获取事件日志。如果您检查容器的侦听端口,则只有端口135(RPC)在侦听,这可能是正确的。下一步是使用docker run -p 135:135...将该端口暴露给外部,但在我的尝试中它没有起作用...不妨在Docker或容器论坛或GitHub上发布该问题? - Falco Alexander
我不确定事件日志是容器内记录日志的正确方式。虽然在Windows中它是传统工具,但容器的轻量级特性使得重定向到标准输出和标准错误更适合用于容器的日志记录。这还有进一步的好处,例如将日志分析委托给诸如logstash和elasticsearch等工具。这样可以更轻松地查询多个容器并将日志集中存储。此外,重定向到标准输出和标准错误允许您轻松地从主机的命令行运行docker logs ...以轻松获取日志。 - Alex H
我并不总是能控制日志记录到何处。如果我打开端口135,我会收到“拒绝访问(5)”的错误提示。 - Greg Pagendam-Turner
我目前的理解是:是否有可能让运行在容器内的应用程序(如IIS)记录事件到Windows事件日志,并使用主机上的Windows事件查看器查看这些事件。我的理解正确吗?我也很想知道答案。 - robbie fan
我也是。我也很好奇我们该如何做?运行一个进程,不断将日志写入数据文件夹,主机可以访问它,这个方案怎么样? - james
@GregPagendam-Turner,您是否收到任何解决方案或已经修复了问题?我尝试了许多不同的方法,但是无法将日志文件复制到我的本地驱动器 - user15059549
3个回答

21
创建一个容器的 PowerShell 会话。
docker exec -it  <container_id> powershell

然后从容器中获取最新的事件日志

Get-Eventlog -newest 20 application

以上命令可以帮助您找到索引,

(Get-Eventlog -index xxx application).message

没成功,伙计。出现了“OCI runtime exec failed: exec failed: container_linux.go:370: starting container process caused: exec: "powershell": executable file not found in $PATH: unknown”的错误。 - user15059549
你在容器中安装了PowerShell吗?如果没有,请尝试使用bash或cmd。 - Praveen Kumar
我按照上述步骤进行操作,并通过安装PowerShell来解决问题。然而,我无法将log.json文件从Docker容器复制到Windows本地驱动器。我采用了这种方法。https://kb.sitecore.net/articles/383441 - user15059549
所以,如果可以复制它,为什么我不能复制并运行这些命令呢?我有一个类似于以下页面的问题。您可以在那里发布您的答案,我会跟随它。 https://stackoverflow.com/questions/66055244/docker-error-no-such-containerpath-while-trying-to-copy-to-local-drive?noredirect=1#comment116814489_66055244 - user15059549
你收到任何解决方案或修复问题了吗?我尝试了许多不同的方法,但是无法将日志文件复制到我的本地驱动器。 - user15059549

5

在 PWSH (Powershell Core) 上:

Get-WinEvent -LogName Application

4
Docker引擎记录日志到Windows“应用程序”事件日志,而不是文件。可以使用Windows PowerShell轻松读取、排序和过滤这些日志。
例如,以下命令将显示最旧的开始时间为5分钟前的Docker引擎日志。
Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-5) | Sort-Object Time 

3
我认为这不是一个解决方案,因为你只能得到 Docker 的源代码,而不能获取运行在容器内部的进程。 - james
是的,那些不是IIS日志。在Azure中,这要简单得多。 - Triynko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接