python中logging的常用方法
logging常用
# -*- coding:utf-8 -*-
__author__ = "lgj"
import os
import sys
import time
import logging
from logging.handlers import TimedRotatingFileHandler
from instance.test import LOG_LEVEL,LOG_NAME
set_level = getattr(logging, LOG_LEVEL.upper(), None)
if not isinstance(set_level, int):
raise ValueError('Invalid log level:%s' % LOG_LEVEL)
# 获取logger实例,如果参数为空则返回root logger,不同模块最好使用不同实例名字
logger = logging.getLogger("camel")
# 指定日志的最低输出级别,默认为WARN级别
logger.setLevel(LOG_LEVEL)
# 指定logger输出格式
formatter = logging.Formatter(
'%(asctime)s %(filename)s [line:%(lineno)d] %(funcName)s %(levelname)s %(message)s %(process)d ')
# 文件日志
log_path = os.path.realpath(os.getcwd()) + '/log/'
file_handler = logging.FileHandler(log_path + LOG_NAME + ".log")
file_handler.setFormatter(formatter) # 可以通过setFormatter指定输出格式
# 控制台日志
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter # 也可以直接给formatter赋值
# 日志轮转--与file_handler同时存在时会造成日志重复打印--具体详情见下面日志重复问题
timeRotatingHandler = TimedRotatingFileHandler(log_path + '%s.log' % (LOG_NAME), when='midnight')
timeRotatingHandler.setFormatter(formatter)
timeRotatingHandler.suffix = "_%Y%m%d.log"
# 为logger添加的日志处理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
logger.addHandler(timeRotatingHandler)
# 输出不同级别的log
logger.debug('this is debug info')
logger.info('this is information')
logger.warn('this is warning message')
logger.error('this is error message')
logger.fatal('this is fatal message, it is same as logger.critical')
logger.critical('this is critical message')
日志轮转的两种方式
# myapp的初始化工作
logger = logging.getLogger('myapp')
logger.setLevel(logging.INFO)
1、使用TimedRotatingFileHandler
# 定义一个1秒换一次log文件的handler ,保留3个旧log文件
rotating_handler = logging.handlers.TimedRotatingFileHandler("log/myapp.log", when='S', interval=1, backupCount=3)
# 设置后缀名称,跟strftime的格式一样
rotating_handler.suffix = "%Y-%m-%d_%H-%M-%S.log"
logger.addHandler(rotating_handler)
# 经测试, 并有效果轮转了但保留文件数有问题
# 注意:filehanlder.suffix的格式必须这么写,才能自动删除旧文件,如果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效,这个配置在源码里能看出来。
while True:
time.sleep(1)
logger.info("test")
2、使用RotatingFileHandler
# 写入文件,如果文件超过100个Bytes,仅保留5个文件。
handler = logging.handlers.RotatingFileHandler(
'log/myapp.log', maxBytes=100, backupCount=5)
logger.addHandler(handler)
# 效果很好
while True:
time.sleep(0.01)
logger.info("file test")
TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
filename 是输出日志文件名的前缀,比如log/myapp.log
when 是一个字符串的定义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义的不能因为when而重复。
backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设3,则在文件的创建过程中库会判断是否有超过这个3,若超过,则会从最先创建的开始删除。
注意:filehanlder.suffix的格式必须这么写,才能自动删除旧文件,如果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效。这个配置在源码里能看出来
日志重复输出的坑
你有可能会看到你打的日志会重复显示多次,可能的原因有很多,但总结下来就一个原因,日志中使用了重复的handler或者handler输出的文件重复了(如TimedRotatingFileHandler、RotatingFileHandler与FileHandler输出的文件相同时)。
可以参考 http://python.jobbole.com/86887/ 的解释。
参考:
- https://www.cnblogs.com/CJOKER/p/8295272.html
- http://python.jobbole.com/86887/
- https://blog.csdn.net/lizhe_dashuju/article/details/72579705
python中logging的常用方法的更多相关文章
- Python 中 logging 日志模块在多进程环境下的使用
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...
- Python中logging模块的基本用法
在 PyCon 2018 上,Mario Corchero 介绍了在开发过程中如何更方便轻松地记录日志的流程. 整个演讲的内容包括: 为什么日志记录非常重要 日志记录的流程是怎样的 怎样来进行日志记录 ...
- python中logging模块的用法
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- python 中logging模块
logging的作用:python中,logging模块主要是处理日志的.所谓日志,可理解为在软件运行过程中,所记录的的一些运行情况信息,软件开发人员可以根据自己的需求添加日志,日志可以帮助软件开发人 ...
- Python中logging在多进程环境下打印日志
因为涉及到进程间互斥与通信问题,因此默认情况下Python中的logging无法在多进程环境下打印日志.但是查询了官方文档可以发现,推荐了一种利用logging.SocketHandler的方案来实现 ...
- python中os的常用方法
1.os模块:os模块在python中包含普遍的操作系统功能,下面列出了一些在os模块中比较有用的部分. os.sep可以取代操作系统特定的路径分隔符.windows下为 “\\” os.name字符 ...
- python中logging的使用
什么是日志: 日志是一种可以追踪某些软件运行时所发生事件的方法 软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情 一个事件可以用一个可包含可选变量数据的消息来描述 此外,事件也 ...
- python 中os的常用方法
1.更改当前的路径 import os os.chdir( "D:/java") 注意python中表示文件路径,文件夹之间用/或者\\不能使用\
- Python中的math常用方法总结(转)http://www.cnblogs.com/renpingsheng/p/7171950.html
python中math模块常用的方法整理 ceil:取大于等于x的最小的整数值,如果x是一个整数,则返回x copysign:把y的正负号加到x前面,可以使用0 cos:求x的余弦,x必须是弧度 ...
随机推荐
- java中String、StringBuffer和StringBuilder的区别(简单介绍)
简单介绍 java中用于处理字符串常用的有三个类: 1.java.lang.String 2.java.lang.StringBuffer 3.java.lang.StrungBuilder 三者共同 ...
- 【luogu P2947 [USACO09MAR]向右看齐Look Up】 题解
题目链接:https://www.luogu.org/problemnew/show/P2947 因为在单调队列上被dalao们锤爆 怒刷单调队列题 何为单调队列? 设我们的队列为从左至右单调递增 对 ...
- 菜鸟崛起 DB Chapter 1 数据库概述
1. 数据库的概述 在目前阶段,如果要存储和管理数据,则离不开数据库.当数据存储到数据库后,就会通过数据库管理系统对这些数据进行组织和管理.数据库由一批数据构成有序的集合,这些数据被存放在结构化的数据 ...
- TCP和UDP的现实应用
以下应用的区分是基于TCP可靠传输,UDP不可靠传输 TCP一般用于文件传输(FTP HTTP 对数据准确性要求高,速度可以相对慢),发送或接收邮件(POP IMAP SMTP 对数据准确性要求高,非 ...
- flask笔记(三)Flask 添加登陆验证装饰器报错,及解析
Flask 添加登陆验证装饰器报错,及解析 写这个之前,是想到一个需求,这个是关于之前写Flask笔记(二)中的一个知识点,路由相关 需求为 : 有一些页面必须是登陆之后才能访问的,比如Shoppin ...
- jquery 层级选择器
关于层级选择器. $("parent > child") 选择所有指定“parent”元素中指定的“child”的直接子项元素. parent :任何有效的选择器. chil ...
- Mysql8.0 3306端口无法远程连接
在阿里云上搭建MySql8.0数据库服务,在阿里云上可以成功连接登陆使用,但用自己的电脑远程连接时却无法成功连接 经过资料查找,找出原因如下: 1.首先通过查看MySQL的的用户信息 可以看到host ...
- 思维导图 XMind 8 Update 8 Pro for Mac 中文破解版
破解包下载地址 在官网下载8版本就可以了
- Ehcache基于java API实现
上代码: package com.utils.cacheutils; import com.situopenapi.constant.EhcacheConstants; import com.situ ...
- 20180803UnionPay银联支付
LNMP环境下开发的银联支付(测试环境) 1.准备条件 a.银联支持API:https://open.unionpay.com/ajweb/help/api b.选择开发软件包 图示: c.我选择: ...