python日志模块优缺点_日志模块logging使用心得

在应用程序使用中,日志输出对应用维护人员、开发人员判断程序的问题起重要作用。

那么在python中如何定义程序的日志输出? 推荐使用日志模块logging

需求:实现日志内容输出在文件中和控制器中

import logging

# 日志配置

logger = logging.getLogger("ys_monitor")

logger.setLevel(logging.DEBUG) # 全局

formatter = logging.Formatter('%(asctime)s - %(levelname)s -%(module)s: %(message)s') # 日志格式

fh = logging.FileHandler(filename_path) # 文件输出

fh.setLevel(logging.DEBUG)

fh.setFormatter(formatter) # 应用给文件

logger.addHandler(fh) # 把文件句柄交给logger接口执行

#ch = logging.StreamHandler() # 屏幕输出

#ch.setLevel(logging.DEBUG)

#ch.setFormatter(formatter) # 应用给屏幕

#logger.addHandler(ch) # 把屏幕句柄交给logger接口执行

模块级函数

logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root logger

logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical():设定root logger的日志级别

Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高

Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别

Formatters

Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S,下面是Formatter常用的一些信息

%(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

用户输出的消息

需求:对于文件日志输出,随着时间的增长,日志内容越来越多,文件越来越大,不利于以后的查看。需要将文件按时间分割。

配置文件

###############################################

[loggers]

keys=root,wj

[logger_root]

level=DEBUG

handlers=hand01

[logger_wj]

handlers=hand02

qualname=wj

propagate=0

###############################################

[handlers]

keys=hand01,hand02

[handler_hand01]

class=StreamHandler

level=DEBUG

formatter=formatter02

args=(sys.stdout,)

[handler_hand02]

class=handlers.TimedRotatingFileHandler

level=DEBUG

formatter=formatter02

args=('./log/mixh5monitor.log','midnight',1,30)

###############################################

[formatters]

keys=formatter01,formatter02

[formatter_formatter01]

format=%(asctime)s - %(process)d - %(module)s - %(levelname)s - %(message)s

datefmt=%Y-%m-%d %H:%M:%S

[formatter_formatter02]

format=%(asctime)s - %(process)d - %(module)s - %(levelname)s - %(message)s

datefmt=

引入配置文件代码,单独放入一个log_config.py文件

import logging

import logging.config

LOGCONF_FILENAME = "./etc/logging.conf"

logging.config.fileConfig(LOGCONF_FILENAME)

logger = logging.getLogger('wj')

logging.handlers.RotatingFileHandler

个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建

一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把

文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建

chat.log,继续输出日志信息。它的构造函数是:

RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])

其中filename和mode两个参数和FileHandler一样。

maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。

backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。

logging.handlers.TimedRotatingFileHandler

个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就

自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:

TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])

其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。

interval是时间间隔。

when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:

S 秒

M 分

H 小时

D 天

W 每星期(interval==0时代表星期一)

midnight 每天凌晨

其它py文件引入log_config.py文件写日志方法

import log_config

log_config.logger.debug('debug')

log_config.logger.info('info')

Python多进程log日志切分错误的解决方案

#修改后的代码,从30行开始引用文件锁,保证进程间的原子性。

import time

import os

import fcntl

import struct

from logging.handlers import TimedRotatingFileHandler

class MultiProcessTimedRotatingFileHandler(TimedRotatingFileHandler):

def doRollover(self):

"""

do a rollover; in this case, a date/time stamp is appended to the filename

when the rollover happens. However, you want the file to be named for the

start of the interval, not the current time. If there is a backup count,

then we have to get a list of matching filenames, sort them and remove

the one with the oldest suffix.

"""

#if self.stream:

# self.stream.close()

# get the time that this sequence started at and make it a TimeTuple

t = self.rolloverAt - self.interval

if self.utc:

timeTuple = time.gmtime(t)

else:

timeTuple = time.localtime(t)

dfn = self.baseFilename + "." + time.strftime(self.suffix, timeTuple)

#if os.path.exists(dfn):

# os.remove(dfn)

lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)

fcntl.fcntl(self.stream, fcntl.F_SETLKW, lockdata)

if not os.path.exists(dfn) and os.path.exists(self.baseFilename):

os.rename(self.baseFilename, dfn)

with open(self.baseFilename, 'a'):

pass

if self.backupCount > 0:

# find the oldest log file and delete it

#s = glob.glob(self.baseFilename + ".20*")

#if len(s) > self.backupCount:

# s.sort()

# os.remove(s[0])

for s in self.getFilesToDelete():

os.remove(s)

#print "%s -> %s" % (self.baseFilename, dfn)

if self.stream:

self.stream.close()

self.mode = 'a'

