В любом случае изюминка этого совете, в этих двух строках:
sys.stdout = LogIO(self.logger, logging.INFO) sys.stderr = LogIO(self.logger, logging.ERROR)
Основная идея это переназначение sys.stdout и sys.stderr. Так как LogIO я не нашел, я восстановил его функциональность на свой лад. В итоге получился следующий небольшой класс:
class stream2file:
''' Stream wrapper for saving data in file'''
def __init__(self, filename='stream.data'):
self.fd = open(filename, 'a', 0)
def write(self, data):
d = data.rstrip()
if d == '': return
self.fd.write("%s\n" % d)
def close(self):
self.fd.close()Как видно из листинга, основная работу выполняет метод write, который записывает данные в файл. Использовать данный класс достаточно просто. На примере запуска web.py приложения в файле index.py:
...
if __name__ == "__main__":
import sys
# redirect stdout and stderr to file
sys.stdout = sys.stderr = stream2file(filename='webpysrv.log')
app = web.application(urls, globals())
app.run()Всю работу выполняет строка sys.stdout = sys.stderr = stream2file(filename='webpysrv.log'). После этого, все что попадает в stdout и stderr автоматически перенаправляется в файл webpysrv.log
Если в ходе отладки необходимо вывести отладочную информацию в лог файл, это можно сделать простым вызовом print в коде.
Вот так вот просто и wsgilog модуль не нужен.



Возможно, я что-то не понял, (что не удивительно :-) ) но проблемы стрима stdout и stderr в файл не стоит остро: ./app.sh 2>&1 >stdout.log.
ОтветитьУдалитьКстати, никто не запрещает перенаправлять любой write в файл если знашь номер дескриптора.
то что ты говоришь все правильно. вопрос возник, когда в stdout/stderr пишет не только твой код, но библиотеки которые ты используешь. Это как пример.
ОтветитьУдалитьМне просто стало интересно как реализовать эту функциональность средствами python. Оказалось не очень сложно.