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_USER = os.getenv("SSH_USER", "root") # опционально
|
||||||
SSH_PORT = os.getenv("SSH_PORT", "22") # строка, чтобы проще пихать в команду
|
SSH_PORT = os.getenv("SSH_PORT", "22") # строка, чтобы проще пихать в команду
|
||||||
|
|
||||||
|
MAX_DOC_BYTES = int(os.getenv("MAX_DOC_BYTES", str(45 * 1024 * 1024)))
|
||||||
|
|
||||||
# ---------------------------
|
# ---------------------------
|
||||||
# Утилиты
|
# Утилиты
|
||||||
@ -253,15 +254,53 @@ async def logs_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
return
|
return
|
||||||
|
|
||||||
ts = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
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"))
|
# кодируем один раз
|
||||||
|
data = logs.encode("utf-8", errors="ignore")
|
||||||
|
total_size = len(data)
|
||||||
|
|
||||||
|
# Если влезает в один файл — шлём как раньше
|
||||||
|
if total_size <= MAX_DOC_BYTES:
|
||||||
|
fname = f"{base_fname}.log"
|
||||||
|
buf = io.BytesIO(data)
|
||||||
buf.name = fname
|
buf.name = fname
|
||||||
|
|
||||||
await update.message.reply_document(
|
await update.message.reply_document(
|
||||||
InputFile(buf, filename=fname),
|
InputFile(buf, filename=fname),
|
||||||
caption=f"{kind}/{name}\npod={pod}\ncontext={ctx_full}\nprevious={previous}",
|
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):
|
async def start_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user