【问题标题】:Python logging with Config file working with only 1 file使用 Config 文件的 Python 日志记录仅使用 1 个文件
【发布时间】:2019-07-23 08:00:45
【问题描述】:

我是 python 新手并试图理解日志记录(虽然我对编程一点也不陌生)。试图复制我们在 Java 中拥有的 log4j 记录器。有以下文件的简单测试项目: - 用户.py - 测试.py - 会议/ - 日志记录.conf - 日志

所有的 python 文件都有记录器对象来记录到 logging.conf 中提到的特定文件。但是,只有 Test.py 文件转储日志。不是 User.py 文件。

User.py如下:

    import logging
    import logging.config

    logging.config.fileConfig('conf/logging.conf')
    logger = logging.getLogger(__name__)

    class User:
        username = ""
        password = ""
        def __init__(self, username = "username", password = "password"):
            global logger
            logger.debug( "In User constructor" );
            self.username = username
            self.password = password
            logger.debug( "Out User constructor" );

        def getSomething(self) :
            return "Something"

        def login_user(self) :
            logger.debug( "In login_user" );
            logger.debug( "Out login_user" );
            return "Logged In"

Test.py如下:

    from User import User
    import logging
    import logging.config
    from threading import Thread

    logging.config.fileConfig('conf/logging.conf')
    logger = logging.getLogger(__name__)

    objectsCount = 1
    logger.debug("In VolumeTest")

    def thr_func(username, password):
        logger.info("In thr_func")
        user1 = User(username, password)
        logger.info("Created user obj")
        logger.info("Before login_user call")
        token = user1.login_user()
        logger.debug ( "Out thr_func")

    def main() :    
        thr_func( "abc", "def" )

        logger.info("In Main")
        thr_objects = []
        for i in range(objectsCount):
            thread = Thread(target=thr_func, args=("subhayan", "MER2018"))
            thr_objects.append(thread)

        logger.info("Main    : before running thread")

        for i in range(objectsCount):
            logger.info("Main    : starting thread " + str(i))
            thr_objects[i].start()
            logger.info("Main    : started thread " + str(i))

        logger.info("Main    : wait for the thread to finish")

        for i in range(objectsCount):
        thr_objects[i].join()
    logger.info("Main    : all done")    

if __name__ == "__main__":
    main()

logging.conf 文件如下:

    [loggers]
    keys=root

    [handlers]
    keys=logfile

    [formatters]
    keys=logfileformatter

    [logger_root]
    level=DEBUG
    handlers=logfile

    [formatter_logfileformatter]
    format=%(asctime)s %(name)-12s: %(threadName)s : %(levelname)s : %(message)s

    [handler_logfile]
    #class=handlers.RotatingFileHandler
    class=handlers.TimedRotatingFileHandler
    #class=TimedCompressedRotatingFileHandler
    level=DEBUG
    #args=('testing.log','a',10,100)
    args=('log/testing.log','d', 1, 9, None, False, False)
    formatter=logfileformatter

我尝试使用:“python Test.py”运行。但是,没有来自用户文件的日志所以,问题是,我们不能以这种方式记录第二个文件吗?我究竟做错了什么 ?如果没有错,在 python 中执行此操作的最佳方法是什么?

【问题讨论】:

    标签: python logging configuration


    【解决方案1】:

    我发现有几件事可能是问题所在: 1)您正在运行 2 个单独的记录器:每个文件都在实例化它自己的记录器指向同一个文件。 2)如果您希望所有内容都在同一个文件中,则创建一个记录器并通过全局变量将引用传递给其他模块。我发现创建一个 log.py 文件来创建和写入日志文件,然后将该模块导入其他模块更容易。 2)您的配置文件中有一个文件处理程序和一个格式化程序,但似乎没有在代码中设置它。像

    handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, ...
    f = logging.Formatter('%(process)d %(asctime)s %(levelname)s: %(message)s')
    handler.setFormatter(f)
    logger.addHandler(handler)
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      感谢 tbitson 的指点。这是修改后的代码。

      import logging
      import logging.config
      
      logging.config.fileConfig('conf/logging.conf')
      logger = logging.getLogger(__name__)
      

      修改后的User.py为:

      from logger import logger
      
      class User:
          username = ""
          password = ""
          def __init__(self, username = "username", password = "password"):
              global logger
              logger.debug( "In User constructor" );
              self.username = username
              self.password = password
              logger.debug( "Out User constructor" );
      
          def getSomething(self) :
              return "Something"
      
          def login_user(self) :
              logger.debug( "In login_user" );
              logger.debug( "Out login_user" );
              return "Logged In"
      

      修改后的Test.py为: 从用户导入用户 从记录器导入记录器 从线程导入线程

      objectsCount = 1
      logger.debug("In VolumeTest")
      
      def thr_func(username, password):
          logger.info("In thr_func")
          user1 = User(username, password)
          logger.info("Created user obj")
          logger.info("Before login_user call")
          token = user1.login_user()
          logger.debug ( "Out thr_func")
      
      def main() :    
          thr_func( "abc", "def" )
      
          logger.info("In Main")
          thr_objects = []
          for i in range(objectsCount):
              thread = Thread(target=thr_func, args=("subhayan", "MER2018"))
              thr_objects.append(thread)
      
          logger.info("Main    : before running thread")
      
          for i in range(objectsCount):
              logger.info("Main    : starting thread " + str(i))
              thr_objects[i].start()
              logger.info("Main    : started thread " + str(i))
      
          logger.info("Main    : wait for the thread to finish")
      
          for i in range(objectsCount):
              thr_objects[i].join()
          logger.info("Main    : all done")    
      
      if __name__ == "__main__":
          main()
      

      【讨论】:

        猜你喜欢
        • 2015-07-11
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 2012-06-13
        • 2014-10-21
        • 1970-01-01
        • 2011-05-09
        • 2012-11-18
        相关资源
        最近更新 更多