如何在python的一个文件中配置日志系统



我有两个文件。首先是TCP服务器。第二个是flask应用程序,它们是一个项目,但是它们在一个独立的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中管理比在本地运行要棘手一些。特别是对于日志,通常最好将进程设置为直接记录到stdout。Docker将收集日志,您可以使用docker logs查看它们。在这种设置中,无需更改代码,您可以配置Docker将日志发送到其他地方,或者使用日志收集器(如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日志记录文档建议使用本地文件日志记录驱动程序,它会自动进行日志轮换。在Compose设置中,您可以指定logging:选项:

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

你也可以在默认的JSON文件日志驱动程序上配置日志轮换:

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

你"应该't"直接访问日志,但它们在/var/lib/docker中是相当稳定的格式,像fluentd和logstash这样的工具知道如何收集它们。

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

相关内容

最新更新