feat(logs): раздел «Логи» — хвост и свой grep (#16)
CI / ruff · mypy · pytest (pull_request) Successful in 9m40s
CI / ruff · mypy · pytest (pull_request) Successful in 9m40s
- app/logs/grep.py: подмножество grep (шаблон, -i -v -E -c -C N), разбор shlex без исполнения, BRE → regex, таймаут на строку и бюджет на поиск, лимиты 200 символов / 500 строк вывода - app/logs/journal.py: каждый поиск в log_queries (L-6) - бот: выбор контейнера, хвост 50/200 строк или 5 мин/1 ч/24 ч, свой grep по 24 ч, длинный результат — файлом .log (L-5) - логи Docker: не больше 50 000 строк и 5 МБ, сохраняются новейшие - fix: кнопки меню и /menu, /help больше не проглатываются шагами ввода (имя файла, содержимое, сообщение коммита, grep) — фильтр free_input Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -97,7 +97,8 @@ class FakeDocker:
|
||||
return httpx.Response(200, json=self._stats(c))
|
||||
case "logs":
|
||||
since = datetime.fromtimestamp(int(q.get("since", "0")), UTC)
|
||||
body = b"".join(frame(line + "\n", 2 if "ERR" in line else 1) for at, line in c.logs if at >= since)
|
||||
picked = [line for at, line in c.logs if at >= since][-int(q.get("tail", "1000000")) :]
|
||||
body = b"".join(frame(line + "\n", 2 if "ERR" in line else 1) for line in picked)
|
||||
return httpx.Response(200, content=body)
|
||||
return httpx.Response(404, json={"message": "No such container"})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user