001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999-2004 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: LogManagement.java 9118 2006-07-05 13:23:44Z sauthieg $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas.common;
025:
026: import java.util.HashMap;
027: import java.util.Map;
028: import java.util.Properties;
029: import java.util.TreeSet;
030:
031: import javax.ejb.EJBException;
032: import javax.management.NotificationEmitter;
033: import javax.management.NotificationFilter;
034: import javax.management.NotificationListener;
035:
036: import org.objectweb.jonas.management.ReconfigDispatcher;
037: import org.objectweb.jonas.management.ReconfiguredProp;
038: import org.objectweb.util.monolog.Monolog;
039: import org.objectweb.util.monolog.api.Handler;
040: import org.objectweb.util.monolog.api.Level;
041: import org.objectweb.util.monolog.api.Logger;
042: import org.objectweb.util.monolog.api.LoggerFactory;
043: import org.objectweb.util.monolog.api.MonologFactory;
044:
045: public class LogManagement extends ReconfigDispatcher implements
046: LogManagementMBean {
047:
048: // Value used as sequence number by reconfiguration notifications
049: long sequenceNumber = 0;
050:
051: // Name as used to label configuration properties
052: public static final String SERVICE_NAME = "log";
053:
054: /**
055: * The unique instance of LogManagement
056: */
057: private static LogManagement unique = null;
058:
059: public static LogManagement getInstance() {
060: if (unique == null) {
061: unique = new LogManagement();
062: }
063: return unique;
064: }
065:
066: /**
067: * get Topics. Assumes that all Loggers are TopicalLoggers.
068: */
069: public String[] getTopics() {
070: Logger[] logs = Log.getLoggerFactory().getLoggers();
071: // put names in alphabetical order
072: TreeSet tset = new TreeSet();
073: for (int i = 0; i < logs.length; i++) {
074: tset.add(logs[i].getName());
075: }
076: return (String[]) tset.toArray(new String[0]);
077: }
078:
079: /**
080: * get Topic Level
081: */
082: public String getTopicLevel(String topic) {
083: String ret = null;
084: Logger topicLogger = Log.getLoggerFactory().getLogger(topic);
085: Level lev = topicLogger.getCurrentLevel();
086: return lev.getName();
087: }
088:
089: /**
090: * set Topic Level
091: */
092: public void setTopicLevel(String topic, String level) {
093: Logger topicLogger = Log.getLoggerFactory().getLogger(topic);
094: Level lev = Log.getLevelFactory().getLevel(level);
095: // must check null (bug monolog)
096: if (lev != null) {
097: topicLogger.setLevel(lev);
098: } else {
099: throw new EJBException("Unknown level " + level);
100: }
101: // the modified property name is 'logger.topic.level'
102: String propName = "logger." + topic + ".level";
103: // Send a notification containing the new value of this property to the
104: // listner MBean
105: sendReconfigNotification(++sequenceNumber, SERVICE_NAME,
106: new ReconfiguredProp(propName, level));
107: }
108:
109: /**
110: * returns list of properties for logging system
111: */
112: public Properties getProperties() {
113: Properties props = Log.getProperties();
114: if (props == null) {
115: Log.getLoggerFactory();
116: props = Log.getProperties();
117: }
118: return props;
119: }
120:
121: public void saveConfig() {
122: // Send save reconfig notification
123: sendSaveNotification(++sequenceNumber, SERVICE_NAME);
124: }
125:
126: /**
127: * Returns the names of the Monolog handlers
128: * @return The handler names defines in Monolog
129: */
130: public String[] getHandlerNames() {
131: LoggerFactory lf = Log.getLoggerFactory();
132:
133: if (lf instanceof MonologFactory) {
134: MonologFactory mf = (MonologFactory) lf;
135: Handler[] hs = mf.getHandlers();
136: String[] hns = new String[hs.length];
137: for (int i = 0; i < hs.length; i++) {
138: hns[i] = hs[i].getName();
139: }
140: return hns;
141: }
142: return null;
143: }
144:
145: /**
146: * Getter for the map of the attributes of a handler
147: * @return The map of the attributes defines for the handler
148: */
149: public Map getHandlerAttributes(String handlername) {
150: LoggerFactory lf = Log.getLoggerFactory();
151:
152: if (lf instanceof MonologFactory) {
153: MonologFactory mf = (MonologFactory) lf;
154:
155: Handler h = mf.getHandler(handlername);
156: String[] ans = h.getAttributeNames();
157: Map m = new HashMap(ans.length);
158: for (int i = 0; i < ans.length; i++) {
159: m.put(ans[i], h.getAttribute(ans[i]));
160: }
161: return m;
162: }
163: return null;
164: }
165:
166: /**
167: * Super charge of the methode to take advantage of JMX notification
168: * offered by Monolog 2.0
169: * @param arg0 The notification Listener
170: * @param arg1 The notification Filter
171: * @param arg2 Handback object
172: */
173: public void addNotificationListener(NotificationListener arg0,
174: NotificationFilter arg1, Object arg2)
175: throws IllegalArgumentException {
176: Handler handler = Monolog.getMonologFactory().getHandler(
177: "jmxHandler");
178: if (handler != null && (handler instanceof NotificationEmitter)) {
179: ((NotificationEmitter) handler).addNotificationListener(
180: arg0, arg1, arg2);
181: }
182: super.addNotificationListener(arg0, arg1, arg2);
183: }
184:
185: }
|