可用的日志级别:
logging默认参数:
简单使用:
import logging
logging.info(‘info level‘)
修改logging模块的默认日志格式。
filename - 指定日志的存储位置。
filemode - 指定文件打开模式。默认‘a‘
format - 定义日志的格式。
datafmt - 指定日期格式。
level - 定义日志级别,写级别对应的数字。
%(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:用户输出的消息
import logging
logging.basicConfig(
filename=‘test.log‘
format=‘%(asctime)s - %(name)s - - %(levelname)s -%(module)s: %(message)s‘,
level=30,
datefmt=‘%Y-%m-%D %X‘
)
logging.error(‘error level‘)
定义不同的日志格式对象,然后绑定给不同的Handler。以此来控制不同Handler的日志格式。
负责接收日志并控制打印到不同地方。一个Handler对象可以绑定一种日志格式。
FileHandler - 打印到文件。
StreamHandler - 打印到终端。
负责产生日志的对象,getLogger()方法实例化后的对象。对应日志的masage字段。
负责过滤日志的对象。目测没啥用
import logging
#logger对象,负责产生日志信息
logger = logger.getLogger(‘root‘)
#filter对象,没用
#Handler对象:接受log传来的日志内容,控制打印到终端or文件。
Handler1 = logging.FileHandler(‘tset1.log‘)
Handler2 = logging.StreamHandler()
#formatter对象
formatter1 = logging.Formatter(‘%(asctime)s - %(name)s - - %(levelname)s -%(module)s: %(message)s‘,
datafmt=‘%Y-%m-%d %H:%M:%S‘,)
formatter2 = logging.Formatter(‘%(asctime)s %(name)s %(message)s‘,)
#把日志格式绑定到不同输出对象。
Handler1.setFormatter(formatter1)
Handler2.setFormatter(formatter2)
#设置日志输出级别
Handler1.setLevel(10)
#设置日志产生的级别
logger.setLevel(10)
#把日志信息绑定到Handler来输出。
logger.addHandler(Handler1)
#测试。
logger.info(‘info level‘)
logger是第一级别过滤,然后日志才会到Handler,需给logger和Handler同时设置level,但要注意:
在所有logger传的日志都要输出时,必须有如下的要求:
内容级别 >= logger对象的日志级别必须 >= Handler对象的日志级别。
import logging
formatter=logging.Formatter(‘%(asctime)s - %(name)s -%(module)s: %(message)s‘,)
inherit=logging.StreamHandler()
inherit.setFormatter(formatter)
logger1=logging.getLogger(‘root‘)
logger2=logging.getLogger(‘root.child1‘)
logger1.addHandler(inherit)
logger2.addHandler(inherit)
logger1.setLevel(10)
logger2.setLevel(10)
logger1.debug(‘log1 debug‘)
logger2.debug(‘log2 debug‘)
"logging配置"
import os,logging.config
#先定义两种日志输出格式
standard_format = ‘[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]‘ ‘[%(levelname)s][%(message)s]‘ #其中name为getlogger指定的名字
simple_format = ‘[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s‘
#定义日志输出格式
logfile_dir = os.path.dirname(os.path.abspath(__file__))
logfile_name = ‘production.log‘
if not os.path.isdir(logfile_dir)
os.mkdir(logfile_dir)
#log文件全路径
logfile_path = os.path.join(logfile_dir,logfile_name)
#log配置字典
LOGGING_DIC = {
‘version‘:1,
‘disable_existing_loggers‘:False,
‘formatters‘: {
‘standard‘: {
‘format‘: standard_format
},
‘simple‘: {
‘format‘: simple_format
},
},
‘filters‘: {},
‘handlers‘: {
#打印到终端
‘console‘: {
‘level‘: ‘DEBUG‘,
‘class‘: ‘logging.StreamHandler‘,
‘formatter‘: ‘simple‘
},
#打印到文件
‘default‘: {
‘level‘: ‘DEBUG‘,
‘class‘: ‘logging.handlers.RotatingFileHandler‘,
‘formatter‘: ‘standard‘,
‘filename‘: logfile_path,
‘maxBytes‘: 1024*1024*6,
‘encoding‘: ‘utf-8‘,
},
},
‘loggers‘: {
#logging.getLogger(__name__)时拿到的配置
‘‘: {
#把上面定义的两个Handler加到这里,log即写入文件又打到终端。
‘handlers‘: [‘default‘,‘console‘],
‘level‘: ‘DEBUG‘,
#向上(更高level的logging)传递
‘propagate‘: True,
},
},
}
def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC)
#生成个log实例,__name__即把当前模块名传进去,找不到日志相关配置,使用‘‘这个默认的。
logger = logging.getLogger(__name__)
使用:
"MyLogging Test"
import time
import logging
import my_logging # 导入自定义的logging配置
logger = logging.getLogger(__name__) # 生成logger实例
def demo():
logger.debug("start range... time:{}".format(time.time()))
logger.info("中文测试开始。。。")
for i in range(10):
logger.debug("i:{}".format(i))
time.sleep(0.2)
else:
logger.debug("over range... time:{}".format(time.time()))
logger.info("中文测试结束。。。")
if __name__ == "__main__":
my_logging.load_my_logging_cfg() # 在你程序文件的入口加载自定义logging配置
demo()
原文:http://www.cnblogs.com/jinyudong/p/7719776.html