Partial File Logging
This commit is contained in:
57
app.py
57
app.py
@@ -21,6 +21,7 @@ import pymysql
|
|||||||
import json
|
import json
|
||||||
import psutil
|
import psutil
|
||||||
import platform
|
import platform
|
||||||
|
import logging
|
||||||
|
|
||||||
# =====================
|
# =====================
|
||||||
# ENV + VALIDATION
|
# ENV + VALIDATION
|
||||||
@@ -89,6 +90,11 @@ LOCAL_TZ = pytz.timezone(get_env_var("LOCAL_TZ", str, required=False) or "Americ
|
|||||||
ENV_FILE = ".env"
|
ENV_FILE = ".env"
|
||||||
DEFAULT_ENV_FILE = ".env.example"
|
DEFAULT_ENV_FILE = ".env.example"
|
||||||
BACKUP_DIR = Path("backups")
|
BACKUP_DIR = Path("backups")
|
||||||
|
LOG_DIR = Path("logs")
|
||||||
|
LOG_DIR.mkdir(exist_ok=True)
|
||||||
|
LATEST_LOG = LOG_DIR / "latest.log"
|
||||||
|
ARCHIVE_DIR = LOG_DIR / "archives"
|
||||||
|
ARCHIVE_DIR.mkdir(exist_ok=True)
|
||||||
|
|
||||||
BOT_VERSION = "1.0.9"
|
BOT_VERSION = "1.0.9"
|
||||||
VERSION_URL = "https://raw.githubusercontent.com/PenguCCN/Jellycord/main/version.txt"
|
VERSION_URL = "https://raw.githubusercontent.com/PenguCCN/Jellycord/main/version.txt"
|
||||||
@@ -254,6 +260,14 @@ def init_trial_accounts_table():
|
|||||||
cur.close()
|
cur.close()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.INFO,
|
||||||
|
format="%(asctime)s [%(levelname)s] %(message)s",
|
||||||
|
handlers=[
|
||||||
|
logging.FileHandler(LATEST_LOG, encoding="utf-8"),
|
||||||
|
logging.StreamHandler()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def get_accounts():
|
def get_accounts():
|
||||||
conn = mysql.connector.connect(
|
conn = mysql.connector.connect(
|
||||||
@@ -2648,6 +2662,49 @@ async def cleanup_task():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[Cleanup] Failed to send removed message to sync channel: {e}")
|
print(f"[Cleanup] Failed to send removed message to sync channel: {e}")
|
||||||
|
|
||||||
|
@tasks.loop(hours=24)
|
||||||
|
async def rotate_logs():
|
||||||
|
try:
|
||||||
|
now = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
||||||
|
|
||||||
|
# =====================
|
||||||
|
# 1. Ensure latest.log exists
|
||||||
|
# =====================
|
||||||
|
if not LATEST_LOG.exists():
|
||||||
|
LATEST_LOG.touch()
|
||||||
|
|
||||||
|
# =====================
|
||||||
|
# 2. Archive the latest.log
|
||||||
|
# =====================
|
||||||
|
archive_name = ARCHIVE_DIR / f"log_{now}.zip"
|
||||||
|
|
||||||
|
with zipfile.ZipFile(archive_name, "w", zipfile.ZIP_DEFLATED) as zipf:
|
||||||
|
zipf.write(LATEST_LOG, arcname="latest.log")
|
||||||
|
|
||||||
|
print(f"[LOG ROTATE] Archived log to: {archive_name}")
|
||||||
|
|
||||||
|
# =====================
|
||||||
|
# 3. Delete oldest archives if more than 4 exist
|
||||||
|
# =====================
|
||||||
|
archives = sorted(ARCHIVE_DIR.glob("*.zip"), key=os.path.getmtime)
|
||||||
|
|
||||||
|
if len(archives) > 4:
|
||||||
|
to_delete = archives[: len(archives) - 4]
|
||||||
|
for old in to_delete:
|
||||||
|
old.unlink()
|
||||||
|
print(f"[LOG ROTATE] Deleted old archive: {old}")
|
||||||
|
|
||||||
|
# =====================
|
||||||
|
# 4. Clear latest.log for new logs
|
||||||
|
# =====================
|
||||||
|
with open(LATEST_LOG, "w", encoding="utf-8"):
|
||||||
|
pass
|
||||||
|
|
||||||
|
print("[LOG ROTATE] Reset latest.log")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[ERROR] Log rotation failed: {e}")
|
||||||
|
|
||||||
@tasks.loop(seconds=15)
|
@tasks.loop(seconds=15)
|
||||||
async def periodic_post_task():
|
async def periodic_post_task():
|
||||||
if not TRACKING_ENABLED:
|
if not TRACKING_ENABLED:
|
||||||
|
|||||||
Reference in New Issue
Block a user