在日常项目中,总是需要记录下一些细小信息或者错误码、错误信息的,这个时候就需要进行日志的操作。
python中用于日志创建、设置和记录等功能的模块,就是logging了,下面是对其基本使用方法的介绍:

一、最最简单的使用方法:

import logging

LOG_FILE = "/opt/xxx/log/debug.log"
logging.basicConfig(filename=LOG_FILE,level=logging.DEBUG)

然后在需要记录日志的地方引用:

logging.warn("[WARN:%s]warn messages %s",error_code,error_msg)

简单的几行代码,就可以实现将“[WARN:14001]warn message Error request”写入日志文件/opt/xxx/log/debug.log中了。

二、再来比较正规的使用方式:

#!/usr/bin/python

def initlog():
 import logging  # 生成一个日志对象
logger = logging.getLogger()
 # 生成一个Handler。logging支持许多Handler,例如FileHandler, SocketHandler, SMTPHandler等,
# 我由于要写文件就使用了FileHandler。
 # LOG_FILE是一个全局变量,它就是一个文件名,如:'crawl.log'
LOG_FILE = "/opt/xxx/log/debug.log"
hdlr = logging.FileHandler(LOG_FILE)
 # 生成一个格式器,用于规范日志的输出格式。如果没有这行代码,那么缺省的
 # 格式就是:"%(message)s"。也就是写日志时,信息是什么日志中就是什么,
 # 没有日期,没有信息级别等信息。logging支持许多种替换值,详细请看
 # Formatter的文档说明。这里有三项:时间,信息级别,日志信息
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
 # 将格式器设置到处理器上
hdlr.setFormatter(formatter)
 # 将处理器加到日志对象上
logger.addHandler(hdlr)
 # 设置日志信息输出的级别。logging提供多种级别的日志信息,如:NOTSET,
 # DEBUG, INFO, WARNING, ERROR, CRITICAL等。每个级别都对应一个数值。
 # 如果不执行此句,缺省为30(WARNING)。可以执行:logging.getLevelName
 # (logger.getEffectiveLevel())来查看缺省的日志级别。日志对象对于不同
 # 的级别信息提供不同的函数进行输出,如:info(), error(), debug()等。当
 # 写入日志时,小于指定级别的信息将被忽略。因此为了输出想要的日志级别一定
 # 要设置好此参数。这里我设为NOTSET(值为0),也就是想输出所有信息
logger.setLevel(logging.NOTSET)
 return logger logging = initlog()
logging.info(' 注册')
logging.error('error!')
logging.debug('debug')

上面代码中的使用方式,可以指定日志的级别和格式,可用于区分开发环境和用户环境中日志的级别,减少不必要的空间浪费。

三、日志分割

当工程运行一段时间后,会发现日志文件越来越大,而且也不便于查找某天的错误信息。这就需要我们对日志进行分割,分割形式有两种:RotatingFileHandler(按照文件大小分割)、TimedRotatingFileHandler(按照时间间隔分割)

  • 以第二个例子中的代码为基础,按照文件大小分割的使用方法:
hdlr =logging.handlers.RotatingFileHandler(LOG_FILE,maxBytes=1024*1024,backupCount=40)

其中maxBytes指定每个日志文件的大小,如果文件超过1024比特就分割该日志文件,最大的备份文件个数是40个。到LOG_FILE所在目录下查看,发现除了debug.log文件外,还多了debug.log.1,debug.log.2等文件。

debug.log文件和debug.log.1等文件的关系是:debug.log是全集,debug.log.1和debug.log.2等文件是无交集的属于debug.log的子集(忘记数学符号怎么写了,感觉文字木有表达式明了啊)

  • 同样以第二个例子中的代码为基础,按照时间间隔分割的使用方法:
hdlr = logging.handlers.TimedRotatingFileHandler(LOG_FILE,when='M',interval=1,backupCount=40)

when 参数可设置为S-second(按秒对日志进行分割),M-Minutes(按分钟对日志进行分割),H-Hours(按小时对日志进行分割),D- Days(按天对日志进行分割),midnigh-roll over at midnight(每天半夜对日志进行回滚),W{0-6}-roll over on a certain day;0-Monday(按照指定的日期如0-周一对日志进行回滚)。when参数默认是“h”按小时分割,该参数对大小写不敏感,所以无所谓是H还是 h了。
interval参数默认“1”,如果when=‘h’,那么就是每一小时对日志进行一次分割,即debug.log所在目录会出现 debug.log.2013-06-28_13,debug.log.2013-06-28_14等日志文件。

 #! /usr/bin/env python
