/*
* Copyright (C) 2012 Facebook, Inc.
*
* 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 com.facebook.logging;
import org.slf4j.LoggerFactory;
/**
* Logger with efficient var-args support. Underlying logger is sl4j, but may be swapped to
* any logger.
*/
public class LoggerImpl implements Logger {
private final org.slf4j.Logger logger;
public LoggerImpl(org.slf4j.Logger logger) {
this.logger = logger;
}
public static Logger getLogger(Class<?> clazz) {
org.slf4j.Logger logger = LoggerFactory.getLogger(clazz);
return new LoggerImpl(logger);
}
public static Logger getLogger(String name) {
org.slf4j.Logger logger = LoggerFactory.getLogger(name);
return new LoggerImpl(logger);
}
/**
* Returns a logger for the calling class or context.
* <p/>
* The fully-qualified name of that class is used to get an slf4j logger, which is then wrapped.
* Typical usage is to use this method to initialize a static member variable, e.g.,
* {@code private static final Logger LOG = Logger.getLogger();}
* <p/>
* As getStackTrace() isn't super cheap, this is not the sort of thing you want (or need)
* to be doing hundreds of times a second;
*
* @return a logger for the current scope
*/
public static Logger getClassLogger() {
StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement element = stacktrace[2];
String name = element.getClassName();
return new LoggerImpl(LoggerFactory.getLogger(name));
}
@Override
public boolean isTraceEnabled() {
return logger.isTraceEnabled();
}
@Override
public boolean isDebugEnabled() {
return logger.isDebugEnabled();
}
@Override
public boolean isInfoEnabled() {
return logger.isInfoEnabled();
}
@Override
public boolean isWarnEnabled() {
return logger.isWarnEnabled();
}
@Override
public boolean isErrorEnabled() {
return logger.isErrorEnabled();
}
@Override
public void trace(String format, Object... args) {
if (logger.isTraceEnabled()) {
logger.trace(formatMessage(format, args));
}
}
@Override
public void trace(Throwable t, String format, Object... args) {
if (logger.isTraceEnabled()) {
logger.trace(formatMessage(format, args), t);
}
}
@Override
public void debug(String format, Object... args) {
if (logger.isDebugEnabled()) {
String message = formatMessage(format, args);
logger.debug(message);
}
}
@Override
public void debug(Throwable t, String format, Object... args) {
if (logger.isDebugEnabled()) {
String message = formatMessage(format, args);
logger.debug(message, t);
}
}
@Override
@Deprecated
public void debug(String message, Throwable throwable) {
if (logger.isDebugEnabled()) {
logger.debug(message, throwable);
}
}
@Override
public void info(String format, Object... args) {
if (logger.isInfoEnabled()) {
String message = formatMessage(format, args);
logger.info(message);
}
}
@Override
public void info(Throwable t, String format, Object... args) {
if (logger.isInfoEnabled()) {
String message = formatMessage(format, args);
logger.info(message, t);
}
}
@Override
@Deprecated
public void info(String message, Throwable throwable) {
if (logger.isInfoEnabled()) {
logger.warn(message, throwable);
}
}
@Override
public void warn(String format, Object... args) {
if (logger.isWarnEnabled()) {
String message = formatMessage(format, args);
logger.warn(message);
}
}
@Override
public void warn(Throwable t, String format, Object... args) {
if (logger.isWarnEnabled()) {
String message = formatMessage(format, args);
logger.warn(message, t);
}
}
@Override
@Deprecated
public void warn(String message, Throwable throwable) {
if (logger.isWarnEnabled()) {
logger.warn(message, throwable);
}
}
@Override
public void error(String format, Object... args) {
if (logger.isErrorEnabled()) {
String message = formatMessage(format, args);
logger.error(message);
}
}
@Override
public void error(Throwable t, String format, Object... args) {
if (logger.isErrorEnabled()) {
String message = formatMessage(format, args);
logger.error(message, t);
}
}
@Override
@Deprecated
public void error(String message, Throwable throwable) {
if (logger.isErrorEnabled()) {
logger.error(message, throwable);
}
}
@Override
public String getName() {
return logger.getName();
}
private String formatMessage(String format, Object[] args) {
return args.length == 0 ? format : String.format(format, args);
}
}