logging 日志模块学习
logging
日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪,所以还是灰常重要滴,下面我就来从入门到放弃的系统学习一下日志既可以在屏幕上显示,又可以在文件中体现。
简单的在屏幕上体现
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
屏幕上打印:
WARNING:root:This is warning message 
默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别

输出到指定文件
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='test.log',
filemode='w') logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
logging.basicConfig函数各参数:
level :设置日志的级别.对低于该级别的日志消息将被忽略
format :设置日志输出格式,format可以输出很多有用信息,如下所示:
    %(levelno)s: 打印日志级别的数值
    %(levelname)s: 打印日志级别名称
    %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
    %(filename)s: 打印当前执行程序名
    %(funcName)s: 打印日志的当前函数
         %(lineno)d: 打印日志的当前行号
         %(asctime)s: 打印日志的时间
         %(thread)d: 打印线程ID
         %(threadName)s: 打印线程名称
         %(process)d: 打印进程ID
        %(message)s: 打印日志信息
datefmt :定义日期格式
filename: 指定日志存储路径及文件名
filemode :日志文件的打开模式。 默认值为’a',表示日志消息以追加的形式添加到日志文件中。如果设为’w', 那么每次程序启动的时候都会更新旧的日志文件
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
注意:
basicConfig是为root logger创建的一个句柄(StreamHandler),如果root logger已经存在一个句柄时,basicConfig()函数并不会创建新的句柄,就是logging.basicConfig无论配置几个,都只能在一个文件中记录 ,想要在多个文件中记录的话,就需要自己写logging.FileHandler
日志同时输出到文件和屏幕
import logging # 1、创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG) # 2、创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG) # 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 3、定义handler的输出格式(formatter)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 4、给handler添加formatter
fh.setFormatter(formatter)
ch.setFormatter(formatter) # 5、给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch) # 6、记录日志
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
这里的logger.setlevel应该是设置的全局日志等级,后面的handler就可以不用设置了,当然也可以在handler重写日志等级,且日志等级必须大于这个全局日志等级才会生效
典型的日志记录的步骤是这样的:
- 创建logger
 - 创建handler
 - 定义formatter
 - 给handler添加formatter
 - 给logger添加handler
 
