python logging - не все аргументы, преобразованные во время форматирования строки [duplicate]

Если вы прямо напечатаете любой объект Person, он ClassName@HashCode передаст код.

в вашем случае com.foo.Person@2f92e0f4 печатается. Где Person - класс, к которому принадлежит объект, а 2f92e0f4 - hashCode объекта.

public class Person {
  private String name;

  public Person(String name){
  this.name = name;
  }
  // getter/setter omitted

   @override
   public String toString(){
        return name;
   }
}

Теперь, если вы попытаетесь использовать объект Person, он напечатает имя

Class Test
 {
  public static void main(String... args){
    Person obj = new Person("YourName");
    System.out.println(obj.toString());
  }
}
22
задан Martijn Pieters 11 October 2012 в 16:27
поделиться

4 ответа

Вы можете сделать форматирование самостоятельно:

logging.info('date={}'.format(date))

Как было указано Martijn Pieters, это всегда будет выполнять форматирование строк, а использование модуля протоколирования приведет к тому, что форматирование будет выполнено только в том случае, если сообщение действительно регистрируется.

15
ответ дан Matt 23 August 2018 в 22:27
поделиться

Вы не можете использовать форматирование нового стиля при использовании модуля регистрации; используйте %s вместо {}.

logging.info('date=%s', date)

Модуль протоколирования использует оператор старого стиля % для форматирования строки журнала. Более подробно см. Метод debug .

Если вы действительно хотите использовать форматирование строк str.format(), рассмотрите использование пользовательских объектов, которые применяют форматирование «поздно», когда на самом деле преобразован в строку:

class BraceMessage(object):
    def __init__(self, fmt, *args, **kwargs):
        self.fmt = fmt
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return self.fmt.format(*self.args, **self.kwargs)

__ = BraceMessage

logging.info(__('date={}', date))

Это подход, который предлагает Python 3 logging документация модуля , и также работает на Python 2.

35
ответ дан Martijn Pieters 23 August 2018 в 22:27
поделиться

Ответ Martijn правильный, но если вы предпочитаете использовать новое форматирование стиля с протоколированием, его можно выполнить путем подкласса Logger.

import logging

class LogRecord(logging.LogRecord):
    def getMessage(self):
        msg = self.msg
        if self.args:
            if isinstance(self.args, dict):
                msg = msg.format(**self.args)
            else:
                msg = msg.format(*self.args)
        return msg

class Logger(logging.Logger):
    def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None):
        rv = LogRecord(name, level, fn, lno, msg, args, exc_info, func)
        if extra is not None:
            for key in extra:
                rv.__dict__[key] = extra[key]
        return rv

Затем просто установите класс ведения журнала:

logging.setLoggerClass(Logger)
6
ответ дан Mike T 23 August 2018 в 22:27
поделиться

Вы также можете сделать это (Python 3);

logging.info(f'date={date}')
0
ответ дан yusuf 23 August 2018 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: