|
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.modules.config; import java.io.File; import org.apache.tomcat.core.BaseInterceptor; import org.apache.tomcat.core.Context; import org.apache.tomcat.core.ContextManager; import org.apache.tomcat.core.TomcatException; import org.apache.tomcat.util.io.FileUtil; import org.apache.tomcat.util.log.Log; import org.apache.tomcat.util.log.LogManager; import org.apache.tomcat.util.qlog.LogDaemon; import org.apache.tomcat.util.qlog.QueueLogger; /* Logging in Tomcat is quite flexible; we can either have a log file per module (example: ContextManager) or we can have one for Servlets and one for Jasper, or we can just have one tomcat.log for both Servlet and Jasper. Right now there are three standard log streams, "tc_log", "servlet_log", and "JASPER_LOG". Path: The file to which to output this log, relative to TOMCAT_HOME. If you omit a "path" value, then stderr or stdout will be used. Verbosity: Threshold for which types of messages are displayed in the log. Levels are inclusive; that is, "WARNING" level displays any log message marked as warning, error, or fatal. Default level is WARNING. Note: servlet_log must be level INFORMATION in order to see normal servlet log messages. verbosityLevel values can be: FATAL ERROR WARNING INFORMATION DEBUG Timestamps: By default, logs print a timestamp in the form "yyyy-MM-dd hh:mm:ss" in front of each message. To disable timestamps completely, set 'timestamp="no"'. To use the raw msec-since-epoch, which is more efficient, set 'timestampFormat="msec"'. If you want a custom format, you can use 'timestampFormat="hh:mm:ss"' following the syntax of java.text.SimpleDateFormat (see Javadoc API). For a production environment, we recommend turning timestamps off, or setting the format to "msec". Custom Output: "Custom" means "normal looking". "Non-custom" means "surrounded with funny xml tags". In preparation for possibly disposing of "custom" altogether, now the default is 'custom="yes"' (i.e. no tags) Per-component Debugging: Some components accept a "debug" attribute. This further enhances log output. If you set the "debug" level for a component, it may output extra debugging information. */ /** * Define a logger with the specified name, using the logger * implementation in org.apache.tomcat.util.log.QueueLogger * * Tomcat uses the util.log.Log class - if you want to use * a different logger ( like log4j or jsrXXX ) you need to create a * new interceptor that will use your favorite logger and * create a small adapter ( class extending Log and directing * the output to your favorite logger. * * The only contract used in tomcat for logging is the util.Log. * */ public class LogSetter extends BaseInterceptor { String name; String path; String verbosityLevel="INFORMATION"; boolean servletLogger=false; boolean timestamps=true; String tsFormat=null; QueueLogger ql; public LogSetter() { } /** Set the name of the logger. * Predefined names are: tc_log, servlet_log, JASPER_LOG. */ public void setName( String s ) { name=s; } public void setPath( String s ) { path=s; } public void setVerbosityLevel( String s ) { verbosityLevel=s; } /** This logger will be used for servlet's log. * ( if not set, the logger will output tomcat messages ) */ public void setServletLogger( boolean b ) { servletLogger=b; } /** Display the time of the event ( log ). */ public void setTimestamps( boolean b ) { timestamps=b; } /** Set the format of the timestamp. "msec" will display the raw time ( fastest ), otherwise a SimpleDateFormat. */ public void setTimestampFormat( String s ) { tsFormat=s; } /** * The log will be added and opened as soon as the module is * added to the server */ public void addInterceptor(ContextManager cm, Context ctx, BaseInterceptor module) throws TomcatException { if( module!=this ) return; LogManager logManager=(LogManager)cm.getNote("tc.LogManager"); // Log will redirect all Log.getLog to us if( logManager==null ) { logManager=new TomcatLogManager(); cm.setNote("tc.LogManager", logManager); Log.setLogManager( logManager ); } LogDaemon logDaemon=(LogDaemon)cm.getNote("tc.LogDaemon"); if( logDaemon==null ) { logDaemon=new LogDaemon(); cm.setNote( "tc.LogDaemon", logDaemon ); logDaemon.start(); } if( name==null ) { if( servletLogger ) name="org/apache/tomcat/facade"; else name="org/apache/tomcat/core"; } if( path!=null && ! FileUtil.isAbsolute( path ) ) { File wd= new File(cm.getHome(), path); path= wd.getAbsolutePath(); } // workarounds for legacy log names if( "tc_log".equals( name ) ) name="org/apache/tomcat/core"; if( servletLogger || "servlet_log".equals( name ) ) name="org/apache/tomcat/facade"; if( ctx != null ) { // this logger is local to a context name=name + "/" + ctx.getId(); } createLogger(logManager, logDaemon ); } public void engineInit( ContextManager cm ) throws TomcatException { // make sure it's started LogDaemon logDaemon=(LogDaemon)cm.getNote("tc.LogDaemon"); logDaemon.start(); } public void engineShutdown(ContextManager cm) throws TomcatException { if( getContext() != null ) return; if( debug > 0 ) log( "Stopping the logger " + name); cm.getLog().flush(); if( ql!=null ) ql.flush(); // engineShutdown shouldn't be called on local modules anyway ! LogDaemon logDaemon=(LogDaemon)cm.getNote("tc.LogDaemon"); if( logDaemon!=null ) { try{ logDaemon.stop(); } catch( Exception ex ) { ex.printStackTrace(); } // cm.setNote( "tc.LogDaemon", null ); } } /** Set default ServletLog for Context if necessary */ public void addContext( ContextManager cm, Context ctx ) throws TomcatException { if( "org/apache/tomcat/facade".equals( name ) && ctx.getServletLog() == null ) { ctx.setServletLog( Log.getLog( name, ctx.getId() ) ); } } /** Adapter and registry for QueueLoggers */ static class TomcatLogManager extends LogManager { TomcatLogManager() { // can't be changed after this LogManager olm=Log.setLogManager( this ); this.loggers=olm.getLoggers(); this.channels=olm.getChannels(); } } private void createLogger(LogManager logManager, LogDaemon logDaemon) { if( debug>0) log( "Constructing logger " + name + " " + path + " " + ctx ); ql=new QueueLogger(); ql.setLogDaemon( logDaemon ); if( ! timestamps ) ql.setTimestamp( "false" ); if( tsFormat!=null ) ql.setTimestampFormat( tsFormat ); if( path!=null ) ql.setPath(path); if( verbosityLevel!= null ) ql.setVerbosityLevel(verbosityLevel); ql.open(); logManager.addChannel( name, ql ); if( "org/apache/tomcat/core".equals( name ) ) { // this will be the Log interface to the log we just created // ( the way logs and channels are created is a bit // complicated - work for later ) cm.setLog( Log.getLog( name, "ContextManager")); } if( ctx!=null ) { if( servletLogger ) { ctx.setServletLog( Log.getLog( name, ctx.getId() ) ); } else { ctx.setLog( Log.getLog( name, ctx.getId() ) ); } } } } |
... 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.