Выборочная настройка уровня ведения консоли

Я пытаюсь использовать заглушку 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()

Как настроить только ведение журнала консоли на уровень ПРЕДУПРЕЖДЕНИЕ, или, что еще лучше, полностью отключить, не отказываясь от ведения журнала файлов?

2 ответа

Итак, покопавшись в коде, я обнаружил следующую подсказку:

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

Теперь ведется логирование файлов, но консоль не запускается.

Что-то вроде этого:

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 идут в файл. Все от вашего модуля до консоли. Одним из ключевых здесь является пропаганда!

Другие вопросы по тегам