docker log 搜索排查

在Docker Compose中过滤日志关键字,可以通过以下几种方法实现:

  1. 使用grep命令过滤
    你可以将docker-compose logs命令的输出通过管道传递给grep命令来过滤特定的关键字。例如,如果你想过滤包含”ERROR”关键字的日志,可以使用以下命令:
   docker-compose logs app | grep "ERROR"

这个命令会显示app服务中包含”ERROR”关键字的日志行。

  1. 结合时间戳过滤
    如果你知道需要查找的日志发生在特定的时间范围内,可以使用--since--until标志来过滤日志输出。例如,获取过去一小时内的所有日志:
   docker-compose logs --since 1h

或者获取特定时间之前的所有日志:

   docker-compose logs --until "2024-08-01T12:00:00Z"

这些命令可以帮助你缩小日志的时间范围,从而更容易地找到包含特定关键字的日志。

  1. 获取特定数量的日志行
    使用--tail标志可以控制显示的日志行数,从日志的末尾开始。例如,获取最近的10行日志:
   docker-compose logs --tail 10

这个命令可以帮助你快速查看最近的日志,如果结合--follow使用,可以实时跟踪新日志,而不显示旧日志。

要在使用docker-compose logs命令的同时过滤出包含”ERROR”关键字的日志,并且显示该关键字前后各10行,你可以使用grep命令的-C(或--context)选项。这个选项允许你指定在匹配行的前后显示多少行的上下文。

以下是具体的命令:

docker-compose logs app 2>&1 | grep -C 10 "ERROR"

这里的2>&1是将标准错误(stderr)重定向到标准输出(stdout),这样所有的日志(包括错误日志)都会被grep命令处理。

-C 10选项告诉grep在每个匹配行的前后各显示10行。如果你只想在匹配行之前显示10行,可以使用-B 10--before-context),或者在匹配行之后显示10行,使用-A 10--after-context)。

请注意,grep-C选项可能会在日志行数不足以提供指定上下文时显示较少的行。

当Docker Compose的日志量很大,需要直接在容器的日志文件中搜索时,你可以按照以下步骤操作:

  1. 找到容器的日志文件位置
    Docker默认将容器的日志文件存储在/var/lib/docker/containers系统目录下。每个容器都有自己的子目录,以容器的完整ID命名。你可以使用docker ps命令配合--no-trunc参数来获取容器的正确ID:
   docker ps -a --no-trunc

对于输出的结果,容器的日志将位于/var/lib/docker/containers/<container_id>目录下。在这个目录中,你会找到一个以容器ID命名的JSON文件,文件名后缀为-json.log,这个文件包含了从容器收集的所有日志条目,每个日志条目都是一个JSON对象,每行一个。

  1. 直接在日志文件中搜索关键字
    你可以使用grep命令在日志文件中搜索包含特定关键字的行。例如,如果你想要搜索包含”ERROR”关键字的日志,并且指定前后各10行,可以使用以下命令:
   grep -C 10 "ERROR" /var/lib/docker/containers/<container_id>/<container_id>-json.log

<container_id>替换为实际的容器ID。这个命令会在指定的日志文件中查找包含”ERROR”的行,并显示该行前后各10行的内容。

  1. 使用Docker Compose执行grep命令
    如果你想要直接在容器内部执行grep命令来搜索日志文件,可以使用docker-compose exec命令。例如,如果你想要搜索服务名为app的容器中的日志文件,可以使用:
   docker-compose exec app grep -C 10 "ERROR" /path/to/logfile

/path/to/logfile替换为容器内日志文件的实际路径。这个命令会在app服务的容器中执行grep,搜索包含”ERROR”关键字的日志,并显示前后各10行的内容。

排查到一个heic 图片,因为mimeType 识别为jpeg 的问题,增加了后缀识别。

Leave a Comment

邮箱地址不会被公开。 必填项已用*标注