logging中几个比较中要的类
除了基本的Handler类,比较有用的子类有:
1) StreamHandler实例发送错误到流(类似文件的对象)
2) FileHandler实例发送错误到磁盘文件
3) BaseRotatingHandler是所有轮徇日志的基类,不能直接使用。但是可以使用 RotatingFileHandler和TimeRotatingFileHandler
4) RotatingFileHandler实例发送信息到磁盘文件,并且限制最大的日志文件大小,并适时轮徇
5) TimeRotatingFileHandler实例发送错误信息到磁盘,并在适当的事件间隔进行轮徇
6) SocketHandler实例发送日志到TCP/IP socket。
7) DatagramHandler实例发送错误信息通过UDP协议
8) SMTPHandler实例发送错误信息到特定的email地址
9) SysLogHandler实例发送日志到UNIX syslog服务,并支持远程syslog服务
10)NTEventLogHandler实例发送日志到WindowsNT/2000/XP事件日志
11)MemoryHandler实例发送日志到内存中的缓冲区,并在达到特定条件时清空
12)HTTPHandler实例发送错误信息到HTTP服务器,通过GET或POST方法
现实应用:
#/usr/bin/python
#coding:utf-8 import logging
import sys,os
import pdb class MyLog(object):
'''
Usage:
mylog = MyLog()
logger = mylog.getLog()
logger.debug('test...')
logger.info('test...')
logger.warning('test...')
logger.error('test...')
logger.critical('test...')
默认日志输出到日志文件
缺省日志名字:调用者文件名后缀变为log
例如:my.py 调用mylog模块 则日志名字my.log
如果需要设置自己的日志名字则:mylog.setLog(filename,loglevel) 如果同时向输出到屏幕则需要使用:mylog.openConsole(self,is_control = True,log_level = None)方法
'''
debug = logging.DEBUG
info = logging.INFO
warning = logging.WARNING
error = logging.ERROR
critical = logging.CRITICAL def __init__(self,log_level = logging.WARNING):
self.log_level = log_level
try:
self.default_log_file = os.path.basename(sys.argv[0]).split('.')[0] + '.log'
except:
self.default_log_file = os.path.basename(sys.argv[0]) + '.log' logging.basicConfig(level=log_level,
format ='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt ='%a, %d %b %Y %H:%M:%S',
filename = self.default_log_file,
filemode ='w')
@classmethod
def _getFormatter(cls):
fmt = logging.Formatter(fmt ='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt ='%a, %d %b %Y %H:%M:%S')
return fmt def getLog(self):
if not hasattr(self,'_logger'):
self._logger = logging.getLogger()
return self._logger def setLog(self,log_filename = None,log_level = None):
if not hasattr(self,'_logger'):
self._logger = logging.getLogger()
else:
#_handler存在,则移除旧_handler
if hasattr(self,'_handler'):
self._logger.removeHandler(self._handler) #实例化一个_hander
if log_filename is None:
log_filename = self.default_log_file
self._handler=logging.FileHandler(log_filename) #set log Formatter
fmt = MyLog._getFormatter()
self._handler.setFormatter(fmt) self._logger.addHandler(self._handler) if log_level is None:
log_level = self.log_level
self._logger.setLevel(log_level) def openConsole(self,is_control = True,log_level = None):
'''
默认输出屏幕级别与输出到日志的级别一致
如果关闭屏幕输出:is_control 设置为False
'''
if not hasattr(self,'_logger'):
self._logger = logging.getLogger() if is_control:
fmt = MyLog._getFormatter()
self._console = logging.StreamHandler()
if log_level is not None:
try:
self._console.setLevel(log_level)
except:
raise Exception('log_level is Error!')
self._console.setFormatter(fmt)
self._logger.addHandler(self._console)
else:
if hasattr(self,'_console'):
self._logger.removeHandler(self._console) if __name__=='__main__':
#pdb.set_trace()
mylog = MyLog()
mylog.setLog('11.log',logging.DEBUG)
logger = mylog.getLog()
mylog.openConsole()
logger.info('Test...')
mylog.openConsole(False)
logger.info('close console...')
logging 日志模块学习的更多相关文章
- pyhton——logging日志模块的学习
		
https://www.cnblogs.com/yyds/p/6901864.html 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模 ...
 - python 自动化之路 logging日志模块
		
logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...
 - 约束、自定义异常、hashlib模块、logging日志模块
		
一.约束(重要***) 1.首先我们来说一下java和c#中的一些知识,学过java的人应该知道,java中除了有类和对象之外,还有接口类型,java规定,接口中不允许在方法内部写代码,只能约束继承它 ...
 - logging日志模块
		
为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...
 - day31 logging 日志模块
		
# logging 日志模块 ****** # 记录用户行为或者代码执行过程 # print 来回注释比较麻烦的 # logging # 我能够“一键”控制 # 排错的时候需要打印很多细节来帮助我排错 ...
 - logging日志模块的使用
		
logging日志模块的使用 logging模块中有5个日志级别: debug 10 info 20 warning 30 error 40 critical 50 通常使用日志模块,是用字典进行配置 ...
 - Python入门之logging日志模块以及多进程日志
		
本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...
 - Python 中 logging 日志模块在多进程环境下的使用
		
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...
 - Python logging(日志)模块
		
python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...
 
随机推荐
- ajax处理的方式
			
1.方式一:在一个web页面中 [System.Web.Services.WebMethod],有点象webservers的方法! 前台: 返回的数据: msg:Object {d: "He ...
 - Mongodb优化
			
本文将从各个层面讲述Mongodb的优化方法
 - RDD与DataFrame的转换
			
RDD与DataFrame转换1. 通过反射的方式来推断RDD元素中的元数据.因为RDD本身一条数据本身是没有元数据的,例如Person,而Person有name,id等,而record是不知道这些的 ...
 - jquery与各种UI框架的导入要注意的地方
			
前端的处理我们会使用easyUI,amazeUI,bootstrap等等框架,然而每个页面都要导入这些js css 文件,所以我们将要导入的文件提取出来,写在一个页面上,每次只要倒入该页面就行,如 ...
 - HDU1434(终于用优先队列a了一题。。。了解度+1)
			
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...
 - 安装Adobe系列时遇到的问题解决
			
安装错误,错误摘要如下: Exit Code: 6 Please see specific errors below for troubleshooting. For example, ERROR: ...
 - 【阿迪达斯 ZX850 系列】
			
[阿迪达斯zx850系列 灰蓝桔 36-44] [阿迪达斯 ZX850 新配色B34720 情侣鞋 36-44] [阿迪达斯 ZX850 新配色B34720 情侣鞋 36-44] [阿迪达斯 ZX85 ...
 - 【Unity3D基础教程】给初学者看的Unity教程(五):详解Unity3D中的协程(Coroutine)
			
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 为什么需要协程 在游戏中有许多过程(Proc ...
 - 【深度学习】之Caffe的solver文件配置(转载自csdn)
			
原文: http://blog.csdn.net/czp0322/article/details/52161759 今天在做FCN实验的时候,发现solver.prototxt文件一直用的都是mode ...
 - 6个强大的AngularJS扩展应用
			
本文链接:http://www.codeceo.com/article/6-angularjs-extension.html本文作者:码农网 – 小峰 AngularJS现在非常热门,是Google推 ...