log4j по сравнению с System.out.println - преимущества регистратора?

Я использую log4j впервые в проекте. Такой же программист сказал мне то использование System.out.println считается плохим стилем и что log4j - что-то как стандарт для входа вопросов в наше время.

Мы делаем много JUnit, тестирующих - System.out материал оказывается более твердым протестировать.

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

// log4j logger config 
org.apache.log4j.BasicConfigurator.configure();
Logger logger = LoggerFactory.getLogger(Console.class);
Category cat = Category.getRoot(); 

Кажется, работает:

logger.debug("String");

Производит:

1 [main] DEBUG project.prototype.controller.Console  - String

Я получил два вопроса относительно этого:

  1. От моего основного понимания с помощью этого регистратора должен предоставить мне удобные возможности записать файл журнала с метками времени - вместо того, чтобы массово разослать консоль - если режим отладки включен в регистраторе?
  2. Почему System.out.println более трудно протестировать? Я искал stackoverflow и нашел рецепт тестирования. Так интересно, какое преимущество я действительно получаю при помощи log4j.

19
задан Community 23 May 2017 в 12:08
поделиться

3 ответа

Регистратор дает возможность определять разные уровни важности регистрируемых сообщений и возможность использовать разные приемники для вывода - консоль, файл и т. Д.

Также легко включить или отключить только некоторые типы сообщений при использовании регистратора - например, вы не хотите видеть каждое сообщение отладки в производственной среде.

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

Кстати, вам действительно стоит подумать об использовании чего-то вроде Commons Logging или SLF4J в качестве фасада структуры журнала - это плохой стиль - привязывать ваш код к определенной структуре ведения журнала. Common Logging и SLF4J упрощают переключение фреймворков журналирования, если вы захотите.

23
ответ дан 30 November 2019 в 03:52
поделиться

Все, что вы печатаете в System.out, будет "стандартным", и хотя вы можете перенаправить стандартный вывод в файл и сравнить его, что имеет вы, это очень негибкий. Кроме того, вы не можете фильтровать то, что идет к стандартному выходу, если вы используете System.out ... все будет напечатано. С помощью log4j вы можете установить разные уровни ведения журнала, чтобы сообщения журнала, которые ниже определенного порога серьезности / важности, не печатались (например, если вы измените уровень ведения журнала на WARN, то сообщения DEBUG и INFO больше не будут отображаться).

Кроме того, log4j позволяет управлять ведением журнала для каждого класса, тогда как System.out можно контролировать только на уровне детализации всего приложения (если вы перенаправляете System.out, вы перенаправляете его на всю программу). Напротив, каждому регистратору в log4j может быть назначен другой аппендер. Кроме того, вы можете предоставить регистратору log4j несколько дополнений (например, для работы с системным регистратором и по сети). Вы даже можете добавить логгер log4j к StringBuilder, чтобы вы могли легко читать то, что было написано. И хотя System.out может быть перенаправлен, это перенаправление имеет тенденцию быть довольно ограниченным; System.out можно перенаправить в файл или в канал (в другую программу), но, например, вы не сможете перенаправить его на URL-адрес; Напротив, было бы очень легко создать приложение, которое передает сообщения журнала с помощью HTTP POST.

8
ответ дан 30 November 2019 в 03:52
поделиться
  1. Используйте, например,

     org.apache.log4j.BasicConfigurator.configure (new FileAppender (
    new PatternLayout ("% d {ISO8601}% -5p% t:% m% n"), // см., Например, http: / /en.wikipedia.org/wiki/Log4j#TTCC 
     "log / mainWhatever.log")); 
     
  2. Использование logger.setLevel (...) вы можете легко выбрать, отображать ли сообщения logger.debug (..) , например установите его на уровень предупреждения, и любые операторы трассировки, отладки и информации не будут печататься. Это избавляет вас от необходимости комментировать только иногда необходимые отладочные операторы.

Также посмотрите Википедию .

2
ответ дан 30 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

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