python logging模块详解_python logging模块使用总结
目录
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模块使用总结相关推荐
- python中logging模块详解_python logging日志模块详解
logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...
- python的pygame模块详解_python游戏模块学习之pygame常规操作讲解
pygame常规操作 导入模块 import pygame # 导入pygame模块 from sys import exit # 导入退出鼠标点击事件 from math import pi # 导 ...
- python中time模块详解_Python time模块详解
time 模块主要包含各种提供日期.时间功能的类和函数.该模块既提供了把日期.时间格式化为字符串的功能,也提供了从字符串恢复日期.时间的功能. 在 Python 的交互式解释器中先导入 time 模块 ...
- python pexpect模块详解_python pexpect模块
Pexpect模块简介: Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 ...
- python email模块详解_python email模块
python email模块 email模块 电子邮件包是一个用于管理电子邮件消息的库.它的特殊设计不用于向SMTP (RFC 2821).NNTP或其他服务器发送任何电子邮件消息;这些是模块的函数, ...
- python中os模块详解_Python OS模块(常见文件操作示例)
1 Python 常见文件操作示例 2. 3. os.path 模块中的路径名访问函数 4. 分隔 5. basename() 去掉目录路径 , 返回文件名 6. dirname() 去掉文件名 , ...
- python pexpect模块详解_python Pexpect模块如何使用 python Pexpect模块使用代码示例
python Pexpect模块如何使用?本篇文章小编给大家分享一下python Pexpect模块使用代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以 ...
- python中configparser详解_python ConfigParser模块详解
功能介绍 在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单 ...
- python协程详解_python协程详解
原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...
最新文章
- 区块链概念:Hash 算法
- Vaughn Vernon谈当今软件开发所面临的挑战
- mysql字符集查看_查看和设置mysql字符集
- 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
- Matlab中3条曲线归一,matlab中关于数据归一化函数mapminmax的使用
- midi 音符对应表
- 一篇 vSAN 入门,送给大家
- 树莓派3b接收USB串口数据并解析处理
- 按值设置选择选项“已选择”
- java执行cmd命令并获取返回结果字符串
- 微博吃瓜总是晚一步才知道,程序员直接写了一个热搜提醒工具
- python3字符串格式化
- 破壳而出的琉璃之鸟汉化 QA
- C语言上学期整理(第3章)
- MATLAB中的共轭转置与转置
- 在html中雪碧图的坐标怎么看,Webpack中雪碧图使用详解
- 赛门铁克一体机后来居上
- 《机器人爱好者(第1辑)》——机器人领域新动态
- 人类vs计算机的游戏,《星际争霸2》人类VS电脑的5分钟碉堡快攻法(疯狂难度)...
- Web 页面加载动画
热门文章
- 唯美红色圣诞节背景素材,节日气氛尽显
- 国内人气设计师交流平台集设
- 老板分分钟要急需应急海报怎么做?PSD分层万能模板帮你解决燃眉之急!
- 有了优秀的可临摹PSD分层模板|瞬间提升海报质感!
- java设置框架位置_怎样设置label的位置啊?求指导
- C++ 四种智能指针详解
- 利用ptrace和memfd_create混淆程序名和参数
- Linux网络协议栈:NAPI机制与处理流程分析(图解)
- 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)
- linux添加nginx启动脚本_linux环境开机自启动nginx