#-*- coding:utf8 -*-
#Author:zhangning
import logging
def logg_formart():
logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
# fh.setLevel(logging.INFO) # 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
# ch.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s') fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.setLevel(logging.DEBUG)
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)
return logger logger =logg_formart()
for i in range(10):
logger.debug(i)

true

 #!/usr/bin/env python
#-*- coding:utf8 -*-
import time
import logging
import logging.handlers # # logging初始化工作
# logging.basicConfig()
#
# # myapp的初始化工作
# logger = logging.getLogger()
# logger.setLevel(logging.INFO)
#
# # 添加TimedRotatingFileHandler
# # 定义一个1秒换一次log文件的handler
# # 保留3个旧log文件
# formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s')
# filehandler = logging.handlers.TimedRotatingFileHandler("myapp.log", when='S', interval=1, backupCount=3)
# # 设置后缀名称,跟strftime的格式一样
# #果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效
# filehandler.suffix = "%Y-%m-%d_%H-%M.log"
# filehandler.setFormatter(formatter)
# logger.addHandler(filehandler)
#
# while True:
# logger.info("test") def log_formart():
logging.basicConfig()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s')
filehandler = logging.handlers.TimedRotatingFileHandler("myapp.log", when='M', interval=1, backupCount=3)
filehandler.suffix = "%Y-%m-%d_%H-%M.log"
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
return logger
logging =log_formart()
while True:
time.sleep(5)
logging.info('test1')

Python中的日志处理的更多相关文章

  1. python中的日志操作和发送邮件

    1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...

  2. Python 中 logging 日志模块在多进程环境下的使用

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...

  3. python中的日志,logger用法

    python中自带logger模块,实现方法有两种,一般使用第二种,更灵活 方法一: import logging # 通过logging.basicConfig完成 logging.basicCon ...

  4. Python中的日志记录方案-logging模块&loguru模块

    原文链接 原创: 崔庆才 在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样.在使用时我们需要配置一些 Handler.Formatter ...

  5. Python中的日志管理Logging模块

    1.基本的用法 import logging logging.debug('This is debug message') logging.info('This is info message') l ...

  6. python中的日志模块logging

    1.日志级别5个: 警告Warning 一般信息Info  调试 Debug  错误Error 致命Critical 2.禁用日志方法 logging.disable(logging.DEBUG) 3 ...

  7. python中logging日志基本用法,和进程安全问题

    低配版 import logging logging.debug('debug message') # 调试模式 logging.info('info message') # 正常运转模式 loggi ...

  8. python中添加日志记录到文件

    1.实现python日志功能 2.只输出到文件,不输出到控制台 #encoding:utf-8 import logging from common import path_util logging_ ...

  9. Python中logging日志模块的使用

    参考https://www.cnblogs.com/CJOKER/p/8295272.html

随机推荐

  1. Nginx在局域网中使用ip_hash负载均衡策略,访问全部分发到同一个后台服务器

    Nginx的ip_hash算法都将一个ip地址的前三段作为hash的关键字

  2. 20165325 2017-2018-2《Java程序设计》课程总结

    20165325 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 1.预备作业一:我期待的师生关系 20165325 期望的师生关系 简要内容: 我心中的好老师 ...

  3. MII、RMII、GMII接口的详细介绍【转】

    转自:https://www.cnblogs.com/geekite/p/5204512.html 概述: MII (Media Independent Interface(介质无关接口)或称为媒体独 ...

  4. 设计模式C++学习笔记之十四(Iterator迭代器模式)

      14.1.解释 概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. main(),客户 IProject,产品接口 CProject,产品类 IIterator,迭代 ...

  5. C++游戏开发需要阅读的书籍

    如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦):  1.Gamebryo 2.2游戏引擎(盛大.腾 ...

  6. 范数(norm) 几种范数的简单介绍

    原文地址:https://blog.csdn.net/a493823882/article/details/80569888 我们知道距离的定义是一个宽泛的概念,只要满足非负.自反.三角不等式就可以称 ...

  7. UVALive 8519 Arrangement for Contests 2017西安区域赛H 贪心+线段树优化

    题意 等价于给一个数列,每次对一个长度为$K$的连续区间减一 为最多操作多少次 题解: 看样例猜的贪心,10分钟敲了个线段树就交了... 从1开始,找$[i,i+K]$区间的最小值,然后区间减去最小值 ...

  8. codeforces 461div.2

    A Cloning Toys standard input/output 1 s, 256 MB     B Magic Forest standard input/output 1 s, 256 M ...

  9. codeforces 412div.2

        A CodeForces 807A Is it rated?     B CodeForces 807B T-Shirt Hunt     C CodeForces 807C Success ...

  10. Linux i2c 读写程序

    /* This software uses a BSD license. Copyright (c) 2010, Sean Cross / chumby industriesAll rights re ...