python logging模块的使用总结


Posted in Python onJuly 09, 2019

日志级别

  • CRITICAL 50
  • ERROR 40
  • WARNING 30
  • INFO 20
  • DEBUG 10

logging.basicConfig()函数中的具体参数含义

  • filename:指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中;
  • filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“w”还可指定为“a”;
  • format:指定handler使用的日志显示格式;
  • datefmt:指定日期时间格式。,格式参考strftime时间格式化(下文)
  • level:设置rootlogger的日志级别
  • stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数用到的格式化信息

参数 描述
%(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 用户输出的消息

使用logging打印日志到标准输出

import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')

 使用logging.baseConfig()将日志输入到文件

import os

logging.basicConfig(
  filename=os.path.join(os.getcwd(),'all.log'),
  level=logging.DEBUG,
  format='%(asctime)s %(filename)s : %(levelname)s %(message)s', # 定义输出log的格式
  filemode='a',
  datefmt='%Y-%m-%d %A %H:%M:%S',
)

logging.debug('this is a message')

自定义Logger

设置按照日志文件大小自动分割日志写入文件

import logging
from logging import handlers


class Logger(object):
  level_relations = {
    'debug': logging.DEBUG,
    'info': logging.INFO,
    'warning': logging.WARNING,
    'error': logging.ERROR,
    'crit': logging.CRITICAL
  }

  def __init__(self, filename, level='info', when='D', backCount=3,
         fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
    self.logger = logging.getLogger(filename)
    format_str = logging.Formatter(fmt) # 设置日志格式
    self.logger.setLevel(self.level_relations.get(level)) # 设置日志级别

    # 向控制台输出日志
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(format_str)
    self.logger.addHandler(stream_handler)

    # 日志按文件大小写入文件
    # 1MB = 1024 * 1024 bytes
    # 这里设置文件的大小为500MB
    rotating_file_handler = handlers.RotatingFileHandler(
      filename=filename, mode='a', maxBytes=1024 * 1024 * 500, backupCount=5, encoding='utf-8')
    rotating_file_handler.setFormatter(format_str)
    self.logger.addHandler(rotating_file_handler)


log = Logger('all.log', level='info')

log.logger.info('[测试log] hello, world')

按照间隔日期自动生成日志文件

import logging
from logging import handlers


class Logger(object):
  level_relations = {
    'debug': logging.DEBUG,
    'info': logging.INFO,
    'warning': logging.WARNING,
    'error': logging.ERROR,
    'crit': logging.CRITICAL
  }

  def __init__(self, filename, level='info', when='D', backCount=3,
         fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
    self.logger = logging.getLogger(filename)
    format_str = logging.Formatter(fmt) # 设置日志格式
    self.logger.setLevel(self.level_relations.get(level)) # 设置日志级别

    # 往文件里写入
    # 指定间隔时间自动生成文件的处理器
    timed_rotating_file_handler = handlers.TimedRotatingFileHandler(
      filename=filename, when=when, backupCount=backCount, encoding='utf-8')

    # 实例化TimedRotatingFileHandler
    # interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
    # S 秒
    # M 分
    # H 小时、
    # D 天、
    # W 每星期(interval==0时代表星期一)
    # midnight 每天凌晨
    timed_rotating_file_handler.setFormatter(format_str) # 设置文件里写入的格式
    self.logger.addHandler(timed_rotating_file_handler)

    # 往屏幕上输出
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(format_str)
    self.logger.addHandler(stream_handler)


log = Logger('all.log', level='info')
log.logger.info('[测试log] hello, world')

logging 模块在Flask中的使用
我在使用Flask的过程中看了很多Flask关于logging的文档,但使用起来不是很顺手,于是自己就根据Flask的官方文档写了如下的log模块,以便集成到Flask中使用。

restful api 项目目录:

.
├── apps_api
│  ├── common
│  ├── models
│  └── resources
├── logs
├── migrations
│  └── versions
├── static
├── templates
├── test
└── utils
└── app.py
└── config.py
└── exts.py
└── log.py
└── manage.py
└── run.py
└── README.md
└── requirements.txt

log.py 文件

# -*- coding: utf-8 -*-

import logging
from flask.logging import default_handler
import os

from logging.handlers import RotatingFileHandler
from logging import StreamHandler

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

LOG_PATH = os.path.join(BASE_DIR, 'logs')

LOG_PATH_ERROR = os.path.join(LOG_PATH, 'error.log')
LOG_PATH_INFO = os.path.join(LOG_PATH, 'info.log')
LOG_PATH_ALL = os.path.join(LOG_PATH, 'all.log')

# 日志文件最大 100MB
LOG_FILE_MAX_BYTES = 100 * 1024 * 1024
# 轮转数量是 10 个
LOG_FILE_BACKUP_COUNT = 10


class Logger(object):

  def init_app(self, app):
        # 移除默认的handler
    app.logger.removeHandler(default_handler)

    formatter = logging.Formatter(
      '%(asctime)s [%(thread)d:%(threadName)s] [%(filename)s:%(module)s:%(funcName)s] '
      '[%(levelname)s]: %(message)s'
    )

    # 将日志输出到文件
    # 1 MB = 1024 * 1024 bytes
    # 此处设置日志文件大小为500MB,超过500MB自动开始写入新的日志文件,历史文件归档
    file_handler = RotatingFileHandler(
      filename=LOG_PATH_ALL,
      mode='a',
      maxBytes=LOG_FILE_MAX_BYTES,
      backupCount=LOG_FILE_BACKUP_COUNT,
      encoding='utf-8'
    )

    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.INFO)

    stream_handler = StreamHandler()
    stream_handler.setFormatter(formatter)
    stream_handler.setLevel(logging.INFO)

    for logger in (
        # 这里自己还可以添加更多的日志模块,具体请参阅Flask官方文档
        app.logger,
        logging.getLogger('sqlalchemy'),
        logging.getLogger('werkzeug')

    ):
      logger.addHandler(file_handler)
      logger.addHandler(stream_handler)

在exts.py扩展文件中添加log模块

# encoding: utf-8
from log import Logger

logger = Logger()

在app.py 文件中引入logger模块,这个文件是create_app的工厂模块。

# encoding: utf-8
from flask import Flask
from config import CONFIG
from exts import logger


def create_app():
  app = Flask(__name__)

  # 加载配置
  app.config.from_object(CONFIG)

    # 初始化logger
  logger.init_app(app)

  return app

运行run.py

# -*- coding: utf-8 -*-

from app import create_app

app = create_app()

if __name__ == '__main__':
  app.run()
$ python run.py
* Serving Flask app "app" (lazy loading)
* Environment: production
  WARNING: This is a development server. Do not use it in a production deployment.
  Use a production WSGI server instead.
* Debug mode: on
2019-07-08 08:15:50,396 [140735687508864:MainThread] [_internal.py:_internal:_log] [INFO]: * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
2019-07-08 08:15:50,397 [140735687508864:MainThread] [_internal.py:_internal:_log] [INFO]: * Restarting with stat
2019-07-08 08:15:50,748 [140735687508864:MainThread] [_internal.py:_internal:_log] [WARNING]: * Debugger is active!
2019-07-08 08:15:50,755 [140735687508864:MainThread] [_internal.py:_internal:_log] [INFO]: * Debugger PIN: 234-828-739

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现简单拆分PDF文件的方法
Jul 30 Python
python3音乐播放器简单实现代码
Apr 20 Python
Python 实现链表实例代码
Apr 07 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
详解Django解决ajax跨域访问问题
Aug 24 Python
python os.path模块常用方法实例详解
Sep 16 Python
python的debug实用工具 pdb详解
Jul 12 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
python将图片转base64,实现前端显示
Jan 09 Python
Python hashlib常见摘要算法详解
Jan 13 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
python集合的新增元素方法整理
Dec 07 Python
Django中如何使用sass的方法步骤
Jul 09 #Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 #Python
使用python socket分发大文件的实现方法
Jul 08 #Python
python查看文件大小和文件夹内容的方法
Jul 08 #Python
python 搜索大文件的实例代码
Jul 08 #Python
代码实例讲解python3的编码问题
Jul 08 #Python
Python参数类型以及常见的坑详解
Jul 08 #Python
You might like
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
使用PHP和XSL stylesheets转换XML文档
2006/10/09 PHP
php strcmp使用说明
2010/04/22 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
Python SQLite3数据库操作类分享
2014/06/10 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
python re模块常见用法例举
2021/03/01 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
英国袜子店:Sock Shop
2017/01/11 全球购物
法国珠宝店:CLEOR
2017/01/29 全球购物
联想中国官方商城:Lenovo China
2017/10/18 全球购物
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
计算机大学生的自我评价
2013/10/15 职场文书
采购员的工作职责
2013/12/26 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
教师听课评语大全
2014/12/31 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python