org.jboss.monitor.services.JMXNotificationAppender Maven / Gradle / Ivy
/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.monitor.services;
import javax.management.ListenerNotFoundException;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanServer;
import javax.management.NotificationEmitter;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.ObjectName;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.jboss.monitor.alarm.Alarm;
import org.jboss.monitor.alarm.AlarmNotification;
import org.jboss.mx.util.JBossNotificationBroadcasterSupport;
import org.jboss.mx.util.MBeanServerLocator;
/**
* A log4j Appender that emits the received log events as JMX Notifications
*
* @author Dimitris Andreadis
* @version $Revision: 81038 $
*/
public class JMXNotificationAppender extends AppenderSkeleton
implements JMXNotificationAppenderMBean, NotificationEmitter
{
public static final String DEFAULT_TYPE = "jboss.alarm.logging";
// Private Data --------------------------------------------------
private MBeanServer server;
private ObjectName objectName;
private String objectNameString;
private String notificationType;
private JBossNotificationBroadcasterSupport emitter;
// Protected Data ------------------------------------------------
// Constructors --------------------------------------------------
/**
* CTOR
*/
public JMXNotificationAppender()
{
notificationType = DEFAULT_TYPE;
server = MBeanServerLocator.locateJBoss();
emitter = new JBossNotificationBroadcasterSupport();
// Default Threadshold
setThreshold(Level.WARN);
}
// Attributes ----------------------------------------------------
public void setObjectName(String objectNameString) throws Exception
{
// in case we've registered before
unregister();
if (server != null)
{
objectName = new ObjectName(objectNameString);
server.registerMBean(this, objectName);
}
this.objectNameString = objectNameString;
}
public String getObjectName()
{
return objectNameString;
}
public void setNotificationType(String notificationType)
{
this.notificationType = notificationType;
}
public String getNotificationType()
{
return notificationType;
}
// NotificationEmitter implementation ----------------------------
public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback)
{
// delegate
emitter.addNotificationListener(listener, filter, handback);
}
public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException
{
// delegate
emitter.removeNotificationListener(listener);
}
public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback)
throws ListenerNotFoundException
{
// delegate
emitter.removeNotificationListener(listener, filter, handback);
}
public MBeanNotificationInfo[] getNotificationInfo()
{
// delegate
return emitter.getNotificationInfo();
}
// Appender implementation ---------------------------------------
public void close()
{
unregister();
server = null;
emitter = null;
objectName = null;
objectNameString = null;
notificationType = null;
}
public boolean requiresLayout()
{
return true;
}
// AppenderSkeleton overrides ------------------------------------
protected void append(LoggingEvent event)
{
String msg = super.layout.format(event);
if (super.layout.ignoresThrowable())
{
String[] ts = event.getThrowableStrRep();
if (ts != null)
{
StringBuffer sbuf = new StringBuffer(msg);
int len = ts.length;
for (int i = 0; i < len; i++)
{
sbuf.append(Layout.LINE_SEP).append(ts[i]);
}
msg = sbuf.toString();
}
}
// Map level to severity
Level level = event.getLevel();
int severity;
if (level == Level.WARN)
{
severity = Alarm.SEVERITY_WARNING;
}
else if (level == Level.ERROR)
{
severity = Alarm.SEVERITY_MAJOR;
}
else if (level == Level.FATAL)
{
severity = Alarm.SEVERITY_CRITICAL;
}
else
{
severity = Alarm.SEVERITY_UNKNOWN;
}
// create the alarm
AlarmNotification alarm = new AlarmNotification(
notificationType, this, null, severity, Alarm.STATE_NONE,
emitter.nextNotificationSequenceNumber(), event.timeStamp, msg);
emitter.sendNotification(alarm);
}
// Private -------------------------------------------------------
private void unregister()
{
if (server != null && objectName != null)
{
try
{
server.unregisterMBean(objectName);
}
catch (Exception ignored)
{
// ignored
}
}
}
}