v0.0.52: файловый лог /tmp/drhider.log (LOG_FILE env) — логи видны в поде через kubectl exec
Deploy drhider / validate (push) Canceled after 0s

This commit is contained in:
“Naeel”
2026-08-20 08:12:23 +03:00
parent 59a66278a3
commit 3ae7d325e2
2 changed files with 50 additions and 15 deletions
+24
View File
@@ -0,0 +1,24 @@
# 2026-08-20 — Файловый лог в поде (v0.0.52)
## Проблема
В v0.0.51 добавили логирование в stderr, но на платформе Штурвал
`kubectl logs` НЕ показывает stdout/stderr приложения (fd 1/2 python -> pipe,
который читает супервизор платформы, а не kubelet). Логи приложения недоступны.
## Решение
`setup_logging()` в site/app.py:
- логи в stderr (для локального запуска)
- + `FileHandler` в `/tmp/drhider.log` (путь через env `LOG_FILE`)
- уровень через env `LOG_LEVEL` (DEBUG/INFO/WARNING)
- root.handlers.clear() + свои handler'ы (не полагаемся на basicConfig)
- если файл не открылся — не падаем, пишем в stderr
## Как читать логи в поде
```
kubectl exec -n 20a75175-a58c-49cb-b8fa-e86367b1a8dc <pod> -c app -- cat /tmp/drhider.log
```
(или tail -f). Версия 0.0.52.
## Проверено локально
Файл /tmp/drhider.log создаётся, пишет "Logging configured, version=0.0.52"
и сообщения логгеров.
+26 -15
View File
@@ -21,27 +21,38 @@ if _sys_path_root not in sys.path:
sys.path.insert(0, _sys_path_root)
# Версия приложения (меняется при изменениях)
VERSION = "0.0.51"
VERSION = "0.0.52"
def setup_logging():
"""Настроить логирование. Уровень берётся из env LOG_LEVEL (DEBUG/INFO/WARNING)."""
"""Настроить логирование. Уровень из env LOG_LEVEL (DEBUG/INFO/WARNING).
Логи пишутся в stderr (для локального запуска) И в файл /tmp/drhider.log
(для кубера, где stdout/stderr контейнера может не попадать в kubectl logs).
Путь файла можно переопределить env LOG_FILE.
"""
level_name = os.environ.get("LOG_LEVEL", "INFO").upper()
level = getattr(logging, level_name, logging.INFO)
logging.basicConfig(
level=level,
format="%(asctime)s %(levelname)s [%(name)s] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
stream=sys.stderr,
force=True,
)
logging.getLogger("drhider").setLevel(level)
logging.getLogger("app").setLevel(level)
logging.getLogger("routes").setLevel(level)
logging.getLogger("session").setLevel(level)
logging.getLogger(__name__).setLevel(level)
log_file = os.environ.get("LOG_FILE", "/tmp/drhider.log")
fmt = logging.Formatter("%(asctime)s %(levelname)s [%(name)s] %(message)s", "%Y-%m-%d %H:%M:%S")
root = logging.getLogger()
root.setLevel(level)
root.handlers.clear()
sh = logging.StreamHandler(sys.stderr)
sh.setLevel(level)
sh.setFormatter(fmt)
root.addHandler(sh)
try:
fh = logging.FileHandler(log_file, encoding="utf-8")
fh.setLevel(level)
fh.setFormatter(fmt)
root.addHandler(fh)
except Exception as e: # файл не открылся — не падаем
sys.stderr.write(f"[app] cannot open log file {log_file}: {e}\n")
for name in ("drhider", "app", "routes", "session", __name__):
logging.getLogger(name).setLevel(level)
log = logging.getLogger("app")
log.info("Logging configured, level=%s, version=%s", level_name, VERSION)
log.info("Logging configured, level=%s, version=%s, file=%s", level_name, VERSION, log_file)
def create_app():