【问题标题】:selectively setting the console logging level有选择地设置控制台日志记录级别
【发布时间】:2015-03-09 14:06:25
【问题描述】:

我正在尝试在测试期间使用 FTP 服务器存根。我不想要控制台输出,但我想将日志记录到文件中。

我希望 FTP 服务器在不同的进程中运行,所以我使用多处理。

我的代码如下将所有日志记录设置为级别WARNING:

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
import pyftpdlib.log as pyftpdliblog
import os
import logging
import multiprocessing as mp

authorizer = DummyAuthorizer()
authorizer.add_user('user', '12345', '.', perm='elradfmwM')
handler = FTPHandler
handler.authorizer = authorizer

pyftpdliblog.LEVEL = logging.WARNING
logging.basicConfig(filename='pyftpd.log', level=logging.INFO)
server = FTPServer(('', 2121), handler)

def main():
    p = mp.Process(target=server.serve_forever)
    p.start()


if __name__ == '__main__':
    main()

如何仅将控制台日志记录设置为 WARNING 级别,或者更好的是完全关闭而不放弃文件日志记录?

【问题讨论】:

    标签: python logging pyftpdlib


    【解决方案1】:

    所以,在深入挖掘代码之后,我发现了以下提示:

    # This is a method of FTPServer and it is called before 
    # server.serve_forever
    def _log_start(self):
        if not logging.getLogger('pyftpdlib').handlers:
            # If we get to this point it means the user hasn't
            # configured logger. We want to log by default so
            # we configure logging ourselves so that it will
            # print to stderr.
            from pyftpdlib.ioloop import _config_logging
            _config_logging()
    

    所以,我所要做的就是定义我自己的适当处理程序:

    logger = logging.getLogger('pyftpdlib')
    logger.setLevel(logging.INFO)
    hdlr = logging.FileHandler('pyftpd.log' )
    logger.addHandler(hdlr)
    

    现在,有文件记录,但控制台记录不会启动。

    【讨论】:

      【解决方案2】:

      类似这样的:

      import logging
      
      date_format = "%Y/%m/%d %H:%M:%S"
      log_file_path = "my_file.txt"
      
      root_logger = logging.getLogger()
      root_logger.setLevel(logging.DEBUG)
      
      # own_module_logger = logging.getLogger(__name__)
      pyftpdlib_logger = logging.getLogger("pyftpdlib")
      
      # Setup logging to file (Only pyftpdlib)
      filehandler = logging.FileHandler(filename = log_file_path)
      filehandler.setLevel(logging.DEBUG)
      fileformatter = logging.Formatter(fmt = "%(asctime)s - %(levelname)-8s - %(name)s.%(funcName)s - %(message)s",
                                        datefmt = date_format)
      filehandler.setFormatter(fileformatter)
      pyftpdlib_logger.addHandler(filehandler)
      pyftpdlib_logger.propagate = False
      
      # Setup logging to console (All other)
      console = logging.StreamHandler()
      console.setLevel(logging.INFO)
      consoleformatter = logging.Formatter(fmt = "%(asctime)s - %(levelname)-8s - %(name)s.%(funcName)s - %(message)s",
                                           datefmt = date_format)
      console.setFormatter(consoleformatter)
      root_logger.addHandler(console)
      
      # Do your loggings
      a = logging.getLogger()
      a.info('root I')
      a.debug('root D')
      
      b = logging.getLogger("pyftpdlib")
      b.info('P I')
      b.debug('P D')
      
      logging.shutdown()
      

      所以 pyftpdlib 的日志记录到文件中。从你的模块到控制台的一切。这里的关键之一是传播!

      【讨论】:

      • 我不想从我的模块更改日志记录,因为它在 unittest.TestCase 内部。
      • 我不明白你的意思。如果您从我的代码中调用设置文件处理程序的部分,那么在您从 pyftpdlib 模块调用任何内容之前,它应该可以工作。
      • 在下面查看我的答案。主要是您的解决方案有效,但需要我的开销。当我发布我的解决方案时,我没有看到你的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2014-11-24
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多