• 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)

  • 相关阅读:
    The Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/Pierre-de-Ronsard/p/3180792.html
Copyright © 2020-2023  润新知