• python--logging


    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)

  • 相关阅读:
    Android DisplayMetrics 获取和屏幕相关的信息
    【IOS开发—视图控制器】
    【IOS开发—视图】
    【Spdy协议简介】
    三维数组
    一维数组
    闰年判断
    使用switch case语句来显示月份的对应天数
    使用for循环嵌套实现乘法口诀表
    判断一个数的奇偶性
  • 原文地址:https://www.cnblogs.com/Pierre-de-Ronsard/p/3180792.html
Copyright © 2020-2023  润新知