186 lines
5.9 KiB
Java
186 lines
5.9 KiB
Java
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You 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.juli.logging;
|
|
|
|
import java.util.logging.ConsoleHandler;
|
|
import java.util.logging.Formatter;
|
|
import java.util.logging.Handler;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
/**
|
|
* Hard-coded java.util.logging commons-logging implementation.
|
|
*/
|
|
class DirectJDKLog implements Log {
|
|
// no reason to hide this - but good reasons to not hide
|
|
public final Logger logger;
|
|
|
|
// Alternate config reader and console format
|
|
private static final String SIMPLE_FMT="java.util.logging.SimpleFormatter";
|
|
private static final String FORMATTER="org.apache.juli.formatter";
|
|
|
|
static {
|
|
if (System.getProperty("java.util.logging.config.class") == null &&
|
|
System.getProperty("java.util.logging.config.file") == null) {
|
|
// default configuration - it sucks. Let's override at least the
|
|
// formatter for the console
|
|
try {
|
|
Formatter fmt= (Formatter) Class.forName(System.getProperty(
|
|
FORMATTER, SIMPLE_FMT)).getConstructor().newInstance();
|
|
// it is also possible that the user modified jre/lib/logging.properties -
|
|
// but that's really stupid in most cases
|
|
Logger root=Logger.getLogger("");
|
|
for (Handler handler : root.getHandlers()) {
|
|
// I only care about console - that's what's used in default config anyway
|
|
if (handler instanceof ConsoleHandler) {
|
|
handler.setFormatter(fmt);
|
|
}
|
|
}
|
|
} catch (Throwable t) {
|
|
// maybe it wasn't included - the ugly default will be used.
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
public DirectJDKLog(String name ) {
|
|
logger=Logger.getLogger(name);
|
|
}
|
|
|
|
@Override
|
|
public final boolean isErrorEnabled() {
|
|
return logger.isLoggable(Level.SEVERE);
|
|
}
|
|
|
|
@Override
|
|
public final boolean isWarnEnabled() {
|
|
return logger.isLoggable(Level.WARNING);
|
|
}
|
|
|
|
@Override
|
|
public final boolean isInfoEnabled() {
|
|
return logger.isLoggable(Level.INFO);
|
|
}
|
|
|
|
@Override
|
|
public final boolean isDebugEnabled() {
|
|
return logger.isLoggable(Level.FINE);
|
|
}
|
|
|
|
@Override
|
|
public final boolean isFatalEnabled() {
|
|
return logger.isLoggable(Level.SEVERE);
|
|
}
|
|
|
|
@Override
|
|
public final boolean isTraceEnabled() {
|
|
return logger.isLoggable(Level.FINER);
|
|
}
|
|
|
|
@Override
|
|
public final void debug(Object message) {
|
|
log(Level.FINE, String.valueOf(message), null);
|
|
}
|
|
|
|
@Override
|
|
public final void debug(Object message, Throwable t) {
|
|
log(Level.FINE, String.valueOf(message), t);
|
|
}
|
|
|
|
@Override
|
|
public final void trace(Object message) {
|
|
log(Level.FINER, String.valueOf(message), null);
|
|
}
|
|
|
|
@Override
|
|
public final void trace(Object message, Throwable t) {
|
|
log(Level.FINER, String.valueOf(message), t);
|
|
}
|
|
|
|
@Override
|
|
public final void info(Object message) {
|
|
log(Level.INFO, String.valueOf(message), null);
|
|
}
|
|
|
|
@Override
|
|
public final void info(Object message, Throwable t) {
|
|
log(Level.INFO, String.valueOf(message), t);
|
|
}
|
|
|
|
@Override
|
|
public final void warn(Object message) {
|
|
log(Level.WARNING, String.valueOf(message), null);
|
|
}
|
|
|
|
@Override
|
|
public final void warn(Object message, Throwable t) {
|
|
log(Level.WARNING, String.valueOf(message), t);
|
|
}
|
|
|
|
@Override
|
|
public final void error(Object message) {
|
|
log(Level.SEVERE, String.valueOf(message), null);
|
|
}
|
|
|
|
@Override
|
|
public final void error(Object message, Throwable t) {
|
|
log(Level.SEVERE, String.valueOf(message), t);
|
|
}
|
|
|
|
@Override
|
|
public final void fatal(Object message) {
|
|
log(Level.SEVERE, String.valueOf(message), null);
|
|
}
|
|
|
|
@Override
|
|
public final void fatal(Object message, Throwable t) {
|
|
log(Level.SEVERE, String.valueOf(message), t);
|
|
}
|
|
|
|
// from commons logging. This would be my number one reason why java.util.logging
|
|
// is bad - design by committee can be really bad ! The impact on performance of
|
|
// using java.util.logging - and the ugliness if you need to wrap it - is far
|
|
// worse than the unfriendly and uncommon default format for logs.
|
|
|
|
private void log(Level level, String msg, Throwable ex) {
|
|
if (logger.isLoggable(level)) {
|
|
// Hack (?) to get the stack trace.
|
|
Throwable dummyException=new Throwable();
|
|
StackTraceElement locations[]=dummyException.getStackTrace();
|
|
// Caller will be the third element
|
|
String cname = "unknown";
|
|
String method = "unknown";
|
|
if (locations != null && locations.length >2) {
|
|
StackTraceElement caller = locations[2];
|
|
cname = caller.getClassName();
|
|
method = caller.getMethodName();
|
|
}
|
|
if (ex==null) {
|
|
logger.logp(level, cname, method, msg);
|
|
} else {
|
|
logger.logp(level, cname, method, msg, ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
static Log getInstance(String name) {
|
|
return new DirectJDKLog( name );
|
|
}
|
|
}
|
|
|
|
|