程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

python日志模块使用

发布于2019-08-17 14:55     阅读(1653)     评论(0)     点赞(0)     收藏(1)


▾ logging模块

 

▾ 简介

   • Python内置标准模块

  • 输出运行日志

  • 设置输出日志等级、日志保存路径、日志文件回滚

▾ 与print相比有以下优点

  • print把所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其他数据

   • Logging则可以由开发者决定将信息输出到什么地方,以及怎么输出

▾ 使用

▾ 基本使用

复制代码
import logging

logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')

logger = logging.getLogger(__name__)

logger.info("Start print log")

logger.debug("Do something")

logger.warning("Something maybe fail.")

logger.info("Finish")
复制代码

 

▾ Logging中可以选择很多消息级别

• CRITICAL > ERROR > WARNING > INFO > DEBUG

  • debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上

  • info : 打印info,warning,error,critical级别的日志,确认一切按预期运行

  • warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作

  • error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能

  • critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行

 

▾ logging.basicConfig函数各参数

  • filename 指定日志文件名

  • filemode 和file函数意义相同,指定日志文件的打开模式,’w’或者’a’

 

▾ 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:指定时间格式,同time.strftime()

• level:设置日志级别,默认为logging.WARNNING

• stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

 

▾ 将日志写入文件

▾ 设置logging,创建一个FileHandler,并对输出消息的格式进行设置,将其添加到logger,然后将日志写入到指定的文件中

   

复制代码
import logging

logger = logging.getLogger(__name__)

logger.setLevel(level = logging.INFO)

handler = logging.FileHandler("log.txt")

handler.setLevel(logging.INFO)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

handler.setFormatter(formatter)

logger.addHandler(handler)

 

logger.info("Start print log")

logger.debug("Do something")

logger.warning("Something maybe fail.")

logger.info("Finish")
复制代码

 

 

   

 

▾ 将日志同时输出到屏幕

复制代码
console = logging.StreamHandler()

console.setLevel(logging.WARNING)

formatter = logging.Formatter('%(asctime)s - %(message)s')

console.setFormatter(formatter)

logger.addHandler(console)
复制代码

 

 

 

▾ 可以发现,logging有一个日志处理的主对象,其他处理方式都是通过addHandler添加进去,logging中包含的handler主要有如下几种

  • StreamHandler:logging.StreamHandler;日志输出到流,可以是sys.stderr,sys.stdout或者文件

   • FileHandler:logging.FileHandler;日志输出到文件

   • BaseRotatingHandler:logging.handlers.BaseRotatingHandler;基本的日志回滚方式

   • RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚

  • TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日志回滚方式,在一定时间区域内回滚日志文件

   • SocketHandler:logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets

   • DatagramHandler:logging.handlers.DatagramHandler;远程输出日志到UDP sockets

  • SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址

   • SysLogHandler:logging.handlers.SysLogHandler;日志输出到syslog

  • NTEventLogHandler:logging.handlers.NTEventLogHandler;远程输出日志到Windows NT/2000/XP的事件日志

  • MemoryHandler:logging.handlers.MemoryHandler;日志输出到内存中的指定buffer

  • HTTPHandler:logging.handlers.HTTPHandler;通过"GET"或者"POST"远程输出到HTTP服务器

 

▾ 使用示例

复制代码
import logging

log_format = "%(levelname)s | %(asctime)s | %(pathname)s | funcName:%(funcName)s | lineno:%(lineno)s | message:%(message)s"
logging.basicConfig(level = logging.ERROR,format = log_format)

logger = logging.getLogger(__name__)
logger.setLevel(level = logging.DEBUG)


def add_file_handler(logger, filename):
    handler = logging.FileHandler(filename)
    handler.setLevel(logging.WARNING)
    logger.addHandler(handler)
    return logger

def add_stream_handler(logger):
    console = logging.StreamHandler()
    console.setLevel(logging.WARNING)
    logger.addHandler(console)

