Мой вопрос такой же, как здесь:
Демон регистрации Python уничтожает дескриптор файла
но решение не работает для меня.
Задача
Я получаю OSError: [Errno 9] Bad file descriptor
ошибку из строки logger.info("some log")
, которая запускается в daemon.DaemonContext()
(из python-daemon)
Я убедился, что сохранил дескриптор файла logging.FileHandler
в процессе демона
app = App()
context = daemon.DaemonContext(
working_directory=PROCESS_HOME,
umask=0o002,
pidfile=pidfile,
stdout=sys.stdout, # <- only there for debugging
stdin=sys.stdin,
stderr=sys.stderr,
files_preserve=[app.logger_fh_.stream],
signal_map={
signal.SIGTERM: app.stop,
signal.SIGHUP: app.stop,
signal.SIGUSR1: app.refresh
}
)
# any calls to app.logger.info(...) work here
with context:
# now calls to app.logger.info(...) fail
app.start()
Где регистратор был настроен следующим образом
# inside App()
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh = logging.FileHandler(logging_path)
fh.setFormatter(formatter)
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
self.logger = logger
self.logger_fh_ = fh
EDIT
В документации написано
Элементы списка [т.е. files_preserve] - файловые дескрипторы (возвращаемые методом fileno () файлового объекта) или файловые объекты Python. Каждый из них указывает файл, который нельзя закрывать при запуске демона.
Итак, я добавил app.logger_fh_.stream.fileno()
. Проблема сохраняется, хотя
Спасибо за помощь