I have running django-specific scheduler: django-apscheduler and it works fine as scheduler, it starts needed job as required, but i have problem with logging inside called function by scheduler.
Logger created with no errors reported, with name as defined in settings.py, but looks strange, has some few atributes, has level = 0, and do nothing with logging commands.
Part of settings.py
LOGGING = {
"version": 1, # the dictConfig format version
"disable_existing_loggers": False, # retain the default loggers
"handlers": {
"debug_file": {
"class": "logging.FileHandler",
"filename": BASE_DIR / "main/logs/debug.log",
"level": "DEBUG",
"formatter": "verbose",
},
"error_file": {
"class": "logging.FileHandler",
"filename": BASE_DIR / "main/logs/errors.log",
"level": "ERROR",
"formatter": "verbose",
},
"cron_file": {
"class": "logging.FileHandler",
"filename": BASE_DIR / "main/logs/cron.log",
"level": "DEBUG",
"formatter": "verbose",
},
},
"loggers": {
"main.payment_callback": {
"level": "DEBUG",
"handlers": ["debug_file", "error_file"],
"propagate": True,
"cron": {
"level": "DEBUG",
"handlers": ["cron_file"],
"propagate": True,
},
},
},
"formatters": {
"verbose": {
"format": "{name} {levelname} {asctime} {module} {message}",
"style": "{",
},
"simple": {
"format": "{levelname} {message}",
"style": "{",
},
},
}
Part of scheduler.py using to add a job:
import logging
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ProcessPoolExecutor, ThreadPoolExecutor
from django_apscheduler.jobstores import register_events, register_job
from django.conf import settings
from .cron import manager_subscribtion_updater
# Create scheduler to run in a thread inside the application process
scheduler = BackgroundScheduler(settings.SCHEDULER_CONFIG)
def start():
if settings.DEBUG:
# Hook into the apscheduler logger
logging.basicConfig()
logging.getLogger('apscheduler').setLevel(logging.DEBUG)
try:
scheduler.add_job(manager_subscribtion_updater, "cron", id="manager_subscribtion_updater", day_of_week='0-6', hour=14, minute=51, misfire_grace_time=3, replace_existing=True)
except Exception as e:
print(e)
# Add the scheduled jobs to the Django admin interface
register_events(scheduler)
scheduler.start()
Part of called function manager_subscribtion_updater.py
import logging
from datetime import timedelta, datetime, tzinfo, timezone, date, time
from django.core.exceptions import ObjectDoesNotExist
from .models import (
Subscription,
UserPaymentMetod,
SubscriptionStatus
)
from .payments import autopayment_manager, new_guaranty_subscribtion_workflow
logger = logging.getLogger('cron')
def manager_subscribtion_updater():
""" Describtion
"""
logger.debug('Starting manager_subscribtion_updater')
In this function, object of logger ‘cron’ is some semi-empty, and does not work.
Can’t get it out, what to do with this logger?
Dmitry is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.