python-log
logging
参考:
http://blog.csdn.net/zyz511919766/article/details/25136485/
https://docs.python.org/3/library/logging.html#logger-objects
http://blog.csdn.net/yatere/article/details/6655445
使用和基本配置
日志级别等级:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
默认等级设置为:WARNING
import logging  
logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                    datefmt='%a, %d %b %Y %H:%M:%S',  
                    filename='/tmp/test.log',  
                    filemode='w')  
  
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message') 
再fomat中的格式化字符串
format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息
进一步了解
记录信息:logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()
logging.basicConfig()使用默认的日志格式,Formatter建立一个StreamHandler,并加到root logger中
logging.getLogger([name])如果没指定名字,返回root logger
#coding:utf-8  
import logging  
  
# 创建一个logger    
logger = logging.getLogger()  
  
logger1 = logging.getLogger('mylogger')  
logger1.setLevel(logging.DEBUG)  
  
logger2 = logging.getLogger('mylogger')  
logger2.setLevel(logging.INFO)  
  
logger3 = logging.getLogger('mylogger.child1')  
logger3.setLevel(logging.WARNING)  
  
logger4 = logging.getLogger('mylogger.child1.child2')  
logger4.setLevel(logging.DEBUG)  
  
logger5 = logging.getLogger('mylogger.child1.child2.child3')  
logger5.setLevel(logging.DEBUG)  
  
# 创建一个handler,用于写入日志文件    
fh = logging.FileHandler('/tmp/test.log')  
  
# 再创建一个handler,用于输出到控制台    
ch = logging.StreamHandler()  
  
# 定义handler的输出格式formatter    
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
fh.setFormatter(formatter)  
ch.setFormatter(formatter)  
  
#定义一个filter  
#filter = logging.Filter('mylogger.child1.child2')  
#fh.addFilter(filter)    
  
# 给logger添加handler    
#logger.addFilter(filter)  
logger.addHandler(fh)  
logger.addHandler(ch)  
  
#logger1.addFilter(filter)  
logger1.addHandler(fh)  
logger1.addHandler(ch)  
  
logger2.addHandler(fh)  
logger2.addHandler(ch)  
  
#logger3.addFilter(filter)  
logger3.addHandler(fh)  
logger3.addHandler(ch)  
  
#logger4.addFilter(filter)  
logger4.addHandler(fh)  
logger4.addHandler(ch)  
  
logger5.addHandler(fh)  
logger5.addHandler(ch)  
  
# 记录一条日志    
logger.debug('logger debug message')  
logger.info('logger info message')  
logger.warning('logger warning message')  
logger.error('logger error message')  
logger.critical('logger critical message')  
  
logger1.debug('logger1 debug message')  
logger1.info('logger1 info message')  
logger1.warning('logger1 warning message')  
logger1.error('logger1 error message')  
logger1.critical('logger1 critical message')  
  
logger2.debug('logger2 debug message')  
logger2.info('logger2 info message')  
logger2.warning('logger2 warning message')  
logger2.error('logger2 error message')  
logger2.critical('logger2 critical message')  
  
logger3.debug('logger3 debug message')  
logger3.info('logger3 info message')  
logger3.warning('logger3 warning message')  
logger3.error('logger3 error message')  
logger3.critical('logger3 critical message')  
  
logger4.debug('logger4 debug message')  
logger4.info('logger4 info message')  
logger4.warning('logger4 warning message')  
logger4.error('logger4 error message')  
logger4.critical('logger4 critical message')  
  
logger5.debug('logger5 debug message')  
logger5.info('logger5 info message')  
logger5.warning('logger5 warning message')  
logger5.error('logger5 error message')  
logger5.critical('logger5 critical message')  
提供的几个组件:
- Logger:提供应用程序可直接使用的接口
- Handler:发送日志到适当的目的地
- Filter:提供了过滤日志信息的方法
- Formatter:指定日志显示格式
Logger
树形层级结构
可以使用Logger.setLevel(lel)设置级别:logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL
使用Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()输出日志
只有日志等级大于或等于设置的日志级别的日志才会被输出
孩子输出的结果会被父亲再次处理
孩子,孙子,重孙……可逐层继承来自祖先的日志级别、Handler、Filter设置,
也可以通过Logger.setLevel(lel)、Logger.addHandler(hdlr)、Logger.removeHandler(hdlr)、Logger.addFilter(filt)、Logger.removeFilter(filt)。
设置自己特别的日志级别、Handler、Filter。若不设置则使用继承来的值。
注释掉#logger.addHandler(fh)之后,标准输出有两行,文件有一行,因为默认的root Logger使用的是StreamHandler
Handler
使用了两种
fh = logging.FileHandler('/tmp/test.log')   
ch = logging.StreamHandler()  
handler负责发送相关信息到目的地,常用方法:
Handler.setLevel(lel):指定日志级别,低于lel级别的日志将被忽略
Handler.setFormatter():给这个handler选择一个Formatter
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
可通过addHandler()向Logger添加多个Handler
logger.addHandler(fh)  
logger.addHandler(ch)  
有很多可以使用的
logging.StreamHandler
logging.FileHandler
logging.handlers.RotatingFileHandler            #大小分割  
logging.handlers.TimedRotatingFileHandle        #时间分割
logging.handlers.SocketHandler  
logging.handlers.DatagramHandler
logging.handlers.SysLogHandler
logging.handlers.SMTPHandler 
logging.handlers.MemoryHandler
logging.handlers.HTTPHandler 
Formatter
设置最后的规则,结构
#定义Formatter  
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
#为Handler添加Formatter  
fh.setFormatter(formatter)  
ch.setFormatter(formatter)  
Filter
filter = logging.Filter('mylogger.child1.child2')  
fh.addFilter(filter)    
这样设置,只有带mylogger.child1.child2字符串的内容才能输出
写入配置文件
[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=  
程序这么写
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")  
多模块使用logging
在同一个python解释器内,多次调用logging.getLogger('log_name')返回同一个logger实例
可以在main中配置,然后其他模块中只是调用getLogger,这样获得的是同一个对象
import logging    
import logging.config    
    
logging.config.fileConfig('logging.conf')    
root_logger = logging.getLogger('root')    
root_logger.debug('test root logger...')    
    
logger = logging.getLogger('main')    
logger.info('test main logger')    
logger.info('start import module \'mod\'...')    
import mod    
    
logger.debug('let\'s test mod.testLogger()')    
mod.testLogger()    
    
root_logger.info('finish test...')  
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号