1. # 通过配置Handler
    2. def get_logger():
    3. logger = logging.getLogger(__name__)
    4. formatter = logging.Formatter('%(asctime)s-%(lineno)d-%(module)s-%(message)s')
    5. logger.setLevel(level=logging.INFO)
    6. stream_handler = logging.StreamHandler()
    7. stream_handler.setFormatter(formatter)
    8. logger.addHandler(stream_handler)
    9. # FileHandler
    10. file_handler = logging.FileHandler('logs/serve.log')
    11. file_handler.setLevel(level=logging.INFO)
    12. file_handler.setFormatter(formatter)
    13. logger.addHandler(file_handler)
    14. # error
    15. error_handler = logging.FileHandler('logs/error.log')
    16. error_handler.setLevel(level=logging.ERROR)
    17. error_handler.setFormatter(formatter)
    18. logger.addHandler(error_handler)
    19. return logger
    • Logger:即 Logger Main Class,是我们进行日志记录时创建的对象,我们可以调用它的方法传入日志模板和信息,来生成一条条日志记录,称作 Log Record。
    • Log Record:就代指生成的一条条日志记录。
    • Handler:即用来处理日志记录的类,它可以将 Log Record 输出到我们指定的日志位置和存储形式等,如我们可以指定将日志通过 FTP 协议记录到远程的服务器上,Handler 就会帮我们完成这些事情。
    • Formatter:实际上生成的 Log Record 也是一个个对象,那么我们想要把它们保存成一条条我们想要的日志文本的话,就需要有一个格式化的过程,那么这个过程就由 Formatter 来完成,返回的就是日志字符串,然后传回给 Handler 来处理。
    • Filter:另外保存日志的时候我们可能不需要全部保存,我们可能只需要保存我们想要的部分就可以了,所以保存前还需要进行一下过滤,留下我们想要的日志,如只保存某个级别的日志,或只保存包含某个关键字的日志等,那么这个过滤过程就交给 Filter 来完成。
    • Parent Handler:Handler 之间可以存在分层关系,以使得不同 Handler 之间共享相同功能的代码。