Changeset 8125
- Timestamp:
- Mar 9, 2023, 1:39:24 PM (7 months ago)
- Location:
- branches/3.19-stable
- Files:
-
- 2 added
- 7 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/DummyService.java
r8124 r8125 29 29 import net.sf.basedb.util.extensions.ActionFactory; 30 30 import net.sf.basedb.util.extensions.InvokationContext; 31 import net.sf.basedb.util.extensions.logging. ServiceLogger;32 import net.sf.basedb.util.extensions.logging. ServiceLog.LogLevel;31 import net.sf.basedb.util.extensions.logging.ExtensionsLogger; 32 import net.sf.basedb.util.extensions.logging.LogLevel; 33 33 34 34 /** … … 88 88 89 89 @Override 90 public void start(final ServiceLogger logger)90 public void start(final ExtensionsLogger logger) 91 91 { 92 92 if (running) return; -
branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/ServiceControllerAction.java
r8124 r8125 23 23 24 24 import net.sf.basedb.util.extensions.Action; 25 import net.sf.basedb.util.extensions.logging. ServiceLogger;25 import net.sf.basedb.util.extensions.logging.ExtensionsLogger; 26 26 27 27 /** … … 51 51 is called on a running service it should do nothing. If the service can't 52 52 be started it may throw an exception. 53 @deprecated In 3.19.8, implement the {@link #start( ServiceLogger)}53 @deprecated In 3.19.8, implement the {@link #start(ExtensionsLogger)} 54 54 method instead. This method will never be called from the BASE 55 core except for the default implementation of {@link #start( ServiceLogger)}.55 core except for the default implementation of {@link #start(ExtensionsLogger)}. 56 56 */ 57 57 @Deprecated … … 72 72 @since 3.19.8 73 73 */ 74 public default void start( ServiceLogger logger)74 public default void start(ExtensionsLogger logger) 75 75 { 76 76 start(); -
branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/StartServiceRenderer.java
r8124 r8125 24 24 import net.sf.basedb.util.extensions.AbstractRenderer; 25 25 import net.sf.basedb.util.extensions.Extension; 26 import net.sf.basedb.util.extensions.logging. ServiceLog;27 import net.sf.basedb.util.extensions.logging. ServiceLogger;28 import net.sf.basedb.util.extensions.logging. ServiceLog.LogLevel;26 import net.sf.basedb.util.extensions.logging.ExtensionsLog; 27 import net.sf.basedb.util.extensions.logging.ExtensionsLogger; 28 import net.sf.basedb.util.extensions.logging.LogLevel; 29 29 30 30 /** … … 52 52 { 53 53 log.info("Starting service: " + service); 54 ServiceLogger logger = ServiceLog.getLogger(ext.getId(), true);54 ExtensionsLogger logger = ExtensionsLog.getLogger(ext.getId(), true); 55 55 service.start(logger); 56 56 logger.log(LogLevel.INFO, "Service started"); -
branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/StopServiceRenderer.java
r8124 r8125 23 23 24 24 import net.sf.basedb.util.extensions.Extension; 25 import net.sf.basedb.util.extensions.logging. ServiceLog;26 import net.sf.basedb.util.extensions.logging. ServiceLogger;27 import net.sf.basedb.util.extensions.logging. ServiceLog.LogLevel;25 import net.sf.basedb.util.extensions.logging.ExtensionsLog; 26 import net.sf.basedb.util.extensions.logging.ExtensionsLogger; 27 import net.sf.basedb.util.extensions.logging.LogLevel; 28 28 import net.sf.basedb.util.extensions.AbstractRenderer; 29 29 … … 54 54 log.info("Stopping service: " + service); 55 55 service.stop(); 56 ServiceLogger logger = ServiceLog.getLogger(ext.getId(), false);56 ExtensionsLogger logger = ExtensionsLog.getLogger(ext.getId(), false); 57 57 if (logger != null) logger.log(LogLevel.INFO, "Service stopped"); 58 58 log.info("Stopping service done: " + service); -
branches/3.19-stable/src/core/net/sf/basedb/util/extensions/logging/ExtensionsLog.java
r8124 r8125 22 22 package net.sf.basedb.util.extensions.logging; 23 23 24 import java.util.Date;25 24 import java.util.Deque; 26 25 import java.util.HashMap; … … 33 32 34 33 import org.apache.commons.collections4.iterators.UnmodifiableIterator; 35 import org.slf4j.Logger;36 37 import net.sf.basedb.core.DateUtil;38 import net.sf.basedb.util.error.ThrowableUtil;39 34 40 35 /** … … 44 39 @since 3.19.8 45 40 */ 46 public class ServiceLog41 public class ExtensionsLog 47 42 { 48 private static Map<String, ServiceLog> logs = new HashMap<>();43 private static Map<String, ExtensionsLog> logs = new HashMap<>(); 49 44 50 45 /** … … 52 47 doens't exists yet it can optionally be created. 53 48 */ 54 public static ServiceLog getLog(String extensionId, boolean create)55 { 56 ServiceLog log = logs.get(extensionId);49 public static ExtensionsLog getLog(String extensionId, boolean create) 50 { 51 ExtensionsLog log = logs.get(extensionId); 57 52 if (log == null && create) 58 53 { … … 62 57 if (log == null) 63 58 { 64 log = new ServiceLog(extensionId);59 log = new ExtensionsLog(extensionId); 65 60 logs.put(extensionId, log); 66 61 } … … 74 69 If the log doesn't exists yet, it can optionally be created. 75 70 */ 76 public static ServiceLogger getLogger(String extensionId, boolean create)77 { 78 ServiceLog log = getLog(extensionId, create);71 public static ExtensionsLogger getLogger(String extensionId, boolean create) 72 { 73 ExtensionsLog log = getLog(extensionId, create); 79 74 return log == null ? null : log.createLogger(); 80 75 } … … 92 87 private boolean copyToStdout; 93 88 94 private ServiceLog(String extensionId)89 private ExtensionsLog(String extensionId) 95 90 { 96 91 this.extensionId = extensionId; … … 198 193 Create a logger that adds messages to this log. 199 194 */ 200 public ServiceLogger createLogger()201 { 202 return new ServiceLogger(this);195 public ExtensionsLogger createLogger() 196 { 197 return new ExtensionsLogger(this); 203 198 } 204 199 … … 211 206 void add(LogEntry entry) 212 207 { 213 if (copyToStdout && (entry. level!= LogLevel.TRACE || isDebugEnabled))208 if (copyToStdout && (entry.getLevel() != LogLevel.TRACE || isDebugEnabled)) 214 209 { 215 210 System.out.println("["+extensionId+"] "+entry); 216 211 } 217 if (entry. level == LogLevel.TRACE || (entry.level== LogLevel.DEBUG && !isDebugEnabled))212 if (entry.getLevel() == LogLevel.TRACE || (entry.getLevel() == LogLevel.DEBUG && !isDebugEnabled)) 218 213 { 219 214 return; … … 225 220 l.lock(); 226 221 logEntries.addFirst(entry); 227 if (entry. level== LogLevel.WARNING) numWarnings++;228 if (entry. level== LogLevel.ERROR) numErrors++;222 if (entry.getLevel() == LogLevel.WARNING) numWarnings++; 223 if (entry.getLevel() == LogLevel.ERROR) numErrors++; 229 224 230 225 if (numEntries++ > maxEntries) … … 233 228 numEntries--; 234 229 LogEntry last = logEntries.removeLast(); 235 if (last. level== LogLevel.WARNING) numWarnings--;236 if (last. level== LogLevel.ERROR) numErrors--;230 if (last.getLevel() == LogLevel.WARNING) numWarnings--; 231 if (last.getLevel() == LogLevel.ERROR) numErrors--; 237 232 } 238 233 } … … 252 247 return UnmodifiableIterator.unmodifiableIterator(logEntries.iterator()); 253 248 } 254 255 /**256 The level of the log message.257 */258 public enum LogLevel259 {260 INFO("info.png")261 {262 @Override263 void logTo(Logger logger, String msg, Throwable t)264 {265 logger.info(msg, t);266 }267 },268 WARNING("warning.png")269 {270 @Override271 void logTo(Logger logger, String msg, Throwable t)272 {273 logger.warn(msg, t);274 }275 },276 ERROR("error.png")277 {278 @Override279 void logTo(Logger logger, String msg, Throwable t)280 {281 logger.error(msg, t);282 }283 },284 DEBUG("bug.png")285 {286 @Override287 void logTo(Logger logger, String msg, Throwable t)288 {289 logger.debug(msg, t);290 }291 },292 TRACE("trace.png")293 {294 @Override295 void logTo(Logger logger, String msg, Throwable t)296 {297 logger.trace(msg, t);298 }299 };300 301 private final String icon;302 303 private LogLevel(String icon)304 {305 this.icon = icon;306 }307 308 /**309 Get the icon that represents this log level.310 */311 public String getIcon()312 {313 return icon;314 }315 316 abstract void logTo(org.slf4j.Logger logger, String msg, Throwable t);317 }318 319 /**320 An entry in the log.321 */322 public static class LogEntry323 {324 private final long timestamp;325 private final LogLevel level;326 private final String message;327 private final Throwable t;328 329 LogEntry(LogLevel level, String message, Throwable t)330 {331 this.timestamp = System.currentTimeMillis();332 this.level = level;333 this.message = message;334 this.t = t;335 }336 337 /**338 The level of the log entry.339 */340 public LogLevel getLevel()341 {342 return level;343 }344 345 /**346 The timestamp of the log entry.347 */348 public long getTimestamp()349 {350 return timestamp;351 }352 353 /**354 The timestamp of the log entry as a date.355 */356 public Date getDate()357 {358 return new Date(timestamp);359 }360 361 /**362 Get the log message.363 */364 public String getMessage()365 {366 return message;367 }368 369 /**370 Get the stacktrace of the log entry.371 */372 public Throwable getStacktrace()373 {374 return t;375 }376 377 @Override378 public String toString()379 {380 String s = "["+level.name()+"] ["+DateUtil.formatTimestamp(getDate())+"] "+message;381 if (t != null)382 {383 s+="\n"+ThrowableUtil.stackTraceToString(t);384 }385 return s;386 }387 388 }389 249 390 250 } -
branches/3.19-stable/src/core/net/sf/basedb/util/extensions/logging/ExtensionsLogger.java
r8124 r8125 1 /** 2 $Id$ 3 4 Copyright (C) 2023 Nicklas Nordborg 5 6 This file is part of BASE - BioArray Software Environment. 7 Available at http://base.thep.lu.se/ 8 9 BASE is free software; you can redistribute it and/or 10 modify it under the terms of the GNU General Public License 11 as published by the Free Software Foundation; either version 3 12 of the License, or (at your option) any later version. 13 14 BASE is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with BASE. If not, see <http://www.gnu.org/licenses/>. 21 */ 1 22 package net.sf.basedb.util.extensions.logging; 2 3 import net.sf.basedb.util.extensions.logging.ServiceLog.LogEntry;4 import net.sf.basedb.util.extensions.logging.ServiceLog.LogLevel;5 23 6 24 /** 7 25 A simple logger that services can use to send log message to the BASE 8 26 core. An instance is handed out to the service by the {@link 9 ServiceControllerAction#start( ServiceLogger)} method, which the service27 ServiceControllerAction#start(ExtensionsLogger)} method, which the service 10 28 can use as long as it is running. 11 29 <p> … … 20 38 @since 3.19.8 21 39 */ 22 public class ServiceLogger40 public class ExtensionsLogger 23 41 { 24 private final ServiceLog log;42 private final ExtensionsLog log; 25 43 private final org.slf4j.Logger otherLogger; 26 44 27 ServiceLogger(ServiceLog log)45 ExtensionsLogger(ExtensionsLog log) 28 46 { 29 47 this(log, null); 30 48 } 31 49 32 ServiceLogger(ServiceLog log, org.slf4j.Logger otherLogger)50 ExtensionsLogger(ExtensionsLog log, org.slf4j.Logger otherLogger) 33 51 { 34 52 this.log = log; … … 41 59 also forwarded to the SLF4J logger. 42 60 */ 43 public ServiceLogger wrap(org.slf4j.Logger otherLogger)61 public ExtensionsLogger wrap(org.slf4j.Logger otherLogger) 44 62 { 45 return new ServiceLogger(this.log, otherLogger);63 return new ExtensionsLogger(this.log, otherLogger); 46 64 } 47 65 48 66 /** 49 67 Check if DEBUG logging has been enabled or not. Debug logging 50 can be enabled either by the {@link ServiceLog#setDebugEnabled(boolean)}68 can be enabled either by the {@link ExtensionsLog#setDebugEnabled(boolean)} 51 69 method or by a wrapped {@link Logger}. 52 70 */ … … 58 76 /** 59 77 Check if TRACE logging has been enabled or not. Trace logging is enabled 60 only if both DEBUG logging and {@link ServiceLog#isCopyingToStdout()}78 only if both DEBUG logging and {@link ExtensionsLog#isCopyingToStdout()} 61 79 are enabled or if a wrapped {@link Logger} has it enabled. 62 80 */ -
branches/3.19-stable/www/admin/services/index.jsp
r8124 r8125 34 34 import="net.sf.basedb.util.extensions.Extension" 35 35 import="net.sf.basedb.clients.web.extensions.ExtensionsControl" 36 import="net.sf.basedb.util.extensions.logging. ServiceLogger"37 import="net.sf.basedb.util.extensions.logging. ServiceLog.LogLevel"38 import="net.sf.basedb.util.extensions.logging. ServiceLog"36 import="net.sf.basedb.util.extensions.logging.ExtensionsLogger" 37 import="net.sf.basedb.util.extensions.logging.ExtensionsLog" 38 import="net.sf.basedb.util.extensions.logging.LogLevel" 39 39 import="java.util.List" 40 40 %> … … 80 80 boolean copyToStdout = Values.getBoolean(request.getParameter("copyToStdout")); 81 81 boolean autoUpdate = Values.getBoolean(request.getParameter("autoUpdate")); 82 ServiceLog serviceLog = ServiceLog.getLog(extensionId, true);83 ServiceLogger logger = serviceLog.createLogger();82 ExtensionsLog serviceLog = ExtensionsLog.getLog(extensionId, true); 83 ExtensionsLogger logger = serviceLog.createLogger(); 84 84 if (copyToStdout != serviceLog.isCopyingToStdout()) 85 85 { 86 87 88 86 if (!copyToStdout) logger.info("Stop copy to stdout"); 87 serviceLog.setCopyToStdout(copyToStdout); 88 if (copyToStdout) logger.info("Start copy to stdout"); 89 89 } 90 90 serviceLog.setCopyToStdout(copyToStdout); 91 91 if (enableDebug != serviceLog.isDebugEnabled()) 92 92 { 93 94 95 93 if (!enableDebug) logger.debug("Debug logging was disabled"); 94 serviceLog.setDebugEnabled(enableDebug); 95 if (enableDebug) logger.debug("Debug logging was enabled"); 96 96 } 97 97 redirect = "view_log.jsp?ID="+ID+"&extensionId="+HTML.urlEncode(extensionId)+"&autoUpdate="+autoUpdate; … … 100 100 { 101 101 String extensionId = request.getParameter("extensionId"); 102 ServiceLog serviceLog = ServiceLog.getLog(extensionId, false);102 ExtensionsLog serviceLog = ExtensionsLog.getLog(extensionId, false); 103 103 if (serviceLog != null) 104 104 { 105 106 105 serviceLog.clearLog(); 106 serviceLog.createLogger().log(LogLevel.INFO, "The log was cleared by "+sc.getLoggedInUserName()+" ("+sc.getLoggedInUserLogin()+")"); 107 107 } 108 108 redirect = "view_log.jsp?ID="+ID+"&extensionId="+HTML.urlEncode(extensionId); -
branches/3.19-stable/www/admin/services/services.jsp
r8124 r8125 15 15 import="net.sf.basedb.clients.web.extensions.service.ServiceControllerAction" 16 16 import="net.sf.basedb.clients.web.extensions.service.Services" 17 import="net.sf.basedb.util.extensions.logging. ServiceLog"17 import="net.sf.basedb.util.extensions.logging.ExtensionsLog" 18 18 import="java.util.Iterator" 19 19 %> … … 40 40 try 41 41 { 42 42 %> 43 43 <base:page title="Manage Services" id="list-page"> 44 44 <base:head scripts="table.js,~services.js" styles="table.css"> 45 <ext:scripts context="<%=jspContext 45 <ext:scripts context="<%=jspContext%>" /> 46 46 <ext:stylesheets context="<%=jspContext%>" /> 47 47 </base:head> … … 80 80 <% 81 81 Extension<? extends ServiceControllerAction> last = null; 82 while (it.hasNext()) 83 { 84 numServices++; 85 ServiceControllerAction action = it.next(); 86 Extension<? extends ServiceControllerAction> ext = it.getExtension(); 87 boolean isNewExtension = ext != last; 88 last = ext; 89 ServiceLog serviceLog = ServiceLog.getLog(ext.getId(), false); 90 String serviceLogSummary = ""; 91 String serviceLogIcon = "service_log.png"; 92 if (serviceLog != null) 93 { 94 serviceLogSummary = "View the log for this service; "+ 95 serviceLog.getNumEntries() +" entries; " + 96 serviceLog.getNumErrors()+" errors; "+ 97 serviceLog.getNumWarnings()+" warnings"; 98 if (serviceLog.getNumErrors() > 0) 82 while (it.hasNext()) 99 83 { 100 serviceLogIcon = "service_log_error.png"; 101 } 102 else if (serviceLog.getNumWarnings() > 0) 103 { 104 serviceLogIcon = "service_log_warning.png"; 105 } 106 } 107 boolean isRunning = false; 108 Throwable error = null; 109 try 110 { 111 isRunning = action.isRunning(); 112 if (!isRunning) error = ec.getLastExtensionError(ext.getId()); 113 } 114 catch (Throwable t) 115 { 116 error = t; 117 } 118 boolean hasError = error != null; 119 %> 84 numServices++; 85 ServiceControllerAction action = it.next(); 86 Extension<? extends ServiceControllerAction> ext = it.getExtension(); 87 boolean isNewExtension = ext != last; 88 last = ext; 89 ExtensionsLog serviceLog = ExtensionsLog.getLog(ext.getId(), false); 90 String serviceLogSummary = ""; 91 String serviceLogIcon = "service_log.png"; 92 if (serviceLog != null) 93 { 94 serviceLogSummary = "View the log for this service; "+ 95 serviceLog.getNumEntries() +" entries; " + 96 serviceLog.getNumErrors()+" errors; "+ 97 serviceLog.getNumWarnings()+" warnings"; 98 if (serviceLog.getNumErrors() > 0) 99 { 100 serviceLogIcon = "service_log_error.png"; 101 } 102 else if (serviceLog.getNumWarnings() > 0) 103 { 104 serviceLogIcon = "service_log_warning.png"; 105 } 106 } 107 boolean isRunning = false; 108 Throwable error = null; 109 try 110 { 111 isRunning = action.isRunning(); 112 if (!isRunning) error = ec.getLastExtensionError(ext.getId()); 113 } 114 catch (Throwable t) 115 { 116 error = t; 117 } 118 boolean hasError = error != null; 119 %> 120 120 <tbl:row> 121 121 <tbl:cell column="extension"> -
branches/3.19-stable/www/admin/services/view_log.jsp
r8124 r8125 17 17 import="net.sf.basedb.clients.web.extensions.service.ServiceControllerAction" 18 18 import="net.sf.basedb.clients.web.extensions.service.Services" 19 import="net.sf.basedb.util.extensions.logging. ServiceLog"20 import="net.sf.basedb.util.extensions.logging. ServiceLog.LogEntry"19 import="net.sf.basedb.util.extensions.logging.ExtensionsLog" 20 import="net.sf.basedb.util.extensions.logging.LogEntry" 21 21 import="net.sf.basedb.clients.web.util.HTML" 22 22 import="java.util.Date" … … 32 32 final boolean autoUpdate = Values.getBoolean(request.getParameter("autoUpdate")); 33 33 Extension ext = ExtensionsControl.get(null).getExtension(xtId); 34 ServiceLog serviceLog = ServiceLog.getLog(ext.getId(), true);34 ExtensionsLog serviceLog = ExtensionsLog.getLog(ext.getId(), true); 35 35 try 36 36 { 37 37 %> 38 38 <base:page type="popup" title="View log" id="view-page"> 39 39 <base:head scripts="table.js,~services.js" styles="table.css,toolbar.css">
Note: See TracChangeset
for help on using the changeset viewer.