// =================================================================================================
// Copyright 2012 Twitter, Inc.
// -------------------------------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this work except in compliance with the License.
// You may obtain a copy of the License in the LICENSE file, or 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.twitter.common.logging.log4j;
import com.google.common.collect.ImmutableMap;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;
import com.twitter.common.logging.Glog;
import com.twitter.common.logging.Glog.Formatter;
/**
* Log4j Layout to match the format generated by glog.
*
* @see Glog
*/
public class GlogLayout extends Layout implements Formatter<LoggingEvent> {
private static final ImmutableMap<Level, Glog.Level> LEVEL_LABELS =
ImmutableMap.<Level, Glog.Level>builder()
.put(Level.TRACE, Glog.Level.DEBUG)
.put(Level.DEBUG, Glog.Level.DEBUG)
.put(Level.INFO, Glog.Level.INFO)
.put(Level.WARN, Glog.Level.WARNING)
.put(Level.ERROR, Glog.Level.ERROR)
.put(Level.FATAL, Glog.Level.FATAL)
.build();
@Override
public String format(LoggingEvent record) {
return Glog.formatRecord(this, record);
}
@Override
public boolean ignoresThrowable() {
return false; // We handle stack trace formatting.
}
@Override
public void activateOptions() {
// We use no options
}
@Override
public String getMessage(LoggingEvent record) {
return record.getRenderedMessage();
}
@Override
public String getClassName(LoggingEvent record) {
LocationInfo locationInformation = record.getLocationInformation();
return (locationInformation != null)
? locationInformation.getClassName()
: null;
}
@Override
public String getMethodName(LoggingEvent record) {
LocationInfo locationInformation = record.getLocationInformation();
return (locationInformation != null)
? record.getLocationInformation().getMethodName()
: null;
}
@Override
public Glog.Level getLevel(LoggingEvent record) {
return LEVEL_LABELS.get(record.getLevel());
}
@Override
public long getTimeStamp(LoggingEvent record) {
return record.getTimeStamp();
}
@Override
public long getThreadId(LoggingEvent record) {
return Thread.currentThread().getId();
}
@Override
public Throwable getThrowable(LoggingEvent record) {
ThrowableInformation throwableInformation = record.getThrowableInformation();
return throwableInformation != null ? throwableInformation.getThrowable() : null;
}
}