logging--python的日志插件
以下链接对logging的基本用法描述的非常清晰:
http://blog.csdn.net/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)