Как записать нестроковый элемент в slf4j - PullRequest
7 голосов
/ 29 марта 2011

Кажется, что метод slf4j принимает только строковый аргумент, нужно ли преобразовывать все в строку при использовании его метода?

Ответы [ 3 ]

8 голосов
/ 29 марта 2011

Основная причина требования String вместо Object для типа сообщения заключалась в том, чтобы избежать неоднозначности в сигнатурах метода.

Принимает следующие подписи:

1) debug(Object) // a message
2) debug(Object, Object) // message followed by a parameter
3) debug(Object, Exception)  // message followed by an exception

тогда, когда вы пишете

debug("hello", new Exception("world"));

не ясно, следует ли использовать вариант 2 или вариант 3.

В любом случае, с существующим API SLF4J вы всегда можете написать:

  logger.debug("{}", yourObject);

Если базовая структура ведения журнала является logback, то yourObject будет доступен всем дополнителям без изменений. Другие структуры ведения журналов не поддерживают параметры сообщений, поэтому SLF4J должен отформатировать сообщение перед вызовом базовой структуры.

2 голосов
/ 29 марта 2011

Кажется, что метод slf4j принимает только строковый аргумент. Должен ли я преобразовывать все в строку при использовании его метода?

Если вы говорите о методах с 1 аргументом, таких как Logger.debug(String message), то да, вы делаете. Но есть и другие методы, такие как Logger.debug(String format, Object[] args), которые не требуют этого.

Я не уверен, почему API-интерфейсы sl4fj такие (и, например, API-интерфейсы log4j - нет), но это, вероятно, некоторая комбинация:

  • пытается удовлетворить базовое поведение каркаса ведения журнала,
  • пытается минимизировать влияние на производительность, а
  • «Прерогатива разработчика».

(Последнее - это принцип, согласно которому если кто-то разрабатывает / внедряет что-то, что не отвечает ни одному из проектных комитетов, его мнение о стиле и т. Д. Имеет больший вес, чем у кого-либо другого.)

0 голосов
/ 29 марта 2011

попробуй

String.valueOf(yourObject)

и затем убедитесь, что ваши методы toString () действительно значимы

...