【问题标题】: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
      相关资源
      最近更新 更多