From f32d84acb886edf48f9d1dc53daa8b00fd644554 Mon Sep 17 00:00:00 2001 From: Tomczak Date: Wed, 11 Jun 2025 10:39:29 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20Improved=20logging=20structure?= =?UTF-8?q?=20&=20efficiency=20=F0=9F=96=BC=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__pycache__/app.cpython-313.pyc | Bin 81908 -> 88085 bytes backend/app.py | 107 ++++++++++++++++++ backend/logs/app/app.log | 21 ++++ backend/logs/permissions/permissions.log | 2 + .../logs/printer_monitor/printer_monitor.log | 4 + backend/logs/scheduler/scheduler.log | 2 + backend/logs/security/security.log | 2 + backend/logs/startup/startup.log | 18 +++ .../logs/tapo_controller/tapo_controller.log | 2 + backend/logs/windows_fixes/windows_fixes.log | 8 ++ 10 files changed, 166 insertions(+) diff --git a/backend/__pycache__/app.cpython-313.pyc b/backend/__pycache__/app.cpython-313.pyc index 569bda09bc92a2e9ee865fb623c56a32b400cd62..9f834d8a6462bc9316b6f7984f7a0977df07ced3 100644 GIT binary patch delta 15236 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