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重写日志等级,且日志等级必须大于这个全局日志等级才会生效

典型的日志记录的步骤是这样的:

  1. 创建logger
  2. 创建handler
  3. 定义formatter
  4. 给handler添加formatter
  5. 给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 日志模块学习的更多相关文章

  1. pyhton——logging日志模块的学习

    https://www.cnblogs.com/yyds/p/6901864.html 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模 ...

  2. python 自动化之路 logging日志模块

    logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...

  3. 约束、自定义异常、hashlib模块、logging日志模块

    一.约束(重要***) 1.首先我们来说一下java和c#中的一些知识,学过java的人应该知道,java中除了有类和对象之外,还有接口类型,java规定,接口中不允许在方法内部写代码,只能约束继承它 ...

  4. logging日志模块

    为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...

  5. day31 logging 日志模块

    # logging 日志模块 ****** # 记录用户行为或者代码执行过程 # print 来回注释比较麻烦的 # logging # 我能够“一键”控制 # 排错的时候需要打印很多细节来帮助我排错 ...

  6. logging日志模块的使用

    logging日志模块的使用 logging模块中有5个日志级别: debug 10 info 20 warning 30 error 40 critical 50 通常使用日志模块,是用字典进行配置 ...

  7. Python入门之logging日志模块以及多进程日志

    本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...

  8. Python 中 logging 日志模块在多进程环境下的使用

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...

  9. Python logging(日志)模块

    python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...

随机推荐

  1. 理解闭包 js回收机制

    为什么要有回收机制?why? 打个比方,我有一个内存卡,这个内存是8G的,我把文件,视频,音乐,都保存到了这个内存卡,随着我的储存的内容越来越多,这个内存卡已经保存不了了,如果我还想再把其他的文件保存 ...

  2. oracle执行计划之-表连接方式

    转载自:http://blog.csdn.net/tianlesoftware/article/details/5826546 在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的 ...

  3. Equls 和==的区别

    对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true.对于 string ...

  4. 如何修改WAMP中mysql默认空密码

      WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按 ...

  5. (转)LSTM NEURAL NETWORK FOR TIME SERIES PREDICTION

    LSTM NEURAL NETWORK FOR TIME SERIES PREDICTION Wed 21st Dec 2016   Neural Networks these days are th ...

  6. DTO对象

    在EF中,EF生成的对象都是代理对象,这些对象看上去是实体类对象,但是其实都是EF封装好的代理类对象.所以调用EF查询得到的代理类对象有继承于实体对象,所以可以用实体类对象来接收返回的代理类对象.EF ...

  7. asp.net mvc4 学习笔记一(基本原理)

    做了8年的asp.net webform,用过MVVM但还没用过MVC , 虽然项目不用MVC,但是还是想了解一下,今天第二天学习,以下是学习心得. VS2012默认带有asp.net mvc3和as ...

  8. ThinkPhp单字母函数

    首先A.D.S.L.C.F.I 他们都在 /THINKPHP/Common/functions.php 这个文件中 下面我分别说明一下他们的功能 A() 加载Action类 D() 加载Model类 ...

  9. Linux入侵检查思路及其命令 转自https://yq.aliyun.com/articles/24250?spm=5176.100239.blogcont24249.12.rbBrIh

    摘要: 若Linux操作系统被非法入侵,那么有哪些思路和系统命令用于检查系统当前的状态呢?主要包括对关键进程.关键服务.关键文件的检测,同时及时备份硬盘数据用于持续分析.详细的检查思路和Linux命令 ...

  10. tomcat war部署根目录下

    一个很取巧的办法,步骤如下: 1. 删除webapp下所有文件 cd ${TOMAT_HOME}/webapps && rm -rf * 2. copy待部署war到webapps目录 ...