теперь логируется
All checks were successful
Deploy timelaps / deploy (push) Successful in 5s

This commit is contained in:
ack
2026-04-19 19:49:36 +03:00
parent 4a10958445
commit a8be932210
3 changed files with 57 additions and 4 deletions

View File

@@ -1,9 +1,12 @@
import logging
import time import time
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from ...services.timelapse_worker import run_one_job from ...services.timelapse_worker import run_one_job
logger = logging.getLogger('camlaps')
class Command(BaseCommand): class Command(BaseCommand):
help = 'Запуск обработчика очереди таймлапсов.' help = 'Запуск обработчика очереди таймлапсов.'
@@ -18,14 +21,24 @@ class Command(BaseCommand):
) )
def handle(self, *args, **options): def handle(self, *args, **options):
logger.info('worker_cmd:handle:start')
once = options['once'] once = options['once']
sleep_seconds = options['sleep'] sleep_seconds = options['sleep']
if once: if once:
run_one_job() try:
run_one_job()
logger.info('worker_cmd:handle:done mode=once')
except Exception:
logger.exception('worker_cmd:handle:error mode=once')
raise
return return
while True: while True:
processed = run_one_job() try:
if not processed: processed = run_one_job()
time.sleep(sleep_seconds) if not processed:
time.sleep(sleep_seconds)
except Exception:
logger.exception('worker_cmd:handle:error mode=loop')
raise

View File

@@ -1,3 +1,4 @@
import logging
import subprocess import subprocess
import sys import sys
@@ -16,6 +17,8 @@ from .services.cameras import (
list_active_cameras, list_active_cameras,
) )
logger = logging.getLogger('camlaps')
def index(request): def index(request):
cameras = list_active_cameras() cameras = list_active_cameras()
@@ -66,8 +69,11 @@ def job_list(request):
@require_POST @require_POST
def start_queue(request): def start_queue(request):
logger.info('queue:start_request:start')
has_planned = TimelapseJob.objects.filter(status=TimelapseJob.Status.PLANNED).exists() has_planned = TimelapseJob.objects.filter(status=TimelapseJob.Status.PLANNED).exists()
if not has_planned: if not has_planned:
logger.info('queue:start_request:done no_planned_jobs=true')
return redirect(f"{reverse('camlaps:job_list')}?started=none") return redirect(f"{reverse('camlaps:job_list')}?started=none")
cmd = [sys.executable, 'manage.py', 'run_timelapse_worker', '--once'] cmd = [sys.executable, 'manage.py', 'run_timelapse_worker', '--once']
@@ -83,8 +89,10 @@ def start_queue(request):
try: try:
subprocess.Popen(cmd, **kwargs) subprocess.Popen(cmd, **kwargs)
logger.info('queue:start_request:done worker_started=true')
return redirect(f"{reverse('camlaps:job_list')}?started=worker") return redirect(f"{reverse('camlaps:job_list')}?started=worker")
except Exception: except Exception:
logger.exception('queue:start_request:error')
return redirect(f"{reverse('camlaps:job_list')}?started=error") return redirect(f"{reverse('camlaps:job_list')}?started=error")

View File

@@ -143,3 +143,35 @@ USE_TZ = True
# https://docs.djangoproject.com/en/6.0/howto/static-files/ # https://docs.djangoproject.com/en/6.0/howto/static-files/
STATIC_URL = 'static/' STATIC_URL = 'static/'
LOG_DIR = BASE_DIR / 'logs'
LOG_DIR.mkdir(parents=True, exist_ok=True)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(asctime)s | %(levelname)s | %(name)s | %(message)s',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'standard',
},
'camlaps_file': {
'class': 'logging.FileHandler',
'filename': str(LOG_DIR / 'camlaps.log'),
'formatter': 'standard',
'encoding': 'utf-8',
},
},
'loggers': {
'camlaps': {
'handlers': ['console', 'camlaps_file'],
'level': 'INFO',
'propagate': False,
},
},
}