目录

logging模块

日志级别

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 logging模块详解_python logging模块使用总结相关推荐

  1. python中logging模块详解_python logging日志模块详解

    logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...

  2. python的pygame模块详解_python游戏模块学习之pygame常规操作讲解

    pygame常规操作 导入模块 import pygame # 导入pygame模块 from sys import exit # 导入退出鼠标点击事件 from math import pi # 导 ...

  3. python中time模块详解_Python time模块详解

    time 模块主要包含各种提供日期.时间功能的类和函数.该模块既提供了把日期.时间格式化为字符串的功能,也提供了从字符串恢复日期.时间的功能. 在 Python 的交互式解释器中先导入 time 模块 ...

  4. python pexpect模块详解_python pexpect模块

    Pexpect模块简介: Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 ...

  5. python email模块详解_python email模块

    python email模块 email模块 电子邮件包是一个用于管理电子邮件消息的库.它的特殊设计不用于向SMTP (RFC 2821).NNTP或其他服务器发送任何电子邮件消息;这些是模块的函数, ...

  6. python中os模块详解_Python OS模块(常见文件操作示例)

    1 Python 常见文件操作示例 2. 3. os.path 模块中的路径名访问函数 4. 分隔 5. basename() 去掉目录路径 , 返回文件名 6. dirname() 去掉文件名 , ...

  7. python pexpect模块详解_python Pexpect模块如何使用 python Pexpect模块使用代码示例

    python Pexpect模块如何使用?本篇文章小编给大家分享一下python Pexpect模块使用代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以 ...

  8. python中configparser详解_python ConfigParser模块详解

    功能介绍 在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单 ...

  9. python协程详解_python协程详解

    原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...

最新文章

  1. 区块链概念:Hash 算法
  2. Vaughn Vernon谈当今软件开发所面临的挑战
  3. mysql字符集查看_查看和设置mysql字符集
  4. 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
  5. Matlab中3条曲线归一,matlab中关于数据归一化函数mapminmax的使用
  6. midi 音符对应表
  7. 一篇 vSAN 入门,送给大家
  8. 树莓派3b接收USB串口数据并解析处理
  9. 按值设置选择选项“已选择”
  10. java执行cmd命令并获取返回结果字符串
  11. 微博吃瓜总是晚一步才知道,程序员直接写了一个热搜提醒工具
  12. python3字符串格式化
  13. 破壳而出的琉璃之鸟汉化 QA
  14. C语言上学期整理(第3章)
  15. MATLAB中的共轭转置与转置
  16. 在html中雪碧图的坐标怎么看,Webpack中雪碧图使用详解
  17. 赛门铁克一体机后来居上
  18. 《机器人爱好者(第1辑)》——机器人领域新动态
  19. 人类vs计算机的游戏,《星际争霸2》人类VS电脑的5分钟碉堡快攻法(疯狂难度)...
  20. Web 页面加载动画

热门文章

  1. 唯美红色圣诞节背景素材,节日气氛尽显
  2. 国内人气设计师交流平台集设
  3. 老板分分钟要急需应急海报怎么做?PSD分层万能模板帮你解决燃眉之急!
  4. 有了优秀的可临摹PSD分层模板|瞬间提升海报质感!
  5. java设置框架位置_怎样设置label的位置啊?求指导
  6. C++ 四种智能指针详解
  7. 利用ptrace和memfd_create混淆程序名和参数
  8. Linux网络协议栈:NAPI机制与处理流程分析(图解)
  9. 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)
  10. linux添加nginx启动脚本_linux环境开机自启动nginx