if __name__ == '__main__':
    logger.info("Start print log")
    logger.debug("Do something")
    logger.warning("Something maybe fail.")
    logger.info("Finish")
复制代码

 

▾ 从字典中获取配置信息

复制代码
import logging.config

 

config = {

    'version': 1,

    'formatters': {

        'simple': {

            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',

        },

        # 其他的 formatter

    },

    'handlers': {

        'console': {

            'class': 'logging.StreamHandler',

            'level': 'DEBUG',

            'formatter': 'simple'

        },

        'file': {

            'class': 'logging.FileHandler',

            'filename': 'logging.log',

            'level': 'DEBUG',

            'formatter': 'simple'

        },

        # 其他的 handler

    },

    'loggers':{

        'StreamLogger': {

            'handlers': ['console'],

            'level': 'DEBUG',

        },

        'FileLogger': {

            # 既有 console Handler,还有 file Handler

            'handlers': ['console', 'file'],

            'level': 'DEBUG',

        },

        # 其他的 Logger

    }

}

 

logging.config.dictConfig(config)

StreamLogger = logging.getLogger("StreamLogger")

FileLogger = logging.getLogger("FileLogger")

# 省略日志输出
复制代码

 

 

▾ 从配置文件中获取配置信息

▾ test.ini 文件

复制代码
 [loggers]

keys=root,sampleLogger

 

[handlers]

keys=consoleHandler

 

[formatters]

keys=sampleFormatter

 

[logger_root]

level=DEBUG

handlers=consoleHandler

 

[logger_sampleLogger]

level=DEBUG

handlers=consoleHandler

qualname=sampleLogger

propagate=0

 

[handler_consoleHandler]

class=StreamHandler

level=DEBUG

formatter=sampleFormatter

args=(sys.stdout,)

 

[formatter_sampleFormatter]

format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

复制代码
▾ testinit.py 文件
复制代码
import logging.config

 

logging.config.fileConfig(fname='test.ini', disable_existing_loggers=False)

logger = logging.getLogger("sampleLogger")

# 省略日志输出
复制代码

 


▾ test.yaml 文件
复制代码
version: 1

formatters:

  simple:

    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

handlers:

  console:

    class: logging.StreamHandler

    level: DEBUG

    formatter: simple

  

loggers:

  simpleExample:

    level: DEBUG

    handlers: [console]

    propagate: no

root:

  level: DEBUG

  handlers: [console]
复制代码

 

 

▾ testyaml.py 文件

复制代码
import logging.config

# 需要安装 pyymal 库

import yaml

 

with open('test.yaml', 'r') as f:

    config = yaml.safe_load(f.read())

    logging.config.dictConfig(config)

 

logger = logging.getLogger("sampleLogger")

# 省略日志输出
复制代码

 

 

▾ 中文乱码

• # 自定义 Logger 配置

handler = logging.FileHandler(filename="test.log", encoding="utf-8")

• # 使用默认的 Logger 配置

logging.basicConfig(handlers=[logging.FileHandler("test.log", encoding="utf-8")], level=logging.DEBUG)

 

 

▾ 临时禁用日志输出

logging.disable(logging.INFO)
 logger.disabled = True

 

▾ 日志文件按照时间划分或者按照大小划分

▾ 按大小划分

# 每隔 1000 Byte 划分一个日志文件,备份文件为 3 个

file_handler = logging.handlers.RotatingFileHandler("test.log", mode="w", maxBytes=1000, backupCount=3, encoding="utf-8")

 

▾ 按时间划分

# 每隔 1小时 划分一个日志文件,interval 是时间间隔,备份文件为 10 个

handler2 = logging.handlers.TimedRotatingFileHandler("test.log", when="H", interval=1, backupCount=10)

 



所属网站分类: 技术文章 > 博客

作者:坚持才能胜利

链接:https://www.pythonheidong.com/blog/article/47541/eab8af389ab1d4527818/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

0 0
收藏该文
已收藏

评论内容:(最多支持255个字符)