/*
* Copyright 2003-2013 JetBrains s.r.o.
*
* 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 jetbrains.mps.logging;
import jetbrains.mps.util.annotation.ToRemove;
import org.apache.log4j.*;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.project.Project;
/**
* Implement this to have your own appender.
*/
public abstract class MPSAppenderBase extends AppenderSkeleton {
private static volatile int ourCount = 0;
public MPSAppenderBase() {
this("MPS_APPENDER_" + ourCount++);
}
@SuppressWarnings("ParameterHidesMemberVariable")
protected MPSAppenderBase(String name) {
setName(name);
}
public void register() {
register(Logger.getRootLogger());
}
public void unregister() {
unregister(Logger.getRootLogger());
}
protected void register(@NotNull Logger logger) {
logger.addAppender(this);
}
protected void unregister(@NotNull Logger logger) {
logger.removeAppender(this);
}
/**
* @deprecated use with a specified project method instead
*/
@ToRemove(version = 2017.2)
@Deprecated
protected abstract void append(@NotNull Priority level,
@NotNull String categoryName,
@NotNull String message,
@Nullable Throwable t,
@Nullable Object hintObject);
protected /*abstract*/ void append(@Nullable Project project,
@NotNull Priority level,
@NotNull String categoryName,
@NotNull String message,
@Nullable Throwable t,
@Nullable Object hintObject) {
append(level, categoryName, message, t, hintObject);
}
@Override
protected void append(LoggingEvent event) {
ThrowableInformation throwableInformation = event.getThrowableInformation();
String renderedMessage = event.getRenderedMessage();
Object message = event.getMessage();
String categoryName = event.getLoggerName();
Project project = null;
if (renderedMessage != null && renderedMessage.equals(message)) {
message = null;
} else if (message instanceof MessageObject) {
MessageObject messageObject = (MessageObject) message;
renderedMessage = messageObject.getMessage();
message = messageObject.getHintObject();
if (messageObject.getSender() != null) {
categoryName = messageObject.getSender();
}
if (messageObject.getProject() != null) {
project = messageObject.getProject();
}
}
if (renderedMessage == null) {
renderedMessage = "";
}
Throwable throwable = null;
if (throwableInformation != null) {
throwable = throwableInformation.getThrowable();
} else if (message instanceof Throwable) {
throwable = (Throwable) message;
}
append(project, event.getLevel(), categoryName, renderedMessage, throwable, message);
}
@Override
public boolean requiresLayout() {
return true;
}
@Override
public void close() {
}
}