система настройки log4j против.из.метод 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. Почему системы.из.println сложнее проверить? Я искал StackOverflow и нашел тестирование рецепт. Интересно, что за преимущество я действительно получаю, используя log4j.

5 ответов


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

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

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

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


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

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


  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, и любые инструкции трассировки, отладки и info не будут напечатаны. Это экономит время на то, чтобы комментировать только иногда необходимые операторы отладки.

Смотрите также Википедия.


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


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