self.stream = self._open()

currentTime = int(time.time())

newRolloverAt = self.computeRollover(currentTime)

while newRolloverAt <= currentTime:

newRolloverAt = newRolloverAt + self.interval

#If DST changes and midnight or weekly rollover, adjust for this.

if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc:

dstNow = time.localtime(currentTime)[-1]

dstAtRollover = time.localtime(newRolloverAt)[-1]

if dstNow != dstAtRollover:

if not dstNow: # DST kicks in before next rollover, so we need to deduct an hour

newRolloverAt = newRolloverAt - 3600

else: # DST bows out before next rollover, so we need to add an hour

newRolloverAt = newRolloverAt + 3600

self.rolloverAt = newRolloverAt

参考:

python日志模块logging

python日志模块logging   1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...

Python 日志模块 logging通过配置文件方式使用

vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...

Python&lpar;2&period;7&period;6&rpar; 标准日志模块 - Logging Handler

Python 标准日志模块使用 Handler 控制日志消息写到不同的目的地,如文件.流.邮件.socket 等.除了StreamHandler. FileHandler 和 NullHandler ...

python 重要的日志模块logging

一,logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

【python】【logging】python日志模块logging常用功能

logging模块:应用程序的灵活事件日志系统,可以打印并自定义日志内容 logging.getLogger 创建一个log对象 >>> log1=logging.getLogger ...

Python 日志模块logging

logging模块: logging是一个日志记录模块,可以记录我们日常的操作. logging日志文件写入默认是gbk编码格式的,所以在查看时需要使用gbk的解码方式打开. logging日志等级: ...

Python日志模块logging用法

1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...

Python日志模块logging&amp&semi;JSON

日志模块的用法 json部分 先开一段测试代码:注意  str可以直接处理字典   eval可以直接将字符串转成字典的形式 dic={'key1':'value1','key2':'value2'} ...

python中的第三方日志模块logging

基本上每个系统都有自己的日志系统,可以使自己写的,也可以是第三方的.下面来简单介绍一下python中第三方的日志模块,入手还是比较简单的,但是也很容易给自己埋雷. 下面是我参考的资料链接 入手demo ...

随机推荐

本科小白学ROS 和 SLAM(一):杂谈

本人最近才迷恋上ROS(Robot Operating System),准确的说应该是6月中旬,具体的记不清了(可能是年纪大了,容易健忘).对于一个电子DIY的狂热爱好者来说,我在校的梦想就是做一个属 ...

iOS - PassData

前言 页面传值: 复合传值 单例传值 userDefaults 传值 代理传值 Block/闭包传值 1.复合传值 复合 - 正向传值 1.接收方,头文件中创建可存放传递值的属性变量 2.发送方,包含 ...

JQery w3school学习第一章 标签的隐藏和显示

鄙人初学JQuery,最关键的是JQuery获取标签对象的方式 这一章学习的是点击按钮让所有标签的文字以及标签栏的位置隐藏起来,因为单纯的隐藏文字,还是会有空格和空行的影响 这里最关键的代码就是 $( ...

Asp&period;Net底层解析

写的很好的一篇文章,但由于不能转载 所以把链接发在这里,以方便自己以后看 http://blog.csdn.net/mlcactus/article/details/8564347 http://ji ...

easy ui example

http://www.jeasyui.com/tutorial/index.php http://www.w3cschool.cc/jeasyui/jqueryeasyui-tutorial.html

Strtus2工作流程及原理

从上图可以看出,一个请求在Struts2 框架中的处理大概分为以下几个步骤:1.客户端初始化一个指向Servlet 容器(例如Tomcat)的请求:2.这个请求经过一系列的过滤器(Filter)(这些 ...

进程间通讯之mmap文件共享

进程间通讯之mmap文件共享 引文: 个人名言:“同一条河里淹死两次的人,是傻子,淹死三次及三次以上的人是超人”.经历过上次悲催的面试,决定沉下心来,好好的补充一下基础知识点.本文是这一系列第一篇:进 ...

eclipse中英文(等各国语言)版本转换发放

eclipse界面语言的切换方法 1.该方法只支持安装过中文包的eclipse(其实中文包中几乎包含了全世界所有的语言,只是调用了其中的中文简体而已) 2.在桌面的快捷方式中目标的地址后面加上参数-n ...

Centos下安装Python的问题汇总

Python下载地址(https://www.python.org/ftp/python/) 一.工具安装 1.Python的安装 tar vxf Python-2.7.13.tgz cd Pytho ...

限制TextBox只允许输入数字和字母

设置TextBox控件属性 ImeMode=Disable ShortcutsEnabled=False VB.NET Private Sub TextBox1_KeyDown(sender As O ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值