【问题标题】:how to configure logging system in one file on python如何在python的一个文件中配置日志系统
【发布时间】:2021-10-16 12:06:16
【问题描述】:

我有两个文件。 首先是 TCP 服务器。 第二个是烧瓶应用程序。它们是一个项目,但它们位于一个单独的 docker 容器内 由于是同一个项目,他们应该写日志相同的文件 我尝试创建我的日志库我将我的日志库导入到两个文件 我尝试了很多事情
首先我删除了下面的代码

    if (logger.hasHandlers()):
        logger.handlers.clear()

当我删除时,我得到两次相同的日志

我的结构

docker-compose
docker file
loggingLib.py
app.py
tcp.py
requirements.txt
.
.
.

我最后的日志记录代码

from logging.handlers import RotatingFileHandler
from datetime import datetime
import logging
import time
import os, os.path

project_name= "proje_name"


def get_logger():
    if not os.path.exists("logs/"):
        os.makedirs("logs/")
    now = datetime.now()
    file_name = now.strftime(project_name + '-%H-%M-%d-%m-%Y.log')
    log_handler = RotatingFileHandler('logs/'+file_name,mode='a', maxBytes=10000000, backupCount=50)
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(funcName)s - %(message)s  ', '%d-%b-%y %H:%M:%S')

    formatter.converter = time.gmtime
    log_handler.setFormatter(formatter)
    logger = logging.getLogger(__name__)
    logger.setLevel(level=logging.INFO)
    if (logger.hasHandlers()):
        logger.handlers.clear()
    logger.addHandler(log_handler)
    return logger

它正在工作,但只在一个文件中 如果 app.py 首先工作,它只会生成一个日志 其他文件不做任何日志

【问题讨论】:

  • 通常在 Docker 中,您根本不会登录到文件。两个容器都将登录到控制台,您可以使用docker logs 查看日志。如果您使用 docker-compose up 而不使用 -d 选项在前台同时启动两个容器,则它们的日志将在控制台上合并。
  • @DavidMaze 无法使用 docker 控制台日志,因为卷溢出。打印 docker 控制台的任何内容都会填充覆盖内存。之后服务器内存中不会有空内存,服务器可以关闭或者无法响应
  • 您可以为default Docker JSON File log driver 配置日志轮换。日志不应该消耗内存,只消耗磁盘空间。
  • @DavidMaze 我尝试了一个 docker JSON 文件日志驱动程序的内置示例,但我无法解决,您可以编写一个示例以在 docker-compose.yml 中实现

标签: python docker flask logging tcp


【解决方案1】:

任何直接使用文件的东西——配置文件、日志文件、数据文件——在 Docker 中管理比在本地运行要复杂一些。特别是对于日志,通常最好将您的进程设置为直接记录到标准输出。 Docker 将收集日志,您可以使用docker logs 查看它们。在此设置中,您可以在不更改代码的情况下 configure Docker to send the logs somewhere else 或使用 fluentd 或 logstash 等日志收集器来管理日志。

在您的 Python 代码中,您通常需要在根记录器的顶层配置详细的日志记录设置

import logging
def main():
  logging.basicConfig(
    format='%(asctime)s - %(levelname)s - %(funcName)s - %(message)s  ',
    datefmt='%d-%b-%y %H:%M:%S',
    level=logging.INFO
  )
  ...

在每个单独的模块中,您可以获取一个本地记录器,它将继承根记录器的设置

import logging
LOGGER = logging.getLogger(__name__)

使用默认设置,Docker 会将日志消息捕获到磁盘上的 JSON 文件中。如果在长时间运行的容器中生成大量日志消息,可能会导致本地磁盘耗尽(不会影响进程可用的内存)。 Docker logging documentation 建议使用 local file logging driver,它会自动进行日志轮换。在 Compose 设置中,您可以指定 logging: 选项:

version: '3.8'
services:
  app:
    image: ...
    logging:
      driver: local

您还可以在default JSON File logging driver 上配置日志轮换:

version: '3.8'
services:
  app:
    image: ...
    logging:
      driver: json-file # default, can be omitted
      options:
        max-size: 10m
        max-file: 50

您“不应该”直接访问日志,但它们在 /var/lib/docker 中的格式相当稳定,并且 fluentd 和 logstash 等工具知道如何收集它们。

如果您决定在 Kubernetes 之类的集群环境中运行此应用程序,那么它将拥有自己的日志管理系统,但再次围绕直接记录到其标准输出的容器进行设计。您将能够在 Kubernetes 中未经修改地运行此应用程序,并使用适当的集群级配置将日志转发到某处。从远程集群中的不透明存储中检索日志文件可能很难设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多