How to log FATAL (or any custom log level) with SLF4J and Log4j2

Daniel Marcotte picture Daniel Marcotte · May 6, 2015 · Viewed 19.3k times · Source

I have those specific requirements :

  • Need to be able to log in FATAL level
  • Need to use SLF4J
  • Need to use Log4j2

Right now, here's my implementation:

final Logger logger = LoggerFactory.getLogger(HelloWorld.class);
final Marker marker = MarkerFactory.getMarker("FATAL");
logger.error(marker, "!!! Fatal World !!!");

Here's my PatternLayout (in yaml):

PatternLayout:
  Pattern: "%d{ISO8601_BASIC} %-5level %marker [%t] %logger{3.} - %msg%n"

Here's my log output :

20150506T155705,158 ERROR FATAL [main] - !!! Fatal World !!!

Do you have any idea about how to efficiently to remove the "ERROR" from the log output?

Thank you very much

Answer

SnakeDoc picture SnakeDoc · May 6, 2015

Marker is not really what you want here. Marker is for "enriching" log messages, making them more easily searchable. You are trying to change the log level/priority, which is a little different.

You're using logger.error() which will log the message as an ERROR level.

If there is no FATAL level pre-defined (usually there is, such as logger.fatal()), then use the generic logger.log() which allows you to specify the log level.

logger.fatal(yourMessage);

OR

logger.log(priorityLevel, yourMessage);

UPDATE:

From the SLF4J website:

The Marker interface, part of the org.slf4j package, renders the FATAL level largely redundant. If a given error requires attention beyond that allocated for ordinary errors, simply mark the logging statement with a specially designated marker which can be named "FATAL" or any other name to your liking.

http://www.slf4j.org/faq.html#fatal

So, with SLF4J, it is not possible to have a FATAL log level. I strongly disagree with the rationale behind this decision, but it is what it is.