Python 日志组件Logging 使用手札 (一)

1 题外话

虽然Python很火很火,可是我也是最近一年才开始用Python的,在此之前我是很坚定的Java党的,不过现在用上了Python,突然觉得Python是很有魔性的,所以渐渐的也用了多了起来。

很久之前,还准备把Java学好之后就好好在学下C++的,不过感觉现在自己的兴趣点完全不在于那一丢丢的性能了,而是在乎与更加简洁、方便,以及最重要的,能追随潮流的,所以我还是老实Java和Python好了。

为什么要用到日志呢,因为很多时候我们在程序中出了一点什么问题,其实也还是希望能够反映出来的,而如果只是单纯的print的话,一是不直观不方便,二是管理也不方便,所以就用相应的日志组件好了。

2 logging

在Python 2.7当中,自带的库logging就可以作为最基本的日志记录组建,使用起来也很简单,注意默认情况下logging的输出等级是warning,下面我们来看第一个case:

# -*- coding:utf-8 -*-
import logging as LOG

def case_1():
    ''' 默认情况下logging仅仅显示warning级别的日志 其中级别是:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET :return: '''
    LOG.debug('This is a debug message')
    LOG.info('This is a info message')
    LOG.warning('This is a warning message')

case_1()

而我们预期输出的结果只是这样的,因为默认只输出warning等级的日志

C:\Python27\python.exe C:/Users/72770/PycharmProjects/CamSonar/Log/LogTest.py
WARNING:root:This is a warning message

Process finished with exit code 0

而如果我们需要自定义日志的消息格式和内容时应该怎么办呢?毕竟这太简单了,满足不了我们的需求,对吧?
我们可以调整logging的参数,以达到自定义效果的方法,其中按照如下的方法

def case_2():
    ''' 使用basicConfig做参数配置 :return: '''
    LOG.basicConfig(level= LOG.DEBUG)
    LOG.debug('This is a debug message')
    LOG.info('This is a info message')
    LOG.warning('This is a warning message')

如果这时候运行,我们就可以看到:

C:\Python27\python.exe C:/Users/72770/PycharmProjects/CamSonar/Log/LogTest.py
DEBUG:root:This is a debug message
INFO:root:This is a info message
WARNING:root:This is a warning message

Process finished with exit code 0

是不是比起之前来说,多了其他警告等级的信息。

3 参数配置

很多情况下,我们需要连带输出时间啊,行号啊,这时候需要怎么处理呢?其实方法很简单,还是使用上文的那个配置方法,但是需要传入更多的参数

def case_3():
    ''' 使用basicConfig做参数配置 :return: '''
    LOG.basicConfig(level=LOG.DEBUG,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S')

    LOG.debug('This is a debug message')
    LOG.info('This is a info message')
    LOG.warning('This is a warning message')

在这里,我们使用了format去规定了其输出的格式,并且指定了相应的时间输出格式。

C:\Python27\python.exe C:/Users/72770/PycharmProjects/CamSonar/Log/LogTest.py
Mon, 11 Jul 2016 20:42:08 LogTest.py[line:34] DEBUG This is a debug message
Mon, 11 Jul 2016 20:42:08 LogTest.py[line:35] INFO This is a info message
Mon, 11 Jul 2016 20:42:08 LogTest.py[line:36] WARNING This is a warning message

Process finished with exit code 0

关于这里的具体格式,我从网络摘抄到一些配置,供大家参考:

filename:   用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:   文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:      指定handler使用的日志显示格式。 
datefmt:    指定日期时间格式。 
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            用户输出的消息

4 输出到文件

日志这种东西,除了在屏幕上看到,我们更希望的是在文件中查看,以方便我们随时查看问题。
输出到文件,其实从上面一章当中可以看到有相关的参数可以完成,这里就直接给出代码,试试运行后是不是在目录下多了一个log文件了?

def case_4():
    ''' 使用basicConfig做参数配置 :return: '''
    LOG.basicConfig(level=LOG.DEBUG,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename='test.log',
                    filemode='w')

    LOG.debug('This is a debug message')
    LOG.info('This is a info message')
    LOG.warning('This is a warning message')

5 参照

1、http://blog.csdn.net/azhao_dn/article/details/7320186

更新待续

你可能感兴趣的:(Python++,环境配置)