python日志浅析

输出日志对于追踪问题比较重要。

默认logger(root)

python使用logging模块来处理日志。通常下面的用法就能满足常规需求:

import logging
logging.debug(‘some debug level info....‘)#debug级别消息
logging.info(‘some info level info...‘)#info级别消息
logging.warn(‘some warning level info...‘)#warning级别消息
logging.critical(‘some critical level info...‘)#critical级别消息
logging.error(‘some error level info...‘)#error级别消息

输出类似:

[2015-01-07 10:11:34,579](DEBUG)root : adsfaf

即:

[时间](级别)logger名称:消息

默认输出到console。

自定义logger

如果某个模块有个性的需求,比如,记录到文件,或者发送邮件。那么问题来了,怎么破?

如果发生了某种严重的情况,想要发送邮件的话,需要自己定义一个logger,并设置好级别(setLevel(logging.CRITICAL))以及处理器(logging.handlers.SMTPHandler),demo如下:

import logging
logger = logging.getLogger(‘email_logger‘)
logger.setLevel(logging.CRITICAL)
mail_handler= logging.handlers.SMTPHandler(‘your_mail_host_ip‘,‘from_addr‘,‘to_addr‘,‘critical and above level msg from xxx ‘)

logging.info(‘blablabla...‘)
logging.error(‘notice please, an error happens when ...‘)

记录文件,需要有文件处理器(logging.FileHandler)。demo如下:

import logging
logger = logging.getLogger(‘file_logger‘)
logger.addHandler(logging.FileHandler(‘all.log‘))
logger.info(‘some info...‘)

还需要其他的handler?参考这里

配置型logger

是否已经厌倦了写代码的方式来自定义logger?好吧,它可以有更多的配置。可以参考这里

三种方式:

1. 上面已经提到了

2. 通过fileConfig读取配置文件

以下来自官方demo

import logging
import logging.config

logging.config.fileConfig(‘logging.conf‘)

# create logger
logger = logging.getLogger(‘simpleExample‘)

# ‘application‘ code
logger.debug(‘debug message‘)
logger.info(‘info message‘)
logger.warn(‘warn message‘)
logger.error(‘error message‘)
logger.critical(‘critical message‘)

配置文件:

[loggers]
keys=root,simpleExample

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

输出:

$ python simple_logging_config.py
2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample - INFO - info message
2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message

 

配置文件说明:

声明部分:

[loggers]

keys = xxx,xxxx

[handlers]

keys = xxx,xxx

[formatters]

keys =xxx,xxx

 

赋值部分

logger赋值

[logger_xxx]
level = DEBUG/INFO/WARN/CRITICAL/ERROR
handlers = [handlers]里定义的handler
qualname = logger名
propagate = 1/0 #是否将log丢给上一级处理

  

handler赋值

[handler_xxx]
class = StreamHander/FileHander/handlers.SMTPHandler...
args = 传递给上面class的参数
level = DEBUG/INFO/WARN/CRITICAL/ERROR #是否处理,可以和logger的不同
formatter = [formatters]中定义的格式器

比较有用的一个handlers配置

[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
args=(‘xxx.log‘, ‘a‘, 2000000, 9)#日志超过2000000 d的时候,重新另外生成一个文件,保存9天的记录
...

  

formatter赋值

[formatter_xxx]
format = %(var)s # var:asctime/name/levelname/message/ip/user/module/process/thread...

  

logging.config.fileConfig的特别说明:

disable_existing_loggers是一个可选参数,默认为True。它会阻止在fileConfig语句前面的logger的正常执行。其设计目的是为了反向兼容。

要使得所有的logger都有效,要么在配置文件中,将前面的logger给配置进去。

要么将它改为False。

3. 通过dictConfig读取配置dict

django 就使用了这种方式,配置dict如下:

LOGGING = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: True,
    ‘formatters‘: {
        ‘verbose‘: {
            ‘format‘: ‘%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s‘
        },
        ‘simple‘: {
            ‘format‘: ‘%(levelname)s %(message)s‘
        },
    },
    ‘filters‘: {
        ‘special‘: {
            ‘()‘: ‘project.logging.SpecialFilter‘,
            ‘foo‘: ‘bar‘,
        }
    },
    ‘handlers‘: {
        ‘null‘: {
            ‘level‘:‘DEBUG‘,
            ‘class‘:‘django.utils.log.NullHandler‘,
        },
        ‘console‘:{
            ‘level‘:‘DEBUG‘,
            ‘class‘:‘logging.StreamHandler‘,
            ‘formatter‘: ‘simple‘
        },
        ‘mail_admins‘: {
            ‘level‘: ‘ERROR‘,
            ‘class‘: ‘django.utils.log.AdminEmailHandler‘,
            ‘filters‘: [‘special‘]
        }
    },
    ‘loggers‘: {
        ‘django‘: {
            ‘handlers‘:[‘null‘],
            ‘propagate‘: True,
            ‘level‘:‘INFO‘,
        },
        ‘django.request‘: {
            ‘handlers‘: [‘mail_admins‘],
            ‘level‘: ‘ERROR‘,
            ‘propagate‘: False,
        },
        ‘myproject.custom‘: {
            ‘handlers‘: [‘console‘, ‘mail_admins‘],
            ‘level‘: ‘INFO‘,
            ‘filters‘: [‘special‘]
        }
    }
}

