python中logging包的使用总结

1.logging 简介

Python的logging package提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。

logging包中定义了Logger、Formatter、Handler和Filter等重要的类,除此之外还有config模块。

Logger是日志对象,直接提供日志记录操作的接口

Formatter定义日志的记录格式及内容

Handler定义日志写入的目的地,你可以把日志保存成本地文件,也可以每个小时写一个日志文件,还可以把日志通过socket传到别的机器上。python提供了十几种实用handler,比较常用的有StreamHandler,BaseRotatingHandler,SocketHandler,DatagramHandler,SMTPHandler等。我们可以通过Logger对象的addHandler()方法,将log输出到多个目的地。

2.Logging package

在python编程中,引入了Logging package,那么可以存在一个名称为root的Logging对象,以及很多其他名称的Logging对象。不同的Logger对象的Handler,Formatter等是分开设置的。

(1)logging.getLogger() 如果getLogging中不带参数,那么返回的是名称为root的Logger对象,如果带参数,那么就以该参数为名称的Logger对象。同名称的Logger对象是一样的。

(2)logging.basicConfig() 此方法是为名称为root的Logger对象进行配置。

(3)logging.info() logging.debug()等,使用的root Logger对象进行信息输出。如果是用其他的Logging对象进行log输出,可以使用Logging.getLogger(name).info()来实现。

(4)日志的等级

CRITICAL = 50
ERROR = 40
WARNING = 30
INFO = 20
DEBUG = 10
NOTSET = 0 

在python中有0,10,20,30,40,50这6个等级数值,这6个等级数值分别对应了一个字符串常量,作为等级名称,如上。但是可以通过logging.addLevelName(20, "NOTICE:")这个方法来改变这个映射关系,来定制化日志等级名称。

通过Logger对象的setLevel()方法,可以配置Logging对象的默认日志等级,只有当一条日志的等级大于等于这个默认的等级,才会输出到log文件中。

当使用logging.info(msg)输出log时,内部封装会用数字20作为日志等级数值,默认情况下20对应的是INFO,但如果通过addLevelName()修改了20对应的等级名称,那么log中打印的就将是个性化的等级名称。

3.logging包使用配置文件

在1~2中描述的,对一个Logger对象的Handler,Formatter等都是在程序中定义或绑定的。而实际上Logging的个性化的配置可以放到配置文件中。

logging的配置文件举例如下:

