Changeset 8123


Ignore:
Timestamp:
Mar 9, 2023, 10:39:30 AM (7 months ago)
Author:
Nicklas Nordborg
Message:

References #2295: Add API for services to send log messages that can be displayed by the web client

Added a TRACE-level to log entries. They are never added to the log that is kept in memory, but can be written to standard output which can be enabled/disabled.

Location:
branches/3.19-stable
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/ServiceLog.java

    r8121 r8123  
    3535import org.slf4j.Logger;
    3636
     37import net.sf.basedb.core.DateUtil;
     38import net.sf.basedb.util.error.ThrowableUtil;
     39
    3740/**
    3841  Instances hold the log entries for a single extension.
     
    8790 
    8891  private boolean isDebugEnabled;
     92  private boolean copyToStdout;
    8993 
    9094  private ServiceLog(String extensionId)
     
    118122  {
    119123    this.isDebugEnabled = debugEnabled;
     124  }
     125 
     126  /**
     127    Are log entries copied to standard output?
     128  */
     129  public boolean isCopyingToStdout()
     130  {
     131    return copyToStdout;
     132  }
     133 
     134  /**
     135    Enable or disable copies of log entries to standard output.
     136    When enabled, TRACE-level log entries are also written if
     137    debugging is enabled.
     138  */
     139  public void setCopyToStdout(boolean copyToStdout)
     140  {
     141    this.copyToStdout = copyToStdout;
    120142  }
    121143 
     
    184206    Add a log entry.
    185207    DEBUG level messages are skipped unless debug-level is enabled.
     208    TRACE level messages are always skipped but can be written to
     209    standard output if that option and debugging is enabled.
    186210  */
    187211  void add(LogEntry entry)
    188212  {
     213    if (copyToStdout && (entry.level != LogLevel.TRACE || isDebugEnabled))
     214    {
     215      System.out.println("["+extensionId+"] "+entry);
     216    }
     217    if (entry.level == LogLevel.TRACE || (entry.level == LogLevel.DEBUG && !isDebugEnabled))
     218    {
     219      return;
     220    }
    189221    // A read lock should be enough since we are using a ConcurrentLinkedDeque that supports multiple threads
    190222    Lock l = lock.readLock();
     
    192224    {
    193225      l.lock();
    194       if (entry.level == LogLevel.DEBUG && !isDebugEnabled) return; //
    195226      logEntries.addFirst(entry);
    196227      if (entry.level == LogLevel.WARNING) numWarnings++;
    197228      if (entry.level == LogLevel.ERROR) numErrors++;
    198  
     229     
    199230      if (numEntries++ > maxEntries)
    200231      {
     
    258289        logger.debug(msg, t);
    259290      }
     291    },
     292    TRACE("trace.png")
     293    {
     294      @Override
     295      void logTo(Logger logger, String msg, Throwable t)
     296      {
     297        logger.trace(msg, t);
     298      }
    260299    };
    261300   
     
    335374      return t;
    336375    }
     376
     377    @Override
     378    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    }
    337387   
    338388  }
  • branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/ServiceLogger.java

    r8121 r8123  
    4747 
    4848  /**
    49     Check if debug logging has been enabled or not.
     49    Check if DEBUG logging has been enabled or not. Debug logging
     50    can be enabled either by the {@link ServiceLog#setDebugEnabled(boolean)}
     51    method or by a wrapped {@link Logger}.
    5052  */
    5153  public boolean isDebugEnabled()
    5254  {
    53     return log.isDebugEnabled();
     55    return log.isDebugEnabled() || otherLogger != null && otherLogger.isDebugEnabled();
     56  }
     57 
     58  /**
     59    Check if TRACE logging has been enabled or not. Trace logging is enabled
     60    only if both DEBUG logging and {@link ServiceLog#isCopyingToStdout()}
     61    are enabled or if a wrapped {@link Logger} has it enabled.
     62  */
     63  public boolean isTraceEnabled()
     64  {
     65    return (log.isCopyingToStdout() && isDebugEnabled()) ||
     66      (otherLogger != null && otherLogger.isTraceEnabled());
    5467  }
    5568 
     
    133146 
    134147  /**
    135     Check if TRACE-level logging has been enabled in the
    136     related SLF4J logger. If no SLF4J logger is related
    137     (see {@link #wrap(org.slf4j.Logger)}) all TRACE messages
    138     will be ignored.
    139   */
    140   public boolean isTraceEnabled()
    141   {
    142     return otherLogger != null && otherLogger.isTraceEnabled();
    143   }
    144   /**
    145148    Log a TRACE message with the related SLF4J logger.
    146149    If no SLF4J logger is related
     
    150153  public void trace(String msg)
    151154  {
    152     if (otherLogger != null) otherLogger.trace(msg);
     155    log(LogLevel.TRACE, msg);
    153156  }
    154157  /**
     
    160163  public void trace(String msg, Throwable t)
    161164  {
    162     if (otherLogger != null) otherLogger.trace(msg, t);
     165    log(LogLevel.TRACE, msg, t);
    163166  }
    164167 
  • branches/3.19-stable/www/admin/services/index.jsp

    r8120 r8123  
    7474    redirect = "services.jsp?ID=" + ID;
    7575  }
    76   else if ("SetDebug".equals(cmd))
     76  else if ("SetOptions".equals(cmd))
    7777  {
    7878    String extensionId = request.getParameter("extensionId");
    79     boolean enable = Values.getBoolean(request.getParameter("enable"));
     79    boolean enableDebug = Values.getBoolean(request.getParameter("enableDebug"));
     80    boolean copyToStdout = Values.getBoolean(request.getParameter("copyToStdout"));
     81    boolean autoUpdate = Values.getBoolean(request.getParameter("autoUpdate"));
    8082    ServiceLog serviceLog = ServiceLog.getLog(extensionId, true);
    81     if (enable != serviceLog.isDebugEnabled())
     83    ServiceLogger logger = serviceLog.createLogger();
     84    if (copyToStdout != serviceLog.isCopyingToStdout())
    8285    {
    83       ServiceLogger logger = serviceLog.createLogger();
    84       if (!enable) logger.log(LogLevel.DEBUG, "Debug logging was disabled");
    85       serviceLog.setDebugEnabled(enable);
    86       if (enable) logger.log(LogLevel.DEBUG, "Debug logging was enabled");
     86      if (!copyToStdout) logger.info("Stop copy to stdout");
     87      serviceLog.setCopyToStdout(copyToStdout);
     88      if (copyToStdout) logger.info("Start copy to stdout");
    8789    }
    88     redirect = "view_log.jsp?ID="+ID+"&extensionId="+HTML.urlEncode(extensionId);
     90    serviceLog.setCopyToStdout(copyToStdout);
     91    if (enableDebug != serviceLog.isDebugEnabled())
     92    {
     93      if (!enableDebug) logger.debug("Debug logging was disabled");
     94      serviceLog.setDebugEnabled(enableDebug);
     95      if (enableDebug) logger.debug("Debug logging was enabled");
     96    }
     97    redirect = "view_log.jsp?ID="+ID+"&extensionId="+HTML.urlEncode(extensionId)+"&autoUpdate="+autoUpdate;
    8998  }
    9099  else if ("ClearLog".equals(cmd))
  • branches/3.19-stable/www/admin/services/services.js

    r8122 r8123  
    3737     
    3838      Buttons.addClickHandler('btnClearLog', services.clearLog);
    39       Events.addEventHandler('enableDebug', 'change', services.toggleDebugLog);
     39      Events.addEventHandler('enableDebug', 'change', services.setOptions);
     40      Events.addEventHandler('copyToStdout', 'change', services.setOptions);
    4041     
    4142      // Auto-update timer
     
    106107  }
    107108 
    108   services.toggleDebugLog = function()
     109  services.setOptions = function()
    109110  {
    110111    var extensionId = Data.get('page-data', 'extension-id');
    111112    var url = 'index.jsp?ID='+App.getSessionId();
    112     url += '&cmd=SetDebug';
     113    url += '&cmd=SetOptions';
    113114    url += '&extensionId='+extensionId;
    114     url += '&enable='+(Doc.element('enableDebug').checked?1:0);
     115    url += '&enableDebug='+(Doc.element('enableDebug').checked?1:0);
     116    url += '&copyToStdout='+(Doc.element('copyToStdout').checked?1:0);
     117    url += '&autoUpdate='+(Doc.element('autoUpdate').checked?1:0);;
    115118    location.replace(url);
    116119  }
  • branches/3.19-stable/www/admin/services/view_log.jsp

    r8122 r8123  
    9393          />
    9494          <tbl:label style="padding-right: 1em;">
    95           <label><input type="checkbox" name="enableDebug"
    96             id="enableDebug" <%=serviceLog.isDebugEnabled()?"checked":""%>
    97             >Enable debug logging</label>
     95            <label><input type="checkbox" name="enableDebug"
     96              id="enableDebug" <%=serviceLog.isDebugEnabled()?"checked":""%>
     97              >Enable debug logging</label>
    9898          </tbl:label>
    9999          <tbl:label style="padding-right: 1em;">
    100           <label><input type="checkbox" name="autoUpdate"
    101             id="autoUpdate" <%=autoUpdate?"checked":"" %>
    102             >Auto update</label>
     100            <label title="All log entries are copied to the regular log file (including TRACE-level entries)"
     101              ><input type="checkbox" name="copyToStdout"
     102              id="copyToStdout" <%=serviceLog.isCopyingToStdout()?"checked":""%>
     103              >Copy to stdout</label>
     104          </tbl:label>
     105          <tbl:label style="padding-right: 1em;">
     106            <label><input type="checkbox" name="autoUpdate"
     107              id="autoUpdate" <%=autoUpdate?"checked":"" %>
     108              >Auto update</label>
    103109          </tbl:label>
    104110        </tbl:toolbar>
     
    139145                    style="display: none;"
    140146                  ><%=ThrowableUtil.stackTraceToString(stacktrace)%></div>
    141                
    142147                <%
    143148              }
Note: See TracChangeset for help on using the changeset viewer.