v0.0.52: файловый лог /tmp/drhider.log (LOG_FILE env) — логи видны в поде через kubectl exec
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
@@ -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
@@ -21,27 +21,38 @@ if _sys_path_root not in sys.path:
|
|||||||
sys.path.insert(0, _sys_path_root)
|
sys.path.insert(0, _sys_path_root)
|
||||||
|
|
||||||
# Версия приложения (меняется при изменениях)
|
# Версия приложения (меняется при изменениях)
|
||||||
VERSION = "0.0.51"
|
VERSION = "0.0.52"
|
||||||
|
|
||||||
|
|
||||||
def setup_logging():
|
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_name = os.environ.get("LOG_LEVEL", "INFO").upper()
|
||||||
level = getattr(logging, level_name, logging.INFO)
|
level = getattr(logging, level_name, logging.INFO)
|
||||||
logging.basicConfig(
|
log_file = os.environ.get("LOG_FILE", "/tmp/drhider.log")
|
||||||
level=level,
|
fmt = logging.Formatter("%(asctime)s %(levelname)s [%(name)s] %(message)s", "%Y-%m-%d %H:%M:%S")
|
||||||
format="%(asctime)s %(levelname)s [%(name)s] %(message)s",
|
root = logging.getLogger()
|
||||||
datefmt="%Y-%m-%d %H:%M:%S",
|
root.setLevel(level)
|
||||||
stream=sys.stderr,
|
root.handlers.clear()
|
||||||
force=True,
|
sh = logging.StreamHandler(sys.stderr)
|
||||||
)
|
sh.setLevel(level)
|
||||||
logging.getLogger("drhider").setLevel(level)
|
sh.setFormatter(fmt)
|
||||||
logging.getLogger("app").setLevel(level)
|
root.addHandler(sh)
|
||||||
logging.getLogger("routes").setLevel(level)
|
try:
|
||||||
logging.getLogger("session").setLevel(level)
|
fh = logging.FileHandler(log_file, encoding="utf-8")
|
||||||
logging.getLogger(__name__).setLevel(level)
|
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 = 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():
|
def create_app():
|
||||||
|
|||||||
Reference in New Issue
Block a user