sth*_*eli 5 python django celery
我有一个 Django 应用程序,我使用 celery 和rabbitmq 来执行异步任务。我已配置芹菜将日志写入文件,当我执行时
celery -A project_name -b <broker_url> worker -l INFO
一切工作正常,日志都打印在控制台和文件中。
但是,当我使用 -D 选项执行上述命令(即分离工作程序)时,该文件不再附加日志。
我的日志记录配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt': "%d/%b/%Y %H:%M:%S"
},
},
'handlers': {
'null': {
'level': LOGGING_LEVEL,
'class': 'logging.NullHandler',
},
'logfile': {
'level': LOGGING_LEVEL,
'class': 'logging.handlers.RotatingFileHandler',
'filename': log_file_path,
'maxBytes': 5000000,
'backupCount': 2,
'formatter': 'standard',
},
'console': {
'level': LOGGING_LEVEL,
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
},
'loggers': {
'django': {
'handlers': ['console'],
'propagate': True,
'level': "WARNING",
},
'django.db.backends': {
'handlers': ['console'],
'level': "INFO",
'propagate': False,
},
'celery': {
'handlers': ['console', 'logfile'],
'level': LOGGING_LEVEL,
},
}}
Run Code Online (Sandbox Code Playgroud)
芹菜.py:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt': "%d/%b/%Y %H:%M:%S"
},
},
'handlers': {
'null': {
'level': LOGGING_LEVEL,
'class': 'logging.NullHandler',
},
'logfile': {
'level': LOGGING_LEVEL,
'class': 'logging.handlers.RotatingFileHandler',
'filename': log_file_path,
'maxBytes': 5000000,
'backupCount': 2,
'formatter': 'standard',
},
'console': {
'level': LOGGING_LEVEL,
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
},
'loggers': {
'django': {
'handlers': ['console'],
'propagate': True,
'level': "WARNING",
},
'django.db.backends': {
'handlers': ['console'],
'level': "INFO",
'propagate': False,
},
'celery': {
'handlers': ['console', 'logfile'],
'level': LOGGING_LEVEL,
},
}}
Run Code Online (Sandbox Code Playgroud)
我是否缺少一些日志记录配置?
=============================================
更新
我已使用 TimedRotatingFileHandler 更改了日志文件处理程序,如下所示:
'logfile': {
'level': LOGGING_LEVEL,
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': log_file_path,
'when': 'D', # this specifies the interval
'interval': 1, # defaults to 1, only necessary for other values
'backupCount': 30, # how many backup file to keep, 10 days
'formatter': 'standard',
}
Run Code Online (Sandbox Code Playgroud)
现在,我最终得到一个名为 logs_yyyyMMdd.logs 的文件,当我执行时:
celery -A project_name -b <broker_url> worker -l INFO --logfile logs20210526.logs -D
Run Code Online (Sandbox Code Playgroud)
我可以看到文件中的日志。我的问题是当日子改变时会发生什么?为什么 celery 在使用 -D 执行时不使用日志配置?
我让它工作如下。
我在settings.py中创建了一个函数
def config_logging():
timestamp = datetime.now().strftime('%Y%m%d')
filename = f"logs_{timestamp}.log"
log_file_path = join(LOGS_PATH, filename)
logging_level = "DEBUG" if env("DEBUG") else "INFO"
logging_config = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt': "%d/%b/%Y %H:%M:%S"
},
},
'handlers': {
'null': {
'level': logging_level,
'class': 'logging.NullHandler',
},
'logfile': {
'level': logging_level,
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': log_file_path,
'when': 'D', # this specifies the interval
'interval': 1, # defaults to 1, only necessary for other values
'backupCount': 30, # how many backup file to keep, 10 days
'formatter': 'standard',
},
'console': {
'level': logging_level,
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
},
'loggers': {
'django': {
'handlers': ['console'],
'propagate': True,
'level': "WARNING",
},
'django.db.backends': {
'handlers': ['console'],
'level': "INFO",
'propagate': False,
},
'celery': {
'handlers': ['console', 'logfile'],
'level': logging_level,
},
}
}
dictConfig(logging_config)
return filename, logging_config
log_filename, LOGGING = config_logging()
logger = logging.getLogger("celery")
Run Code Online (Sandbox Code Playgroud)
使用日志记录配置,然后在 celery.py 中我修改了代码:
@setup_logging.connect
def config_loggers(*args, **kwags):
config_logging()
logger = logging.getLogger("celery")
Run Code Online (Sandbox Code Playgroud)
现在,即使工作人员已分离,我也可以看到文件中的日志。
| 归档时间: |
|
| 查看次数: |
5224 次 |
| 最近记录: |