Все, что вы печатаете в 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.