В чем может быть причина того, что приложение не создает log-файлы, хотя свободное место на диске есть?

«В чем может быть причина того, что приложение не создает log-файлы, хотя свободное место на диске есть?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В практике DevOps мы сталкиваемся с несколькими типовыми причинами, помимо нехватки места:

  1. Исчерпание лимита inode (df -i): Файловая система хранит метаданные о каждом файле (inode). Если inode закончились, создать новый файл (в том числе лог) невозможно, даже при свободном гигабайтах. Частая проблема для файловых систем, созданных с малым количеством inode, или в директориях с миллионами мелких файлов.

  2. Нет прав на запись: Процесс приложения (и его пользователь, например, appuser) должен иметь права rw на целевую директорию и право на создание файлов (wx).

    # Проверка
    $ namei -l /var/log/myapp/
    $ sudo -u appuser touch /var/log/myapp/test.log
  3. Некорректный путь или конфигурация логгера: Опечатка в пути в конфиге приложения (например, /va/log/myapp вместо /var/log/myapp) или отключенный appender в настройках (logback.xml, log4j2.properties).

  4. Жесткая ссылка (hard link) или точка монтирования: Целевой путь может быть жесткой ссылкой, ведущей в никуда, или точкой монтирования, которая не была смонтирована (например, отдельный volume для логов в Docker/K8s).

    $ ls -la /var/log/myapp  # Проверить, не является ли это ссылкой
    $ mount | grep /var/log/myapp # Проверить монтирование
  5. Сессия или демон не перезапущен: Приложение могло закэшировать старую конфигурацию логирования. После изменения конфига необходим graceful restart (например, systemctl reload myapp или kill -HUP <PID>).

Подход к диагностике: Я начинаю с проверки прав и inode, затем смотрю логи системного демона (journalctl) или stdout/stderr контейнера (docker logs, kubectl logs), чтобы увидеть ошибки инициализации логгера. Далее проверяю актуальность конфигурации и перезапускаю сервис.