Автор оригинала: Mike Driscoll.
Сегодня я решил выяснить, как сделать Python Bog в файл и консоль одновременно. В большинстве случаев я просто хочу войти в файл, но иногда я тоже хочу видеть вещи на консоли, чтобы помочь с отладкой. Я нашел это Древный пример В документации Python и завершился, используя его, чтобы издеваться над следующим сценарием:
import logging #---------------------------------------------------------------------- def log(path, multipleLocs=False): """ Log to multiple locations if multipleLocs is True """ fmt_str = '%(asctime)s - %(name)s - %(message)s' formatter = logging.Formatter(fmt_str) logging.basicConfig(filename=path, level=logging.INFO, format=fmt_str) if multipleLocs: console = logging.StreamHandler() console.setLevel(logging.INFO) console.setFormatter(formatter) logging.getLogger("").addHandler(console) logging.info("This is an informational message") try: 1 / 0 except ZeroDivisionError: logging.exception("You can't do that!") logging.critical("THIS IS A SHOW STOPPER!!!") if __name__ == "__main__": log("sample.log") # log only to file log("sample2.log", multipleLocs=True) # log to file AND console!
Как вы можете видеть, когда вы передаете True To Verive Argum, скрипт создаст экземпляр StreamHandler () который вы можете настроить и добавлять в текущий регистратор через следующий вызов:
logging.getLogger("").addHandler(console)
Это отлично работает на Linux, но на Windows 7 образец2.log Не было создано, поэтому мне пришлось изменить заявление о если следующее:
if multipleLocs: console = logging.StreamHandler() console.setLevel(logging.INFO) console.setFormatter(formatter) fhandler = logging.FileHandler(path) fhandler.setFormatter(formatter) logging.getLogger("").addHandler(console) logging.getLogger("").addHandler(fhandler)
Теперь я должен отметить, что это приводит к тому, что это вызывает довольно странную ошибку в том, что Python каким-то образом отслеживает имена файлов, которые я пишу через вызовы в мою функцию журнала, так что, когда я скажу ему, чтобы написать в образец2.log, он пишешь на него плюс Оригинальный образец.log. Чтобы обойти это, мы должны создать экземпляр регистратора с уникальным именем каждый раз, когда мы называем сценарий. Вот обновленный пример, который работает правильно:
import logging import os #---------------------------------------------------------------------- def log(path, multipleLocs=False): """ Log to multiple locations if multipleLocs is True """ fname = os.path.splitext(path)[0] logger = logging.getLogger("Test_logger_%s" % fname) logger.setLevel(logging.INFO) fh = logging.FileHandler(path) formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s') fh.setFormatter(formatter) logger.addHandler(fh) if multipleLocs: console = logging.StreamHandler() console.setLevel(logging.INFO) console.setFormatter(formatter) logger.addHandler(console) logger.info("This is an informational message") try: 1 / 0 except ZeroDivisionError: logger.exception("You can't do that!") logger.critical("THIS IS A SHOW STOPPER!!!") if __name__ == "__main__": log("sample.log") # log only to file log("sample2.log", multipleLocs=True) # log to file AND console!
Вы отметите, что на этот раз мы основываем имя регистратора в имени файла журнала. Модуль ведения журнала довольно симпатичный и очень весело играть с. Я надеюсь, что вы нашли это как интересно, как я.