清除 Docker 容器日志
日志是应用程序在特定事件或状态发生时记录的信息,它们帮助我们监控应用程序并采取必要的措施。
例如,当我们将应用程序部署到生产环境时,日志可以帮助我们了解应用程序状态是启动还是关闭。 发生错误时,我们可以使用日志确定发生的错误类型。
有了这些信息,我们就可以进行必要的更改来修复错误。 在多人使用的大型应用程序中,管理日志可能具有挑战性,但是当使用 docker 时,我们可以轻松管理日志,因为它提供了有助于操作日志的功能。
Docker 提供诸如 --details 、 --since 、 --tail 、 --timestamps 和 --until 之类的命令,我们可以利用这些命令来操作日志。 默认情况下,docker 将日志以 JSON 格式保存在文件夹 /var/lib/docker/containers/ 下,但请注意,我们必须以 root 用户身份构建镜像并运行其容器,才能创建包含日志的文件。
如果这是在没有 root 用户权限的情况下完成的,我们将收到错误 File or directory not found 。 在本教程中,我们将学习可以利用的不同方法来清除 */*-json.log
文件中的日志。
创建一个新项目
打开 WebStorm IDEA 并选择文件 > 新建 > 项目。 在打开的窗口中,选择 Node.js 并将项目名称从 untitled 更改为 docker-logs-clear 或使用任何首选名称。
最后,按标有创建的按钮生成项目。
在docker-logs-clear文件夹下新建一个index.js文件,将以下代码复制粘贴到文件中。
console.log("This is an express application")
console.error("An error occurred")
throw new Error("An exception occurred")
该文件创建一条 STDOUT 消息和两条 STDERR 消息,它们将在我们运行应用程序时添加到日志文件中。 我们可以将此代码更改为 Web 应用程序,但请注意,只有 STDOUT 和 STDERR 消息会添加到日志文件中。
定义镜像
在 docker-logs-clear 文件夹下创建文件 Dockerfile 并将以下说明复制并粘贴到文件中。
FROM node:18-alpine
WORKDIR /com/app
ADD package*.json ./
RUN npm install
ADD . .
CMD node index.js
在这里,FROM 设置基础图像,使用后续指令在其上创建我们的自定义图像。 在这种情况下,我们使用 alpine 来使用 Node 的轻量级镜像作为基础镜像。
docker 文档提供了详细的 Dockerfile 参考,我们可以在其中了解更多关于其他指令的信息。
构建镜像
请注意,此阶段必须以 root 用户身份执行。 为此,请使用计算机上的键盘快捷键打开一个新的终端窗口,然后运行以下命令将当前用户更改为 root 用户。
$ sudo su
输出:
root$
确保将目录 cd 更改为项目的位置,如上所示,以便能够构建图像。 一旦我们获得了 root 用户的访问权限,就可以执行以下命令来构建一个带有标签 docker-logs:latest 的镜像。
root$ docker build --tag docker-logs:latest .
此命令执行我们的 Dockerfile,我们可以在终端窗口中查看正在运行的指令,如下所示。
Step 1/6 : FROM node:18-alpine
18-alpine: Pulling from library/node
213ec9aee27d: Already exists
f379b689aea3: Pull complete
fe299d5780c0: Pull complete
c34a027bbf26: Pull complete
Digest: sha256:f829c27f4f7059609e650023586726a126db25aded0c401e836cb81ab63475ff
Status: Downloaded newer image for node:18-alpine
---> 867dce98a500
Step 2/6 : WORKDIR /com/app
---> Running in 3b215b9ad992
Removing intermediate container 3b215b9ad992
---> aba9cfa2472b
Step 3/6 : ADD package*.json ./
---> 6243ccacf178
Step 4/6 : RUN npm install
---> Running in 9b90745b171e
added 57 packages, and audited 58 packages in 9s
7 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
Removing intermediate container 9b90745b171e
---> e73c696d9743
Step 5/6 : ADD . .
---> e5235f761af0
Step 6/6 : CMD node index.js
---> Running in 7a857eea0a06
Removing intermediate container 7a857eea0a06
---> 29a367a3be2d
Successfully built 29a367a3be2d
Successfully tagged docker-logs:latest
运行容器
要使用 docker-logs 镜像运行容器,请执行以下运行名为 docker-logs-prod 的容器的命令。 请注意,由于它不是 Web 应用程序,因此没有暴露任何端口。
root$ docker run -d --name docker-logs-prod docker-logs:latest
检查容器日志
运行容器会执行我们应用程序中的代码。 执行以下命令以查看容器因 STDOUT 和 STDERR 消息而生成的日志。
root$ docker logs -f docker-logs-prod
输出:
This is an express application
An error occurred
/com/app/index.js:3
throw new Error("An exception occurred")
^
Error: An exception occurred
at Object.<anonymous> (/com/app/index.js:3:7)
at Module._compile (node:internal/modules/cjs/loader:1149:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1203:10)
at Module.load (node:internal/modules/cjs/loader:1027:32)
at Module._load (node:internal/modules/cjs/loader:868:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
Node.js v18.10.0
查看日志文件中的容器日志
要验证之前的日志是否添加到我们的日志文件中,请使用以下命令检查容器保存生成的日志的日志文件的位置。
root$ docker inspect --format='{{.LogPath}}' docker-logs-prod
输出:
/var/lib/docker/containers/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da-json.log
现在我们有了创建日志文件的位置,执行以下命令来打印日志文件的 JSON 内容。
root$ cat /var/lib/docker/containers/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da-json.log
输出:
{"log":"This is an express application\n","stream":"stdout","time":"2022-10-07T10:47:16.594937015Z"}
{"log":"An error occurred\n","stream":"stderr","time":"2022-10-07T10:47:16.596273395Z"}
{"log":"/com/app/index.js:3\n","stream":"stderr","time":"2022-10-07T10:47:16.617728515Z"}
{"log":"throw new Error(\"An exception occurred\")\n","stream":"stderr","time":"2022-10-07T10:47:16.61780931Z"}
{"log":"^\n","stream":"stderr","time":"2022-10-07T10:47:16.617822419Z"}
{"log":"\n","stream":"stderr","time":"2022-10-07T10:47:16.617832094Z"}
{"log":"Error: An exception occurred\n","stream":"stderr","time":"2022-10-07T10:47:16.617846368Z"}
{"log":" at Object.\u003canonymous\u003e (/com/app/index.js:3:7)\n","stream":"stderr","time":"2022-10-07T10:47:16.617855581Z"}
{"log":" at Module._compile (node:internal/modules/cjs/loader:1149:14)\n","stream":"stderr","time":"2022-10-07T10:47:16.617864838Z"}
{"log":" at Module._extensions..js (node:internal/modules/cjs/loader:1203:10)\n","stream":"stderr","time":"2022-10-07T10:47:16.617882182Z"}
{"log":" at Module.load (node:internal/modules/cjs/loader:1027:32)\n","stream":"stderr","time":"2022-10-07T10:47:16.617890043Z"}
{"log":" at Module._load (node:internal/modules/cjs/loader:868:12)\n","stream":"stderr","time":"2022-10-07T10:47:16.617898124Z"}
{"log":" at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)\n","stream":"stderr","time":"2022-10-07T10:47:16.617906808Z"}
{"log":" at node:internal/main/run_main_module:23:47\n","stream":"stderr","time":"2022-10-07T10:47:16.617914665Z"}
{"log":"\n","stream":"stderr","time":"2022-10-07T10:47:16.61792284Z"}
{"log":"Node.js v18.10.0\n","stream":"stderr","time":"2022-10-07T10:47:16.617930182Z"}
从文件返回的JSON内容中,我们可以看到容器生成的所有日志,包括流和事件发生的时间。 在下一节中,我们将学习如何从该文件中清除日志。
使用 echo 命令清除 Docker 容器日志
要从日志文件中清除 JSON 内容,请执行以下命令,该命令使用 echo 命令用空字符串覆盖文件。
root$ echo "" > $(docker inspect --format='{{.LogPath}}' docker-logs-prod)
要验证我们的日志文件是否已被清除,请执行 docker logs -f docker-logs-prod
命令,注意它不会从该文件返回任何日志。
使用 truncate 命令清除 Docker 容器日志
重新运行之前的容器重新生成日志,执行以下命令清除添加到日志文件中的日志。 这使用 truncate 命令将文件缩小到 0。
root$ truncate -s 0 $(docker inspect --format='{{.LogPath}}' docker-logs-prod)
要验证我们的日志文件是否已被清除,请执行 docker logs -f docker-logs-prod
命令并注意它不会从该文件返回任何日志。
使用日志轮换清除 Docker 容器日志
在前两个示例中,我们使用 echo 和 truncate 命令手动清除日志文件的内容。 不推荐使用这些方法,因为它们可能会影响 docker 日志系统并导致意外行为。
从容器中清除日志的推荐方法是使用日志轮换。 要使用默认日志记录驱动程序 json 文件进行日志轮换,我们可以在位于 /etc/docker/ 文件夹下名为 daemon.json 的文件中设置日志文件的最大大小和最大文件,如下所示。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
这应该使用 root 用户权限来完成。 为了使更改生效,我们必须使用命令 systemctl reload docker 重新加载 docker。
如果我们想为单个容器指定日志轮转,我们可以在运行时指定 --log-driver json-file 、**--log-opt max-size=10m** 和 --log-opt max-file=3 选项 容器。
总结
在本文中,我们学习了通过清除添加到日志文件的 JSON 内容来清除 docker 容器日志的不同方法。 我们在本教程中介绍的方法包括使用 echo
命令、truncate
命令和 log-rotation
。
相关文章
在 Linux 中托管 Docker Internal
发布时间:2023/04/18 浏览次数:139 分类:Docker
-
Docker 允许开发人员通过将应用程序包装在称为容器的标准化单元中来高效地构建、测试和部署应用程序。 在使用 Docker 容器时,您可能会遇到需要将容器与主机连接的场景。
在 Docker 中设置工作目录
发布时间:2023/04/18 浏览次数:82 分类:Docker
-
在 Docker 中,我们可以通过编辑 Dockerfile 并添加密钥 WORKDIR 来设置我们的工作目录。本文将讨论在 Docker 中更改我们当前和默认的工作目录。
在 Docker 容器中公开多个端口
发布时间:2023/04/18 浏览次数:143 分类:Docker
-
Docker 容器使用端口来实现万维网上不同设备之间的通信。 在本篇文章中,我们将学习如何使用 Nginx 应用程序在 Docker 容器中公开多个端口。
将用户添加到 Docker 容器
发布时间:2023/04/18 浏览次数:187 分类:Docker
-
在本文中,我们将学习如何通过实现返回产品数组的 Express 应用程序将用户添加到 Docker 容器。
使用 Docker 网络主机命令
发布时间:2023/04/18 浏览次数:112 分类:Docker
-
在本文中,我们将学习如何使用 --network 命令将容器添加到主机网络。 如果我们不使用此命令指定网络,我们还将了解如何将容器添加到默认网络。
Dockerfile 中 COPY 和 ADD 命令的区别
发布时间:2023/04/18 浏览次数:158 分类:Docker
-
在 Dockerfile 中,我们可以使用 COPY 或 ADD 命令复制这些文件。 这些命令在功能上是相同的; 但是,存在一些差异。本文介绍了 Dockerfile 中 COPY 和 ADD 命令之间的区别。