清除 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
。
相关文章
Get the IP address of the Docker container from the host using docker inspect
发布时间:2025/03/26 浏览次数:102 分类:Docker
-
Docker containers are not just for isolation—they are often used to manage processes that still need to communicate directly with each other. However, to communicate, you usually need to know the IP address of each container, which you ca
Solution to incorrect access log time when deploying Nginx in Docker
发布时间:2025/03/26 浏览次数:165 分类:Docker
-
In the process of operating the website, I never took the logs too seriously. Although logging was turned on, I never analyzed the logs carefully. Today, when I looked at the logs on a whim, I found that the recorded time was 8 hours less t
Docker deploys nginx php application
发布时间:2025/03/26 浏览次数:131 分类:Docker
-
I'm learning docker recently. I'm learning by building an nginx+php development environment example. Here I record the build process. First, give a docker-compose.yml deployment configuration file version: '3' services: nginx: container_nam
How to use Docker to image a Node.js web application
发布时间:2025/03/26 浏览次数:107 分类:Docker
-
Docker is a containerization platform that simplifies the packaging and execution of applications. Containers run as independent processes with their own file systems, but share the kernel of their host machine. Docker has attracted much at
Start a Bash terminal in a new Docker container
发布时间:2025/03/26 浏览次数:97 分类:Docker
-
Docker containers are a standard unit for packaging all the dependencies of an application, allowing us to easily run them in any environment. Containers have become very popular recently, and most developers now rely heavily on containers
Passing environment variables to containers in Docker
发布时间:2025/03/26 浏览次数:124 分类:Docker
-
This article will introduce how to pass environment variables to containers in Docker. Passing environment variables to containers in Docker using the -e and tags -env We will first see how to create environment variables and pass them to t
Install Docker using Homebrew
发布时间:2025/03/26 浏览次数:202 分类:Docker
-
There is no doubt that Docker containers have revolutionized the way we develop and deploy applications. They provide developers with the ability to package applications and dependencies in an isolated environment. Recently, we've seen wide
Enforce clean build of images in Docker
发布时间:2025/03/26 浏览次数:87 分类:Docker
-
This article discusses and demonstrates how to enforce clean builds of images in Docker. Building images in Docker We will use a simple Flask application to demonstrate this concept. my-app Create a app.py simple application named in the ho
Running a Docker instance from a Dockerfile
发布时间:2025/03/26 浏览次数:140 分类:Docker
-
Docker containers have undoubtedly become the standard unit for managing software and dependencies in different environments. When using real applications, you must create a docker file before building the container image of the application