log4j против System.out.println - преимущества логгера? - PullRequest
19 голосов
/ 28 апреля 2010

Я впервые использую 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.

Ответы [ 5 ]

23 голосов
/ 28 апреля 2010

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

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

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

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

8 голосов
/ 28 апреля 2010

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

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

2 голосов
/ 28 апреля 2010
  1. Используйте, например,

    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"));
    
  2. Используя logger.setLevel(...), вы можете легко выбрать, отображать ли logger.debug(..) сообщения, например, установите его на уровень warn, и любые операторы trace, debug и info не будут напечатаны. Это избавляет вас от необходимости комментировать только иногда необходимые отладочные операторы.

Также взгляните на Википедию .

0 голосов
/ 03 января 2016

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

0 голосов
/ 19 мая 2015

Используя logger.setLevel (...), вы можете легко выбрать, отображать ли сообщения logger.debug (..), например, установите его на уровень warn, и любые операторы trace, debug и info не будут напечатаны. Это избавляет вас от необходимости комментировать только иногда необходимые отладочные операторы

...