/* * Copyright (c) 2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.services.util; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; /** * Logger instance that logs messages to "/var/log/alerts" file with crit(fatal in * logf4j (syssvc.log)), error, warn priorities with facility set to LOCAL7. */ public class AlertsLogger { private static Logger _log = Logger.getLogger(AlertsLogger.class); private static volatile AlertsLogger _instance = null; private static final String ALERTS_FACILITY = "LOCAL7"; private AlertsLogger() { } /** * Custom appender that fixes level mapping to syslog. */ private static class SyslogAppender extends org.apache.log4j.net.SyslogAppender { @Override public void append(LoggingEvent event) { Level newLevel = event.getLevel(); if (event.getLevel().equals(Level.FATAL)) { newLevel = SyslogLevel.FATAL; } super.append(new LoggingEvent( event.getFQNOfLoggerClass(), event.getLogger(), event.getTimeStamp(), newLevel, event.getMessage(), event.getThreadName(), event.getThrowableInformation(), event.getNDC(), event.getLocationInformation(), event.getProperties())); } } /** * Fix for level mapping - log4j "fatal" is mapped to syslog "critical". */ private static class SyslogLevel extends Level { private static final Level FATAL = new SyslogLevel(FATAL_INT, "FATAL", 2); protected SyslogLevel(int level, String levelStr, int syslogEquivalent) { super(level, levelStr, syslogEquivalent); } } public static AlertsLogger getAlertsLogger() { if (_instance == null) { SyslogAppender syslogAppender = new SyslogAppender(); syslogAppender.setFacility(ALERTS_FACILITY); syslogAppender.setSyslogHost("localhost"); syslogAppender.setHeader(true); syslogAppender.activateOptions(); _instance = new AlertsLogger(); _log.addAppender(syslogAppender); } return _instance; } public void fatal(Object message) { _log.fatal(message); } public void error(Object message) { _log.error(message); } public void warn(Object message) { _log.warn(message); } }