|
What this is
Other links
The source code/* * Copyright 1999-2004 The Apache Sofware Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.tomcat.util.qlog; import org.apache.tomcat.util.collections.SimplePool; /** * A real implementation of the Logger abstraction. * It uses a log queue, so that the caller will not * have to wait. * * @author Anil V (akv@eng.sun.com) * @since Tomcat 3.1 */ public class QueueLogger extends Logger { // will be shared by all loggers private LogDaemon logDaemon = null; // one pool per QueueLogger private SimplePool pool=new SimplePool(); public QueueLogger() { } public void setLogDaemon(LogDaemon ld ) { logDaemon=ld; } /** * Adds a log message and stack trace to the queue and returns * immediately. The logger daemon thread will pick it up later and * actually print it out. * * @param message the message to log. * @param t the exception that was thrown. * @param verbosityLevel what type of message is this? * (WARNING/DEBUG/INFO etc) */ public void log(String prefix, String message, Throwable t, int verbosityLevel) { // System.out.println("XXXZ " + logDaemon + " " + message ); if( ! logDaemon.isStarted() ) { System.out.println("SUPER " + logDaemon + " " + message ); super.log( prefix, message, t , verbosityLevel ); return; } if (verbosityLevel <= getVerbosityLevel()) { // check wheter we are logging to a file if (path!= null){ // If the date has changed, switch log files if (day!=getDay(System.currentTimeMillis())) { synchronized (this) { close(); open(); } } } LogEntry entry=(LogEntry)pool.get(); if( entry == null ) { entry=new LogEntry(this); } if( timestamp ) { entry.setDate(System.currentTimeMillis()); } else { entry.setDate( 0 ); } entry.setPrefix( prefix ); entry.setMessage( message ); entry.setThrowable( t ); logDaemon.add(entry); } } /** Flush the queue - in a separate thread, so that caller doesn't have to wait */ public void flush() { // we need to wait for the log thread to finish, there is // nothing special we can do ( writing will interfere with the // log thread, which logs as soon as it gets an entry ) //emptyQueue(); } // Thread workerThread = new Thread(flusher); // workerThread.start(); // Runnable flusher = new Runnable() { // public void run() { // QueueLogger.emptyQueue(); // }}; private static final char[] NEWLINE=Logger.NEWLINE; // There is only one thread, so we can reuse this char outBuffer[]=new char[512]; // resize StringBuffer outSB = new StringBuffer(); /** Produce output for a log entry, and then recycle it. This method is called from a single thread ( the log daemon ) */ void log(LogEntry logEntry) { if( logEntry==null ) { System.out.println("Null log entry "); return; } try { outSB.setLength(0); logEntry.print( outSB ); outSB.append( NEWLINE ); int len=outSB.length(); if( len > outBuffer.length ) { outBuffer=new char[len]; } outSB.getChars(0, len, outBuffer, 0); if (sink != null) { sink.write( outBuffer, 0, len ); sink.flush(); //System.out.print(sink + " " + new String(outBuffer,0,len) ); } else { System.out.println("No writer "); System.out.print(new String(outBuffer,0,len) ); } } catch (Exception ex) { // IOException ex.printStackTrace(); // nowhere else to write it } pool.put( logEntry ); } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.