2017-01-06 2 views
0

В Linux существует программа торнадо python. Недавно я нашел ошибку (может быть, нет). Некоторая запись операции импорта будет восстановлена ​​в файл с именем «dagger.log».Запись в Python:

Из-за logging.handler.RotatingFileHandler, когда файл журнала имеет длину почти maxBytes, система будет последовательно создавать новые файлы с тем же именем, что и основной файл, но с расширениями «.1», «.2 "и т. д. прилагается к нему. Например, с backupCount из 8 и базовым именем файла «app.log» вы получите «dagger.log», «dagger.log.1», «dagger.log.2», ... до "dagger.log.8".

Но я обнаружил, что log file on Linux, picture

dagger.log. [1-8] и dagger.log были созданы в 13:11 4 января, dagger.log. [1-8] последний раз был изменен почти 13:31 4 января. Это было ненормально. Поскольку файл dagger.log не достиг максимального размера, dagger.log. [1-8] не следует создавать. Более того, каждый файл журнала отличается. у них нет такой же записи вообще.

Это смутило меня в течение длительного времени, я не могу это исправить. Может кто-то может мне помочь? Прости меня за мой ужасный английский. Я не знаю. Вы можете понять, в чем моя проблема?

+1

есть причина, почему вы должны обработать лог-файлы самостоятельно (например, работает в очень ограниченной среде)? если нет, то почему бы вам просто не написать stdout, запустить службу с помощью systemd или upstart или что-то еще, и позволить им обрабатывать записи журналов. альтернативно, вы можете просто создать файл конфигурации logrotate и позволить ему вращать ваши журналы. – grepe

+0

Большое спасибо за ваш совет ~ –

ответ

0

Вы используете несколько процессов (либо с tornado.process.fork_processes(8) или tornado.httpserver.HTTPServer.start(8)? Вход с несколькими процессами может быть сложнее. Раздвоенный процессы могут начать делиться и тот же файл журнала, а затем, когда приходит время, чтобы вращать каждый процесс будет вращаться независимо друг от друга, создавая 8 новых файлов.

Решение состоит в том, чтобы не настраивать ведение журнала до тех пор, пока вы не начнете дочерние процессы и не дадите каждому процессу собственное имя файла журнала (или, как предложено grepe, просто войдите в stdout/stderr и позвольте некоторым внешний процесс связан с файлами и вращением). Я рекомендую использовать для этого внешний диспетчер процессов и балансировщик нагрузки, но если вы все еще хотите разветвить дочерние процессы из вашего приложения Tornado, это будет выглядеть примерно так s (начиная от "advanced multi-process" варианта инициализации HTTPServer):

sockets = tornado.netutil.bind_sockets(8888) 
task_id = tornado.process.fork_processes(0) 
configure_logging('dagger%d.log' % task_id) 
server = HTTPServer(app) 
server.add_sockets(sockets) 
IOLoop.current().start() 
+0

Большое спасибо за ваш ответ. Я запускаю программу прослушивания на 8 портах. Поэтому, когда приходит время для поворота, каждый процесс будет вращаться независимо, создавая 8 новых файлов. Возможно, мне нужно самому обрабатывать файлы журнала. И теперь меня смутило то, что все журналы записываются в один журнал пять дней назад, но теперь журналы записываются в 8 разных файлов журналов. Обычно он должен быть записан в один файл. Это сложно. Возможно, это также связано с несколькими процессами. –

+0

lol ~ Я исправлю проблему. После перезапуска сервера все журналы записываются в один файл. –