Split large logs

This commit is contained in:
XSwankyS 2025-11-19 12:14:49 +05:00
parent 68be31efc4
commit 350850d23e

View File

@ -58,6 +58,7 @@ SSH_HOST = os.getenv("SSH_HOST") # ОБЯЗАТЕЛЬНО
SSH_USER = os.getenv("SSH_USER", "root") # опционально
SSH_PORT = os.getenv("SSH_PORT", "22") # строка, чтобы проще пихать в команду
MAX_DOC_BYTES = int(os.getenv("MAX_DOC_BYTES", str(45 * 1024 * 1024)))
# ---------------------------
# Утилиты
@ -253,16 +254,54 @@ async def logs_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
return
ts = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
fname = f"logs_{ctx_alias}_{ns}_{name}_{'prev' if previous else 'curr'}_{ts}.log"
base_fname = f"logs_{ctx_alias}_{ns}_{name}_{'prev' if previous else 'curr'}_{ts}"
buf = io.BytesIO(logs.encode("utf-8", errors="ignore"))
buf.name = fname
# кодируем один раз
data = logs.encode("utf-8", errors="ignore")
total_size = len(data)
await update.message.reply_document(
InputFile(buf, filename=fname),
caption=f"{kind}/{name}\npod={pod}\ncontext={ctx_full}\nprevious={previous}",
# Если влезает в один файл — шлём как раньше
if total_size <= MAX_DOC_BYTES:
fname = f"{base_fname}.log"
buf = io.BytesIO(data)
buf.name = fname
await update.message.reply_document(
InputFile(buf, filename=fname),
caption=f"{kind}/{name}\npod={pod}\ncontext={ctx_full}\nprevious={previous}",
)
return
# Слишком жирный лог — режем на части
num_parts = (total_size + MAX_DOC_BYTES - 1) // MAX_DOC_BYTES
await update.message.reply_text(
f"Лог {total_size} байт, делю на {num_parts} файлов по ~{MAX_DOC_BYTES} байт."
)
for idx in range(num_parts):
start = idx * MAX_DOC_BYTES
end = min(start + MAX_DOC_BYTES, total_size)
chunk = data[start:end]
part_no = idx + 1
fname = f"{base_fname}.part{part_no:02d}_of_{num_parts:02d}.log"
buf = io.BytesIO(chunk)
buf.name = fname
caption = (
f"{kind}/{name}\n"
f"pod={pod}\n"
f"context={ctx_full}\n"
f"previous={previous}\n"
f"part {part_no}/{num_parts}"
)
await update.message.reply_document(
InputFile(buf, filename=fname),
caption=caption,
)
async def start_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(