zoukankan      html  css  js  c++  java
  • Python logging模块

    Good logging practice in Python

    这篇介绍地不错,由浅入深

    http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python

    There are different handlers, you can also send records to you mailbox or even a to a remote server. You can also write your own custom logging handler. I’m not going to tell you details, please reference to official documents: Basic TutorialAdvanced Tutorial and Logging Cookbook.

    通过配置设置日志格式

    import logging
    import logging.config
    
    logging.config.fileConfig('logging.conf')
    
    # create logger
    logger = logging.getLogger('simpleExample')
    
    # 'application' code
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    

      

    配置文件:

    [loggers]
    keys=root,simpleExample
    
    [handlers]
    keys=consoleHandler
    
    [formatters]
    keys=simpleFormatter
    
    [logger_root]
    level=DEBUG
    handlers=consoleHandler
    
    [logger_simpleExample]
    level=DEBUG
    handlers=consoleHandler
    qualname=simpleExample
    propagate=0
    
    [handler_consoleHandler]
    class=StreamHandler
    level=DEBUG
    formatter=simpleFormatter
    args=(sys.stdout,)
    
    [formatter_simpleFormatter]
    format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
    datefmt=
    

    Use _name_ as the logger name

    根据调用的模块生成相关日志,日志中记录调用的模块名称

    guosongdeMacBook-Air:20150114 guosong$ tree |grep -v pyc
    .
    ├── main.py
    ├── test
    │   ├── __init__.py
    │   ├── test.py
    └── test.test
    
    1 directory, 6 files
    guosongdeMacBook-Air:20150114 guosong$ ./main.py
    guosongdeMacBook-Air:20150114 guosong$ ll
    total 16
    -rwxr-xr-x  1 guosong  staff   136B  1 14 11:48 main.py
    drwxr-xr-x  6 guosong  staff   204B  1 14 11:51 test
    -rw-r--r--  1 guosong  staff   336B  1 14 11:53 test.test
    guosongdeMacBook-Air:20150114 guosong$ more test.test
    2015-01-14 11:51:26,373 - test.test - INFO - Hello baby
    2015-01-14 11:51:26,374 - test.test - INFO - Hello baby
    2015-01-14 11:51:26,374 - test.test - INFO - Hello baby
    2015-01-14 11:53:09,950 - test.test - INFO - Hello baby
    2015-01-14 11:53:09,951 - test.test - INFO - Hello baby
    2015-01-14 11:53:09,951 - test.test - INFO - Hello baby
    

      

      

      

    http://blog.donews.com/limodou/archive/2005/02/16/278699.aspx

     1 #!/usr/bin/env python
     2 
     3 import logging
     4 
     5 logfile="./log.file"
     6 
     7 def initlog():
     8         logger=logging.getLogger()
     9         hdlr=logging.FileHandler(logfile)
    10 
    11         formatter=logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    12         hdlr.setFormatter(formatter)
    13         logger.addHandler(hdlr)
    14         logger.setLevel(logging.NOTSET)
    15 
    16         return logger
    17 
    18 def main():
    19         logger=initlog()
    20 
    21         message="error"
    22         logger.error(message)
    23 
    24         message="info"
    25         logger.info(message)
    26 
    27 if __name__ == "__main__":
    28         main()

    第8行生成一个日志对象,可以带一个名字,可以缺省。
    第9行生成一个Handler。logging支持许多Handler,象FileHandler, SocketHandler, SMTPHandler等,我由于要写文件就使用了FileHandler。logfile是一个全局变量,它就是一个文件名,如:’crawl.log’。
    第11行生成一个格式器,用于规范日志的输出格式。如果没有这行代码,那么缺省的格式就是:”%(message)s”。也就是写日志时,信息是什么日志中就是什么,没有日期,没有信息级别等信息。logging支持许多种替换值,详细请看Formatter的文档说明。这里有三项:时间,信息级别,日志信息。
    第12行将格式器设置到处理器上。
    第13行将处理器加到日志对象上。
    第14行设置日志信息输出的级别。logging提供多种级别的日志信息,如:NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL等。每个级别都对应一个数值。如果不执行此句,缺省为30(WARNING)。可以执行:logging.getLevelName(logger.getEffectiveLevel())来查看缺省的日志级别。日志对象对于不同的级别信息提供不同的函数进行输出,如:info(), error(), debug()等。当写入日志时,小于指定级别的信息将被忽略。因此为了输出想要的日志级别一定要设置好此参数。这里我设为NOTSET(值为0),也就是想输出所有信息。

    getLogger两个方法:

    1、getLogger(name=None)

    Return a logger with the specified name, creating it if necessary.
    If no name is specified, return the root logger.

    2、getLogger(self, name)

    | Get a logger with the specified name (channel name), creating it
    | if it doesn't yet exist. This name is a dot-separated hierarchical
    | name, such as "a", "a.b", "a.b.c" or similar.
    |
    | If a PlaceHolder existed for the specified name [i.e. the logger
    | didn't exist but a child of it did], replace it with the created
    | logger and fix up the parent/child references which pointed to the
    | placeholder to now point to the logger.

    封装的日志:

    #!/usr/bin/python26
    #-*- coding:utf8 -*-
    
    import os
    import sys
    import logging
    import logging.handlers
    
    #解决路径问题 os.chdir(sys.path[0])
    class Logger(object): def __init__(self,log_dir,log_level,logger_name): if not os.path.exists(log_dir): os.mkdir(log_dir) self.__log_filename = log_dir + logger_name + ".log" self.__logger = logging.getLogger(logger_name) self.__logger.setLevel(log_level) handler = logging.handlers.RotatingFileHandler(self.__log_filename,maxBytes=10000,backupCount=0) formatter = logging.Formatter("%(asctime)s - [%(levelname)s] [%(name)s/%(filename)s %(lineno)d] - %(message)s") handler.setFormatter(formatter) self.__logger.addHandler(handler) def debug(self,message): self.__logger.debug(message) def error(self,message): self.__logger.error(message) def info(self,message): self.__logger.info(message) def main(): logger = Logger("../log/",logging.DEBUG,"test") logger.debug("Test") if __name__ == '__main__': main()
  • 相关阅读:
    5 粘包现象与解决方案
    4 Socket代码实例
    协程与多路io复用epool关系
    基于selector的socket并发
    基于select类型多路IO复用,实现简单socket并发
    协程实现多并发socket,跟NGINX一样
    利用协程实现简单爬虫
    协程
    进程池pool
    进程锁 Lock
  • 原文地址:https://www.cnblogs.com/gsblog/p/3309819.html
Copyright © 2011-2022 走看看