在django中使用logging

本文介绍了一种在Django项目中使用Python标准库logging的方法,实现了日志记录功能,包括记录访问情况及debug信息。
django中似乎没有专门支持logging的module。想在自己开发程序中使用一下log功能,记录访问情况,和输入debug的一些信息。于是google到一段代码,使用的python的标准库logging,目前工作还算正常.

[url]http://djangosnippets.org/snippets/16/[/url]


import logging
import threading

from django.conf import settings

_LOCALS = threading.local()

def getlogger():
logger = getattr(_LOCALS, 'logger', None)
if logger is not None:
return logger

logger = logging.getLogger()
hdlr = logging.FileHandler(settings.LOG_FILE)
formatter = logging.Formatter('[%(asctime)s]%(levelname)-8s"%(message)s"','%Y-%m-%d %a %H:%M:%S')

hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
#logger.setLevel(logging.NOTSET)
logger.setLevel(getattr(settings, 'LOG_LEVEL', logging.NOTSET))
setattr(_LOCALS, 'logger', logger)

return logger

def debug(msg):
logger = getlogger()
logger.debug(msg)


将代码保存为myproj/log.py,只需在相应程序文件中import该myproj.log,通过getlogger()获得一个obj即可使用。


import myproj.log
logger = myproj.log.getlogger()
logger.debug("Debug information")


[b]Python标准模块loggin的使用[/b]

未完待续。。。
<think>我们正在配置Celery的日志记录。根据用户提供的logging.json配置,我们可以将其转换为Celery的日志配置。 用户的目标是配置Celery以记录任务日志,包括控制台和文件,并且文件按大小滚动。 步骤: 1. 理解用户提供的logging.json配置:该配置定义了一个格式化器(formatter)、两个处理器(handler:控制台和文件)和一个根记录器(root)。 2. 在Celery中,我们可以通过创建日志配置字典来实现类似的配置。 注意:Celery使用Python的标准logging模块,因此我们可以使用类似的配置。 用户配置解析: - 格式化器:格式为"[%(asctime)s] %(levelname)s in %(module)s: %(message)s" - 控制台处理器:级别为DEBUG,输出到stdout - 文件处理器:级别为INFO,使用RotatingFileHandler,每个文件最大10MB,保留20个备份,文件名为logs/log(注意:需要确保logs目录存在) - 根记录器:级别为DEBUG,同时使用控制台和文件处理器 在Celery中配置日志的常用方法: - 使用`celery.signals.setup_logging`信号来覆盖默认的日志配置。 - 或者,在创建Celery应用时通过`worker_hijack_root_logger`选项来控制(但通常我们需要自定义,所以使用信号更灵活)。 我们将采用在Celery配置中设置日志的方式,或者通过信号设置。 由于用户已经有一个logging.json,我们可以将其转换为一个字典配置,然后在Celery中应用。 但是,请注意:Celery worker在启动时会配置日志,如果我们想完全自定义,可以使用`setup_logging`信号。 实现步骤: 1. 创建一个日志配置字典(类似于logging.json的内容,但使用Python字典表示)。 2. 使用`setup_logging`信号来应用这个配置。 另外,我们还需要注意: - 确保日志目录存在:在代码中检查并创建logs目录。 - 由于文件处理器使用了RotatingFileHandler,我们需要导入logging.handlers模块。 下面是一个示例代码,展示如何配置Celery的日志: 首先,我们创建一个日志配置字典,内容基于用户提供的logging.json。 然后,我们在Celery的启动文件中连接信号。 注意:在Celery中,任务日志通常通过任务的logger记录,例如`logger = logging.getLogger(__name__)`。但是,根记录器配置好后,所有子记录器也会继承。 然而,Celery建议使用`get_task_logger`来获取任务专用的日志记录器,因为它会添加一些额外的上下文(如任务ID)。但即使如此,我们仍然需要配置根记录器(或特定的记录器)来处理日志。 我们将配置根记录器,这样所有记录器(包括任务记录器)都会使用我们的处理器。 代码示例: 在定义Celery应用的文件中(比如`celery_app.py`):</think>### 配置 Celery 日志记录的完整指南 在 Celery 中配置日志记录需要结合 Celery 的日志系统和 Python 标准 `logging` 模块。以下是基于您提供的 `logging.json` 配置的完整实现方案: #### 1. 创建日志配置文件(`celery_logging.py`) ```python import logging import logging.config from logging.handlers import RotatingFileHandler LOGGING_CONFIG = { "version": 1, "disable_existing_loggers": False, "formatters": { "default": { "format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s" } }, "handlers": { "console": { "class": "logging.StreamHandler", "level": "DEBUG", "formatter": "default", "stream": "ext://sys.stdout" }, "file": { "()": RotatingFileHandler, "level": "INFO", "formatter": "default", "filename": "logs/celery.log", "maxBytes": 10485760, # 10 MB "backupCount": 20, "encoding": "utf8" } }, "root": { "level": "DEBUG", "handlers": ["console", "file"] } } # 应用配置 logging.config.dictConfig(LOGGING_CONFIG) ``` #### 2. 在 Celery 应用中集成日志配置(`celery_app.py`) ```python from celery import Celery from celery.signals import setup_logging import celery_logging # 导入上面的日志配置 app = Celery('proj', broker='redis://localhost:6379/0', backend='redis://localhost:6379/1') # 覆盖默认日志配置 @setup_logging.connect def configure_logging(sender=None, **kwargs): from logging.config import dictConfig dictConfig(celery_logging.LOGGING_CONFIG) @app.task def my_task(x, y): logger = my_task.get_logger() # 获取任务专用日志器 logger.info(f"Task started with args: {x}, {y}") result = x + y logger.debug(f"Task result: {result}") return result ``` #### 3. 关键配置说明 1. **日志级别处理**: - 控制台输出 `DEBUG` 及以上级别 - 文件记录 `INFO` 及以上级别 - 根日志器设置为 `DEBUG` 确保所有日志被捕获 2. **日志文件管理**: - 使用 `RotatingFileHandler` 自动分割日志 - 单个文件上限 10MB (`maxBytes=10485760`) - 保留最近 20 个备份 (`backupCount=20`) 3. **任务内日志记录**: ```python # 在任务函数中使用 logger = my_task.get_logger() logger.info("Task started") logger.error("Something went wrong") ``` #### 4. 启动前的准备工作 ```bash # 创建日志目录 mkdir -p logs # 启动Worker(显示日志配置已加载) celery -A celery_app worker --loglevel=info # 测试任务(Python shell) from celery_app import my_task result = my_task.delay(3, 5) result.get(timeout=10) ``` #### 5. 日志输出示例 ``` [2023-08-15 14:30:22] INFO in celery_app: Task started with args: 3, 5 [2023-08-15 14:30:22] DEBUG in celery_app: Task result: 8 ``` > **注意**:当使用 `setup_logging` 信号时,需确保 `worker_hijack_root_logger=False`(默认值),否则自定义配置会被覆盖[^1]。 ### 相关问题 1. 如何在 Celery 任务中捕获并记录异常信息? 2. 如何将 Celery 日志与 Django/Flask 等 Web 框架的日志系统集成? 3. 使用 Redis 作为 Celery broker 时,如何配置日志监控消息队列状态? 4. 如何实现 Celery 日志的实时监控和报警机制? [^1]: Celery 官方文档 - 日志配置建议 [^2]: 基于提供的 logging.json 配置优化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值