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获取Windows或Linux主机名称通用函数分享
Nov 22 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
Python对切片命名的实现方法
Oct 16 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
Python GUI编程完整示例
Apr 04 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
Python LMDB库的使用示例
Feb 14 Python
python脚本框架webpy的url映射详解
Nov 20 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
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
php之可变变量的实例详解
2017/09/12 PHP
VBScript版代码高亮
2006/06/26 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
python实现字典嵌套列表取值
2019/12/16 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
用 Python 制作地球仪的方法
2020/04/24 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
迟到检讨书900字
2014/01/14 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
怎么写工作检讨书
2014/11/16 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
2016教师节感恩话语
2015/12/09 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python