2 * jFCPlib-high-level-client - Logging.java -
3 * Copyright © 2008 David Roden
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 package net.pterodactylus.util.logging;
22 import java.text.DateFormat;
23 import java.text.SimpleDateFormat;
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.Date;
27 import java.util.List;
28 import java.util.logging.ConsoleHandler;
29 import java.util.logging.Formatter;
30 import java.util.logging.Handler;
31 import java.util.logging.Level;
32 import java.util.logging.LogRecord;
33 import java.util.logging.Logger;
38 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
40 public class Logging {
42 /** The log handler. */
43 private static final LogHandler logHandler = new LogHandler();
46 logHandler.setLevel(Level.ALL);
49 /** The root name of the hierarchy. */
50 private static String hierarchyRootName;
53 * Adds a listener to the log handler.
55 * @param loggingListener
58 public static void addLoggingListener(LoggingListener loggingListener) {
59 logHandler.addLoggingListener(loggingListener);
63 * Removes a listener from the log handler.
65 * @param loggingListener
66 * The listener to remove
68 public static void removeLoggingListener(LoggingListener loggingListener) {
69 logHandler.removeLoggingListener(loggingListener);
73 * Sets up logging and installs the log handler.
75 * @param hierarchyName
76 * The name of the hierarchy root logger
78 public static void setup(String hierarchyName) {
79 hierarchyRootName = hierarchyName;
80 Logger rootLogger = Logger.getLogger(hierarchyName);
81 rootLogger.addHandler(logHandler);
82 Handler consoleHandler = new ConsoleHandler();
83 consoleHandler.setLevel(Level.ALL);
84 consoleHandler.setFormatter(new Formatter() {
86 private StringBuffer recordBuffer = new StringBuffer();
87 private DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");
93 public synchronized String format(LogRecord record) {
94 recordBuffer.setLength(0);
95 String linePrefix = dateFormatter.format(new Date(record.getMillis())) + " [" + record.getLevel() + "] [" + Thread.currentThread().getName() + "] [" + record.getSourceClassName() + "." + record.getSourceMethodName() + "] ";
96 recordBuffer.append(linePrefix).append(record.getMessage()).append('\n');
97 if (record.getThrown() != null) {
98 Throwable throwable = record.getThrown();
99 boolean causedBy = false;
100 while (throwable != null) {
101 recordBuffer.append(linePrefix);
103 recordBuffer.append("caused by: ");
105 recordBuffer.append(throwable.getClass().getName());
106 if (throwable.getMessage() != null) {
107 recordBuffer.append(": ").append(throwable.getMessage());
109 recordBuffer.append("\n");
110 StackTraceElement[] stackTraceElements = throwable.getStackTrace();
111 for (StackTraceElement stackTraceElement : stackTraceElements) {
112 recordBuffer.append(linePrefix).append(" at ").append(stackTraceElement.getClassName()).append('.').append(stackTraceElement.getMethodName()).append("(").append(stackTraceElement.getFileName()).append(':').append(stackTraceElement.getLineNumber()).append(')').append("\n");
114 throwable = throwable.getCause();
118 return recordBuffer.toString();
121 rootLogger.addHandler(consoleHandler);
122 rootLogger.setUseParentHandlers(false);
123 rootLogger.setLevel(Level.ALL);
127 * Returns a named logger from the jSite hierarchy.
130 * The name of the logger
133 public static Logger getLogger(String name) {
134 Logger logger = Logger.getLogger(hierarchyRootName + "." + name);
139 * The log handler simply forwards every log message it receives to all
140 * registered listeners.
142 * @see LoggingListener
143 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
145 private static class LogHandler extends Handler {
148 * Package-private constructor.
154 /** The list of the listeners. */
155 private final List<LoggingListener> loggingListeners = Collections.synchronizedList(new ArrayList<LoggingListener>());
162 * Adds a listener to the log handler.
164 * @param loggingListener
165 * The listener to add
167 public void addLoggingListener(LoggingListener loggingListener) {
168 loggingListeners.add(loggingListener);
172 * Removes a listener from the log handler.
174 * @param loggingListener
175 * The listener to remove
177 public void removeLoggingListener(LoggingListener loggingListener) {
178 loggingListeners.remove(loggingListener);
182 * Notifies all listeners that a log record was received.
185 * The received log record
187 private void fireLogged(LogRecord logRecord) {
188 for (LoggingListener loggingListener : loggingListeners) {
189 loggingListener.logged(logRecord);
201 public void close() throws SecurityException {
209 public void flush() {
217 public void publish(LogRecord logRecord) {
218 fireLogged(logRecord);