Split large logs
This commit is contained in:
parent
68be31efc4
commit
350850d23e
@ -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(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user