code: public  synchronized void log(String tag,
                                    Object o,
                                    Frame frame,
                                    long time)
      {
          StringBuffer buf = new StringBuffer(160);
          
          // Log the time stamp
          if (_logTimeStamps)
          {
              buf.append(_dateFormat.format(time));
              buf.append(' ');
          }
              
              
          // Log the tag
          if (_logTags)
              buf.append(tag);
          
          // Log the label
          if (_logLabels && frame != null)
          {
              buf.append(frame.toString());
          }
          
          // Log the stack depth.
          if (_logStackSize && frame != null)
          {
              buf.append(" >");
              if (frame.getDepth()<10)    
                  buf.append('0');
              buf.append(Integer.toString(frame.getDepth()));  
              buf.append("> ");
          }
          
          // Determine the indent string for the message and append it
          // to the buffer. Only put a newline in the buffer if the first
          // line is not blank
          String nl=__lineSeparator;
          
          if (_logLabels && !_logOneLine && _buffer.size() > 0)
              buf.append(nl);
          
          // Log message
          formatObject(buf,o);
          
          // Add stack frame to message
          if (_logStackTrace && frame != null)
          {
              buf.append(nl);
              buf.append(frame.getStack());
          }
          
          log(buf.toString());
      }
docs: Log a message.
  This method formats the log information as a string and calls
  log(String).  It should only be specialized by a derived
  implementation if the format of the logged messages is to be changed.
  
  @param tag Tag for type of log
  @param msg The message
  @param frame The frame that generated the message.
  @param time The time stamp of the message.