Подтвердить что ты не робот

Log4j vs. 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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

  • Используйте, например,

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

Также посмотрите Wikipedia.

Ответ 4

Используя logger.setLevel(...), вы можете легко выбрать, показывать ли сообщения logger.debug(..), например. установите его на уровень предупреждения, и никакие отчеты о трассировке, отладки и информации не будут напечатаны. Это экономит ваше время, когда нужно прокомментировать только изредка требуемые отладочные заявления

Ответ 5

В случае log4j он предоставляет услугу среднего уровня, в которой вы можете управлять уровнями ведения журнала, такими как DEBUG, INFO, ERROR и т.д. И вы можете включать и отключать ведение журнала. Но в случае System.out.println() вы должны управлять всем.