zoukankan      html  css  js  c++  java
  • 使用 logger 在脚本中输出多个日志

    最近在写一个小工具的时候,在某个脚本中需要为不同对象,输出单独的属于该对象的日志文件,方便查看。

    通常在写 python 脚本的时候,习惯使用 logging 模块来输出日志,简单,方便。

    #!/usr/bin/env python
    # coding: utf-8
    
    __author__ = "Glon Ho"
    
    import logging
    
    
    log_file = '/tmp/logging_test.log'
    
    logging.basicConfig(level=logging.INFO,
            format='%(asctime)s %(levelname)s %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S',
            filename=log_file,
            filemode='a')
    
    msg = 'Hi, this is Glon.'
    logging.info('>>> test log msg: %s', msg)
    
    ---
    
    Out:
    
    [root@localhost]$ cat /tmp/logging_test.log
    2017-03-03 17:53:08 INFO >>> test log msg: Hi, this is Glon.
    

    但在这个需求中,如果使用 logging 模块通过复杂配置来实现的话,未免显得麻烦。

    但是在查阅 logging 模块文档的时候,发现有一个 logger 的对象。写日志是针对对象来写的,如果有多个对象,那么应该就可以实现。

    #!/usr/bin/env python
    # coding: utf-8
    
    __author__ = "Glon Ho"
    
    import logging
    
    
    def get_logger(logger_name, log_file, level=logging.INFO):
        formatter = logging.Formatter('%(asctime)s : %(message)s', "%Y-%m-%d %H:%M:%S")
        fileHandler = logging.FileHandler(log_file, mode='a')
        fileHandler.setFormatter(formatter)
    
        vlog = logging.getLogger(logger_name)
        vlog.setLevel(level)
        vlog.addHandler(fileHandler)
    
        return vlog
    
    
    if __name__ == '__main__':
    
        log_file1='/tmp/logger_test1.log'
        log_file2='/tmp/logger_test2.log'
        
        logger1 = get_logger('Glon', log_file1)
        logger2 = get_logger('GlonHo', log_file2)
    
        logger1.info('>>> test1 log msg: %s', "111111111111111111111")
        logger2.info('>>> test2 log msg: %s', "222222222222222222222")
    
    ---
    
    Out:
    
    [root@localhost]$ ls /tmp/logger_test*
    /tmp/logger_test1.log  /tmp/logger_test2.log
    [root@localhost]$ 
    [root@localhost]$ cat /tmp/logger_test1.log 
    2017-03-03 17:57:20 : >>> test1 log msg: 111111111111111111111
    [root@localhost]$ 
    [root@localhost]$ cat /tmp/logger_test2.log 
    2017-03-03 17:57:20 : >>> test2 log msg: 222222222222222222222
    
    

    注意

    在通过 get_logger 来得到日志对象的时候,给定的对象名称不能相同,否则产生的是同一个日志对象。

    如上面变成这样

        logger1 = get_logger('Glon', log_file1)
        logger2 = get_logger('Glon', log_file2)
    
        logger1.info('>>> test1 log msg: %s', "111111111111111111111")
        logger2.info('>>> test2 log msg: %s', "222222222222222222222")
    
    

    运行程序时不会出错,但输出:

    ---
    
    Out:
    
    [root@localhost]$ ls /tmp/logger_test*
    /tmp/logger_test1.log  /tmp/logger_test2.log
    [root@localhost]$ 
    [root@localhost]$ cat /tmp/logger_test1.log 
    2017-03-03 17:59:41 : >>> test1 log msg: 111111111111111111111
    2017-03-03 17:59:41 : >>> test2 log msg: 22222222222222222222
    [root@localhost]$ 
    [root@localhost]$ cat /tmp/logger_test2.log 
    2017-03-03 17:59:41 : >>> test1 log msg: 111111111111111111111
    2017-03-03 17:59:41 : >>> test2 log msg: 222222222222222222222
    

    参考:

    logging:https://docs.python.org/2/library/logging.html

    中文译本:http://pythonguidecn.readthedocs.io/zh/latest/writing/logging.html

    Loggers:https://docs.python.org/2/howto/logging.html#loggers

    作者:GlonHo
    博客:hejl.cc
    出处:GlonHo 的博客 http://www.cnblogs.com/glon
    您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。
  • 相关阅读:
    c# TCP高性能通信
    c#实现的HTTP服务端
    c#的二进制序列化组件MessagePack介绍
    c# 任务超时执行
    c#项目总结
    etcd客户端c#
    开发的服务集群部署方案,以etcd为基础(java)
    udt的java版本judt项目持续升级1.2版本
    udt通信java再次升级1.1版
    (转)Spring Boot(二) & lombok
  • 原文地址:https://www.cnblogs.com/glon/p/6497936.html
Copyright © 2011-2022 走看看