python--logging

本文探讨了Python中使用logging模块记录多线程日志的方法,并解决了如何让不同线程的日志输出到不同文件的问题。文章还介绍了logger实例的创建与配置过程。

logging--python的日志插件

以下链接对logging的基本用法描述的非常清晰:

http://blog.youkuaiyun.com/fxjtoday/article/details/6307285

目前在使用logging时,出现了个问题:

有个很奇怪的想法,就是在线程中使用logging,每个线程的日志写在不同的文件中,如下:

import logging
import sys
from time import sleep, ctime
from myThread import MyThread

def testlogging(logpath):
    LOG_PATH = logpath
    print "in",LOG_PATH
    logger = logging.getLogger()
    formatter = logging.Formatter('%(name)-12s %(asctime)s %(levelname)-8s %(message)s', '%a, %d %b %Y %H:%M:%S',)
    file_handler = logging.FileHandler(LOG_PATH)
    file_handler.setFormatter(formatter)
    stream_handler = logging.StreamHandler(sys.stderr)
    logger.addHandler(file_handler)
    logger.addHandler(stream_handler)
    logger.setLevel(logging.ERROR)
    for i in range(10):
        sleep(1)
        logger.error(str(logpath)+" fuckgfw")
    logger.removeHandler(stream_handler)

def main():
    threads= []
    path = ["0000.log","1111.log","2222.log"]
    for i in range(len(path)):
        print path[i]
        t = MyThread(testlogging,(path[i],),i)
        threads.append(t)
    for i in range(len(path)):
        threads[i].start()
        sleep(1)
        
    for i in range(len(path)):
        threads[i].join()
        
if __name__ == "__main__":
    main()

理想的认为,起三个线程,他们输出分别是写在0000.log,1111.log,2222.log里面,程序运行以后,三个线程的输出分别全部打印到了0000.log,1111.log,2222.log里面。

不知道是为什么?

原来在看资料的时候没有看仔细,着急干活,急急忙忙就试了一下,把最重要的一句话给忘了

“对同一个名字的多个调用logging.getLogger()方法会返回同一个logger对象.这种命名方式里面,后面的loggers是前面logger的子.比如说,有一个名字是foo的logger,那么诸如foo.bar,foo.bar.baz和foo.bam这样的logger都是foo这个logger的子,子loggers自动继承父loggers的log信息,正因为此,没有必要把一个应用的所有logger都配置一边,只要把顶层的logger配置好了,然后子logger根据需要继承就行了.”


改成下面的形式:

logger = logging.getLogger(name)

 

 

使用python的logging模块
http://bbs.chinaunix.net/thread-3590256-1-1.html

1、logging.getLogger([name])
返回一个logger实例,如果没有指定name,返回root logger。
只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是
一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到 
同一个logger实例

2、Logger.setLevel(lvl)
设置logger的level, level有以下几个级别:

小于此级别的日志将不会被输出

3、对变量的输出

a=10

logger.error("output float %10.3f"%(time.time()*1000)+"output int%d"%a)

 

转载于:https://www.cnblogs.com/Pierre-de-Ronsard/p/3180792.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值