Как вставить новую строку в ведение журнала python?


20 принят

У меня есть два решения, первое очень простое, но выход не очень чистый. Второй метод даст точный результат, который вы хотите, но он немного более активен.

Способ 1

Чтобы создать пустую строку, просто запишите пустую строку с новой строкой:

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S')
logging.info('hello')
logging.info('
')
logging.warning('new hello')

На выходе будет пустая информационная строка, которая не очень чистая:

16:07:26 INFO привет
16:07:26 INFO

16:07:26 ВНИМАНИЕ новый привет

Способ 2

В этом методе я создал два разных обработчика. console_handler, Который я использую большую часть времени. Когда мне нужна новая строка, я переключаюсь на второй обработчик blank_handler.

import logging
import types

def log_newline(self, how_many_lines=1):
    # Switch handler, output a blank line
    self.removeHandler(self.console_handler)
    self.addHandler(self.blank_handler)
    for i in range(how_many_lines):
        self.info('')

    # Switch back
    self.removeHandler(self.blank_handler)
    self.addHandler(self.console_handler)

def create_logger():
    # Create a handler
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_handler.setFormatter(logging.Formatter(fmt="%(name)s %(levelname)-8s: %(message)s"))

    # Create a "blank line" handler
    blank_handler = logging.StreamHandler()
    blank_handler.setLevel(logging.DEBUG)
    blank_handler.setFormatter(logging.Formatter(fmt=''))

    # Create a logger, with the previously-defined handler
    logger = logging.getLogger('logging_test')
    logger.setLevel(logging.DEBUG)
    logger.addHandler(console_handler)

    # Save some data and add a method to logger object
    logger.console_handler = console_handler
    logger.blank_handler = blank_handler
    logger.newline = types.MethodType(log_newline, logger)

    return logger

if __name__ == '__main__':
    logger = create_logger()
    logger.info('Start reading database')
    logger.info('Updating records ...')
    logger.newline()
    logger.info('Finish updating records')

Результат - это то, что вы хотите увидеть:

logging_test INFO    : Start reading database
logging_test INFO    : Updating records ...

logging_test INFO    : Finish updating records

обсуждение

  • Если вы можете мириться с результатом, отличным от совершенства, метод 1 - это путь. Преимущество состоит в том, чтобы быть простым, наименьшим количеством усилий.
  • Второй метод выполняет работу правильно, но это немного связано. Он создает два разных обработчика и переключает их для достижения вашей цели.
  • Другим недостатком использования метода 2 является изменение кода путем поиска loggingи замены их logger. Вы должны позаботиться о замене только соответствующих частей и оставить такой текст, как logging.DEBUGв такте.

Не могли бы вы добавить новую строку после первого приветствия? т.е.

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S')
logging.info('hello
')
logging.info('new hello')

Что будет выводить

2014-08-06 11:37:24,061 INFO    : hello

2014-08-06 11:37:24,061 INFO    : new hello

3

Используйте обычай, Formatterкоторый использует разные строки формата в разное время. Вы не можете использовать это basicConfig()- вам придется использовать другие части loggingAPI.

class MyFormatter(logging.Formatter):
    def format(self, record):
        # set self._fmt to value with or without newline,
        # as per your decision criteria
        # self._fmt = ...
        return super(MyFormatter, self).format(record)

Или вы можете вызвать superметод, а затем изменить строку, чтобы вставить новую строку перед ее возвратом (если это зависит от длины строки, скажем).


1

Самый простой способ вставить новые строки, которые я понял:

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s

%(message)s', datefmt='%H:%M:%S')
logging.info('hello')
logging.info('new hello')

11:50:32 INFO
привет
11:50:32 INFO
новый привет


1

В качестве альтернативы методу 2 Hai Vu вы также можете сбросить обработчик Formatterкаждый раз, когда хотите записать новую строку:

import logging
import types

def log_newline(self, how_many_lines=1):
    # Switch formatter, output a blank line
    self.handler.setFormatter(self.blank_formatter)

    for i in range(how_many_lines):
        self.info('')

    # Switch back
    self.handler.setFormatter(self.formatter)


def create_logger():
    # Create a handler
    handler = logging.StreamHandler()
    handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter(fmt="%(name)s %(levelname)-8s: %(message)s")        
    blank_formatter = logging.Formatter(fmt="")
    handler.setFormatter(formatter)


    # Create a logger, with the previously-defined handler
    logger = logging.getLogger('logging_test')
    logger.setLevel(logging.DEBUG)
    logger.addHandler(handler)

    # Save some data and add a method to logger object
    logger.handler = handler
    logger.formatter = formatter
    logger.blank_formatter = blank_formatter
    logger.newline = types.MethodType(log_newline, logger)

    return logger

if __name__ == '__main__':
    logger = create_logger()
    logger.info('Start reading database')
    logger.info('Updating records ...')
    logger.newline()
    logger.info('Finish updating records')

Вывод

logging_test INFO    : Start reading database  
logging_test INFO    : Updating records ...

logging_test INFO    : Finish updating records

Преимущество этого в том, что у вас есть один обработчик. Например, вы можете определить FileHandler's mode-трибут для записи, если вы хотите очистить свой лог-файл при каждом новом запуске вашей программы.

питон, каротаж, символ новой строки,

python,logging,newline,

18

Ответов: 7


20 принят

У меня есть два решения, первое очень простое, но выход не очень чистый. Второй метод даст точный результат, который вы хотите, но он немного более активен.

Способ 1

Чтобы создать пустую строку, просто запишите пустую строку с новой строкой:

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S')
logging.info('hello')
logging.info('
')
logging.warning('new hello')

На выходе будет пустая информационная строка, которая не очень чистая:

16:07:26 INFO привет
16:07:26 INFO

16:07:26 ВНИМАНИЕ новый привет

Способ 2

В этом методе я создал два разных обработчика. console_handler, Который я использую большую часть времени. Когда мне нужна новая строка, я переключаюсь на второй обработчик blank_handler.

import logging
import types

def log_newline(self, how_many_lines=1):
    # Switch handler, output a blank line
    self.removeHandler(self.console_handler)
    self.addHandler(self.blank_handler)
    for i in range(how_many_lines):
        self.info('')

    # Switch back
    self.removeHandler(self.blank_handler)
    self.addHandler(self.console_handler)

def create_logger():
    # Create a handler
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_handler.setFormatter(logging.Formatter(fmt="%(name)s %(levelname)-8s: %(message)s"))

    # Create a "blank line" handler
    blank_handler = logging.StreamHandler()
    blank_handler.setLevel(logging.DEBUG)
    blank_handler.setFormatter(logging.Formatter(fmt=''))

    # Create a logger, with the previously-defined handler
    logger = logging.getLogger('logging_test')
    logger.setLevel(logging.DEBUG)
    logger.addHandler(console_handler)

    # Save some data and add a method to logger object
    logger.console_handler = console_handler
    logger.blank_handler = blank_handler
    logger.newline = types.MethodType(log_newline, logger)

    return logger

if __name__ == '__main__':
    logger = create_logger()
    logger.info('Start reading database')
    logger.info('Updating records ...')
    logger.newline()
    logger.info('Finish updating records')

Результат - это то, что вы хотите увидеть:

logging_test INFO    : Start reading database
logging_test INFO    : Updating records ...

logging_test INFO    : Finish updating records

обсуждение

  • Если вы можете мириться с результатом, отличным от совершенства, метод 1 - это путь. Преимущество состоит в том, чтобы быть простым, наименьшим количеством усилий.
  • Второй метод выполняет работу правильно, но это немного связано. Он создает два разных обработчика и переключает их для достижения вашей цели.
  • Другим недостатком использования метода 2 является изменение кода путем поиска loggingи замены их logger. Вы должны позаботиться о замене только соответствующих частей и оставить такой текст, как logging.DEBUGв такте.

Не могли бы вы добавить новую строку после первого приветствия? т.е.

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S')
logging.info('hello
')
logging.info('new hello')

Что будет выводить

2014-08-06 11:37:24,061 INFO    : hello

2014-08-06 11:37:24,061 INFO    : new hello

3

Используйте обычай, Formatterкоторый использует разные строки формата в разное время. Вы не можете использовать это basicConfig()- вам придется использовать другие части loggingAPI.

class MyFormatter(logging.Formatter):
    def format(self, record):
        # set self._fmt to value with or without newline,
        # as per your decision criteria
        # self._fmt = ...
        return super(MyFormatter, self).format(record)

Или вы можете вызвать superметод, а затем изменить строку, чтобы вставить новую строку перед ее возвратом (если это зависит от длины строки, скажем).


1

Самый простой способ вставить новые строки, которые я понял:

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s

%(message)s', datefmt='%H:%M:%S')
logging.info('hello')
logging.info('new hello')

11:50:32 INFO
привет
11:50:32 INFO
новый привет


1

В качестве альтернативы методу 2 Hai Vu вы также можете сбросить обработчик Formatterкаждый раз, когда хотите записать новую строку:

import logging
import types

def log_newline(self, how_many_lines=1):
    # Switch formatter, output a blank line
    self.handler.setFormatter(self.blank_formatter)

    for i in range(how_many_lines):
        self.info('')

    # Switch back
    self.handler.setFormatter(self.formatter)


def create_logger():
    # Create a handler
    handler = logging.StreamHandler()
    handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter(fmt="%(name)s %(levelname)-8s: %(message)s")        
    blank_formatter = logging.Formatter(fmt="")
    handler.setFormatter(formatter)


    # Create a logger, with the previously-defined handler
    logger = logging.getLogger('logging_test')
    logger.setLevel(logging.DEBUG)
    logger.addHandler(handler)

    # Save some data and add a method to logger object
    logger.handler = handler
    logger.formatter = formatter
    logger.blank_formatter = blank_formatter
    logger.newline = types.MethodType(log_newline, logger)

    return logger

if __name__ == '__main__':
    logger = create_logger()
    logger.info('Start reading database')
    logger.info('Updating records ...')
    logger.newline()
    logger.info('Finish updating records')

Вывод

logging_test INFO    : Start reading database  
logging_test INFO    : Updating records ...

logging_test INFO    : Finish updating records

Преимущество этого в том, что у вас есть один обработчик. Например, вы можете определить FileHandler's mode-трибут для записи, если вы хотите очистить свой лог-файл при каждом новом запуске вашей программы.

питон, каротаж, символ новой строки,
Похожие вопросы