转载请注明,本文来自Tommy.Yu的博客。谢谢!

时间: 2024-10-19 21:15:21

python日志浅析的相关文章

Python日志之Python函数

Python日志之Python函数: 一.认识函数 1.什么是函数 函数,function,通俗来说,函数,就是功能的意思,函数是用来封装特定功能的,比如,在Python中,len()是一个函数,len()这个函数实现的功能可能是返回一个字符串的长度,所以说len()这个函数他的特定功能就是返回长度,再比如,我们可以定义一个函数,然后编写这个函数的功能,之后要使用的时候再调用这个函数.所以函数分为两种类型,一种是系统自带的不用我们编写其功能的,比如len()这种函数,再一种就是我们自己定义的,需

python日志分析

微秒   毫秒 datetime seek定位指针 从行尾到行首 fd.seek(-2,1)  1  当前位置 fd.tell() fd.seek(-2,2)  2   最后位置 fd.tell() fd.seek(0,0)   0  最前位置 read(1)读一位    read() 全部都读 tac与cat    行首到行尾 reversed   翻转字符串 只读一部分    通过时间判断 200 404  503  十分钟之内   第八列  apache.log 1.首先匹配时间格式, D

Windows日志浅析(五)

Windows日志浅析(五) (2010-04-12 23:22:17) 转载▼ 标签: 杂谈 分类: MSN搬家 上一篇文章简单分析了用户登录时的认证事件,接下来我们再来看看和之紧密关联的登录/登出事件. 总体来看,登录/登出事件对可以很好地追踪用户在一台主机上完整活动过程的起至点,和登录方式无关.此外可以提供一些“帐户登录”没有的信息,例如登录的类型.此外对终端服务的活动专门用两个事件ID来标识.ok,我们开始分析,同样从5种类型分别进行分析. 1.本地方式的登录和登出 Randy大神在书中

Python 日志工具(logging) 基础教程

什么是 logging ? 日志是跟踪软件运行时发生的事件,软件的开发人员可以通过日志快速的定位问题的位置.事件也分重要性即事件的严重程度. 什么时候使用日志? logging 提供了一组方便操作日志记录的功能,这些是 debug(), info(),warning(),error(),critical(). 通过想要执行的任务确定使用日志记录的方法. 你想要执行的任务 日志记录的最佳方法 一个脚本或程序显示在终端上 print() 程序正常运行过程中发生的事件 logging.info() o

Python日志产生器

Python日志产生器 写在前面 有的时候,可能就是我们做实时数据收集的时候,会有一个头疼的问题就是,你会发现,你可能一下子,没有日志的数据源.所以,我们可以简单使用python脚本来实现产生实时的数据,这样就很方便了 在编写代码之前,我们得知道我们的webserver日志到底长什么样,下面我找了一段的nginx服务器上真实日志,作为样例: 223.104.25.1 - - [21/Nov/2017:20:34:16 +0800] "GET / HTTP/1.1" 200 94 &qu

浅析python日志重复输出问题

[TOC] 问题起源: ? 在学习了python的函数式编程后,又接触到了logging这样一个强大的日志模块.为了减少重复代码,应该不少同学和我一样便迫不及待的写了一个自己的日志函数,比如下面这样: # 这里为了便于理解,简单的展示了一个输出到屏幕的日志函数 def my_log(): logger = logging.getLogger('mysql.log') ch = logging.StreamHandler() ch.setLevel(logging.ERROR) fmt = log

Python日志库的用法

日志不管对于开发或者运维都是一项非常重要的东西,它可以用来排错,解决故障,统计分析等. 本文介绍python中的日志库的用法. 日志库:import logging 要用日志需要先定义以下东西: 获取日志名,比如 logging.getLogger(__name__) 定义Handler,比如 logging.FileHandler('/var/log/messages') 设置级别,比如 fh.setLevel(logging.DEBUG) 定义格式,比如 formatter = loggin

python日志输出

import logging logger = logging.getLogger()  #生成一个日志对象,()内为日志对象的名字,可以不带,名字不给定就是root handler=logging.FileHandler("Log_test.txt")  #生成一个handler(处理器), #formatter 下面代码指定日志的输出格式 fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s' f

python日志的记录与保存

python程序中记录日志的方法详细可参考以下链接:http://blog.chinaunix.net/uid-27571599-id-3492860.html 在没有指定写入某日志文件的情况下,日志直接在控制台中显示.默认的日志级别是ERROR,所以如果忘了修改默认日志级别,低于此级别的日志将不会被记录. 另外注意一点,做日志测试时,文件不要命名为“logging.py”,否则将会出现AttributeError: 'module' object has no attribute 'basic