/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.gwt.client.util; import com.google.gwt.core.client.GWT; import org.geomajas.annotation.Api; import org.geomajas.command.dto.LogRequest; import org.geomajas.gwt.client.command.Deferred; import org.geomajas.gwt.client.command.GwtCommand; import org.geomajas.gwt.client.command.GwtCommandDispatcher; import java.util.logging.Logger; /** * SmartClient-based logger functionality. * * @author Jan De Moerloose * @author Joachim Van der Auwera * @since 2.0.0 */ @Api(allMethods = true) public final class Log { private static final Logger LOG = Logger.getLogger("Log"); private static final int STACK_TRACE_LINE_LIMIT = 500; // max # of lines in a stack trace, to prevent OOME private static final int STACK_TRACE_CAUSE_LIMIT = 12; // max # of causes in a stack trace, to prevent OOME /** Debug log level. */ public static final int LEVEL_DEBUG = LogRequest.LEVEL_DEBUG; /** Info log level. */ public static final int LEVEL_INFO = LogRequest.LEVEL_INFO; /** Warnings log level. */ public static final int LEVEL_WARN = LogRequest.LEVEL_WARN; /** Errors log level. */ public static final int LEVEL_ERROR = LogRequest.LEVEL_ERROR; private static final String SEP = ", "; private Log() { // do not allow instantiation. } /** * Log a debug message. * * @param message message */ public static void logDebug(String message) { LOG.fine(message); } /** * Log an info message. * * @param message message */ public static void logInfo(String message) { LOG.info(message); } /** * Log a warning. * * @param message message */ public static void logWarn(String message) { GWT.log("WARNING: " + message); LOG.warning(message); logServer(LEVEL_WARN, message, null); } /** * Log an error. * * @param message message */ public static void logError(String message) { GWT.log("ERROR: " + message); LOG.severe(message); logServer(LEVEL_ERROR, message, null); } /** * Debug logging with cause. * * @param message message * @param t cause */ public static void logDebug(String message, Throwable t) { logDebug(message + SEP + getMessage(t)); } /** * Info logging with cause. * * @param message message * @param t cause */ public static void logInfo(String message, Throwable t) { logInfo(message + SEP + getMessage(t)); } /** * Warning logging with cause. * * @param message message * @param t cause */ public static void logWarn(String message, Throwable t) { logWarn(message + SEP + getMessage(t)); } /** * Error logging with cause. * * @param message message * @param t cause */ public static void logError(String message, Throwable t) { logError(message + SEP + getMessage(t)); } private static String getMessage(Throwable throwable) { StringBuilder sb = new StringBuilder(); if (null != throwable) { addMessageAndStackTrace(sb, throwable); Throwable cause = throwable.getCause(); int count = 0; while (null != cause && ++count <= STACK_TRACE_CAUSE_LIMIT) { sb.append("\ncaused by "); addMessageAndStackTrace(sb, cause); cause = cause.getCause(); } } return sb.toString(); } private static void addMessageAndStackTrace(StringBuilder sb, Throwable throwable) { sb.append(throwable.getClass().getName()); sb.append(": "); sb.append(throwable.getMessage()); int line = 0; for (StackTraceElement ste : throwable.getStackTrace()) { sb.append("\n "); sb.append(ste.toString()); if (++line > STACK_TRACE_LINE_LIMIT) { break; } } } /** * Log a message in the server log. * * @param logLevel log level * @param message message to log */ public static void logServer(int logLevel, String message) { logServer(logLevel, message, null); } /** * Log a message in the server log. * * @param logLevel log level * @param message message to log * @param throwable exception to include in message */ public static void logServer(int logLevel, String message, Throwable throwable) { String logMessage = message; if (null == logMessage) { logMessage = ""; } if (null != throwable) { logMessage += "\n" + getMessage(throwable); } LogRequest logRequest = new LogRequest(); logRequest.setLevel(logLevel); logRequest.setStatement(logMessage); GwtCommand command = new GwtCommand(LogRequest.COMMAND); command.setCommandRequest(logRequest); Deferred deferred = new Deferred(); deferred.setLogCommunicationExceptions(false); GwtCommandDispatcher.getInstance().execute(command, deferred); } }