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.

person wishi    schedule 28.04.2010    source источник
comment
Логеры сильно переоценены. System.out и System.err дают вам 80% функциональности с 20% адской структуры ведения журнала.   -  person Sridhar Sarnobat    schedule 29.12.2017


Ответы (5)


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

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

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

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

person Bozhidar Batsov    schedule 28.04.2010

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

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

person Michael Aaron Safyan    schedule 28.04.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(..) сообщения, например. установите уровень предупреждения, и любые сообщения о трассировке, отладке и информации не будут напечатаны. Это экономит ваше время, поскольку вам приходится комментировать только иногда необходимые операторы отладки.

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

person Tobias Kienzler    schedule 28.04.2010

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

person Prashanth    schedule 19.05.2015

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

person Rahul Srivastava    schedule 03.01.2016