[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") 

4.一个常用的Logging封装工具

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#coding=utf-8 

import logging
import os 

class Logger(object):
  """
  封装好的Logger工具
  """ 

  def __init__(self, logPath):
    """
    initial
    """
    log_path = logPath
    logging.addLevelName(20, "NOTICE:")
    logging.addLevelName(30, "WARNING:")
    logging.addLevelName(40, "FATAL:")
    logging.addLevelName(50, "FATAL:")
    logging.basicConfig(level=logging.DEBUG,
        format="%(levelname)s %(asctime)s [pid:%(process)s] %(filename)s %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
        filename=log_path,
        filemode="a")
    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    formatter = logging.Formatter("%(levelname)s [pid:%(process)s] %(message)s")
    console.setFormatter(formatter)
    logging.getLogger("").addHandler(console) 

  def debug(self, msg=""):
    """
    output DEBUG level LOG
    """
    logging.debug(str(msg)) 

  def info(self, msg=""):
    """
    output INFO level LOG
    """
    logging.info(str(msg)) 

  def warning(self, msg=""):
    """
    output WARN level LOG
    """
    logging.warning(str(msg)) 

  def exception(self, msg=""):
    """
    output Exception stack LOG
    """
    logging.exception(str(msg)) 

  def error(self, msg=""):
    """
    output ERROR level LOG
    """
    logging.error(str(msg)) 

  def critical(self, msg=""):
    """
    output FATAL level LOG
    """
    logging.critical(str(msg)) 

if __name__ == "__main__":
  testlog = Logger("oupput.log")
  testlog.info("info....")
  testlog.warning("warning....")
  testlog.critical("critical....")
  try:
    lists = []
    print lists[1]
  except Exception as ex:
    """logging.exception()输出格式:
    FATAL: [pid:7776] execute task failed. the exception as follows:
    Traceback (most recent call last):
      File "logtool.py", line 86, in <module>
        print lists[1]
    IndexError: list index out of range
    """
    testlog.exception("execute task failed. the exception as follows:")
    testlog.info("++++++++++++++++++++++++++++++++++++++++++++++")
    """logging.error()输出格式:
    FATAL: [pid:7776] execute task failed. the exception as follows:
    """
    testlog.error("execute task failed. the exception as follows:")
    exit(1)

备注:exception()方法能够完整的打印异常的堆栈信息。error()方法只会打印参数传入的信息。

备注:

按照官方文档的介绍,logging 是线程安全的,也就是说,在一个进程内的多个线程同时往同一个文件写日志是安全的。但是多个进程往同一个文件写日志是不安全的。

您可能感兴趣的文章:

  • Python内置模块logging用法实例分析
  • 详解Python自建logging模块
  • Python logging管理不同级别log打印和存储实例
  • python使用logging模块发送邮件代码示例
  • python logging日志模块的详解
  • python中 logging的使用详解
  • python中logging库的使用总结
  • python中日志logging模块的性能及多进程详解
  • 详解使用python的logging模块在stdout输出的两种方法
  • 详解Python中logging日志模块在多进程环境下的使用
  • python logging 日志轮转文件不删除问题的解决方法
  • Python中内置的日志模块logging用法详解
  • Python使用logging结合decorator模式实现优化日志输出的方法
(0)

相关推荐

  • python logging日志模块的详解

    python logging日志模块的详解 日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如.磁盘空间低").这个软件还能按预期工作. ERROR:更严重的问题,软件没能执行一些功能 CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行 这5个等级,也

  • Python内置模块logging用法实例分析

    本文实例讲述了Python内置模块logging用法.分享给大家供大家参考,具体如下: 1.将日志直接输出到屏幕 import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') # 默认情况下,logging将日志打印到屏幕,日志级别为WARNING: #output==============

  • Python使用logging结合decorator模式实现优化日志输出的方法

    本文实例讲述了Python使用logging结合decorator模式实现优化日志输出的方法.分享给大家供大家参考,具体如下: python内置的loging模块非常简便易用, 很适合程序运行日志的输出. 而结合python的装饰器模式,则可实现简明实用的代码.测试代码如下所示: #! /usr/bin/env python2.7 # -*- encoding: utf-8 -*- import logging logging.basicConfig(format='[%(asctime)s]

  • python中logging库的使用总结

    前言 最近因为工作的需要,在写一些python脚本,总是使用print来打印信息感觉很low,所以抽空研究了一下python的logging库,来优雅的来打印和记录日志,下面话不多说了,来一起看看详细的介绍吧. 一.简单的将日志打印到屏幕: import logging logging.debug('This is debug message') #debug logging.info('This is info message') #info logging.warning('This is

  • 详解使用python的logging模块在stdout输出的两种方法

    详解使用python的logging模块在stdout输出 前言: 使用python的logging模块时,除了想将日志记录在文件中外,还希望在前台执行python脚本时,可以将日志直接输出到标准输出std.out中. 实现 logging模块可以有两种方法实现该功能: 方案一:basicconfig import sys import logging logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) 方案二:handler

  • 详解Python自建logging模块

    简单使用 最开始,我们用最短的代码体验一下logging的基本功能. import logging logger = logging.getLogger() logging.basicConfig() logger.setLevel('DEBUG') logger.debug('logsomething') #输出 out>>DEBG:root:logsomething 第一步,通过logging.getLogger函数,获取一个loger对象,但这个对象暂时是无法使用的. 第二步,loggi

  • Python logging管理不同级别log打印和存储实例

    Python内置模块logging管理不同级别log打印和存储,非常方便,从此告别了使用print打桩记录,我们来看下logging的魅力吧 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', filenam

  • python中 logging的使用详解

    日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分. 根据事件的轻重可分为以下几个级别: DEBUG: 详细信息,通常仅在诊断问题时才受到关注.整数level=10 INFO: 确认程序按预期工作.整数level=20 WARNING:出现了异常,但是不影响正常工作.整数level=30 ERROR:由于某些原因,程序 不能执行某些功能.整数level=40 CRITICAL:严重的错误,导致程序不能运行.整数

  • Python中内置的日志模块logging用法详解

    logging模块简介 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式. logging模块与log4j的机制是一样的,只是具体的实现细节不同.模块提供logger,handler,filter,formatter. logger:提供日志接口,供应用代码使用.logger最长用的操作有两类:配置和发

  • 详解Python中logging日志模块在多进程环境下的使用

    前言 相信每位程序员应该都知道,在使用 Python 来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python 的 logging 模块就是这种情况下的好帮手. logging 模块可以指定日志的级别,DEBUG.INFO.WARNING.ERROR.CRITICAL,例如可以在开发和调试时,把 DEBUG 以上级别的日志都输出,而在生产环境下,只输出 INFO 级别.(如果不特别指定,默认级别是 warning) loggi

  • python logging 日志轮转文件不删除问题的解决方法

    前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据. 分析 项目使用了 logging 的 TimedRotatingFileHandler : #!/user/bin/env python # -*- coding: utf-8 -*- import logging from logging.handlers import TimedRotatingFileHandler l

  • python使用logging模块发送邮件代码示例

    logging模块不只是能记录log,还能发送邮件,使用起来非常简单方便 #coding=utf-8 ''''' Created on 2016-3-21 @author: Administrator ''' import logging, logging.handlers class EncodingFormatter(logging.Formatter): def __init__(self, fmt, datefmt=None, encoding=None): logging.Format

  • python中日志logging模块的性能及多进程详解

    前言 Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j 类似.日志是记录操作的一种好方式.但是日志,基本都是基于文件的,也就是要写到磁盘上的.这时候,磁盘将会成为一个性能瓶颈.对于普通的服务器硬盘(机械磁盘,非固态硬盘),Python日志的性能瓶颈是多少呢?今天我们就来测一下.下面话不多说,来一起看看详细的介绍: 测试代码如下: #! /usr/bin/env python #coding=utf-8 # =

随机推荐