/* * Copyright 2014 Guillaume Nodet. * * 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.ops4j.pax.logging.log4j2.internal; import java.util.Map; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.impl.ThrowableProxy; import org.ops4j.pax.logging.PaxLogger; import org.ops4j.pax.logging.spi.PaxLevel; import org.ops4j.pax.logging.spi.PaxLocationInfo; import org.ops4j.pax.logging.spi.PaxLoggingEvent; public class PaxLoggingEventImpl implements PaxLoggingEvent { static { // Force the two classes to be loaded in case the bundle is refreshed new PaxLocationInfoImpl(null); new PaxLevelImpl(Level.DEBUG); } private final LogEvent event; public PaxLoggingEventImpl(LogEvent event) { this.event = event; } @Override public PaxLocationInfo getLocationInformation() { return new PaxLocationInfoImpl(event.getSource()); } @Override public PaxLevel getLevel() { return new PaxLevelImpl(event.getLevel()); } @Override public String getLoggerName() { return event.getLoggerName(); } @Override public String getMessage() { return event.getMessage().getFormattedMessage(); } @Override public String getRenderedMessage() { return event.getMessage().getFormattedMessage(); } @Override public String getThreadName() { return event.getThreadName(); } @Override public String[] getThrowableStrRep() { ThrowableProxy t = event.getThrownProxy(); return t != null ? t.getExtendedStackTraceAsString("").split("\n") : null; } @Override public boolean locationInformationExists() { return event.isIncludeLocation(); } @Override public long getTimeStamp() { return event.getTimeMillis(); } @Override public String getFQNOfLoggerClass() { return event.getLoggerFqcn(); } @Override public Map getProperties() { return event.getContextMap(); } static class PaxLocationInfoImpl implements PaxLocationInfo { private final StackTraceElement source; public PaxLocationInfoImpl(StackTraceElement source) { this.source = source; } @Override public String getFileName() { String s = source != null ? source.getFileName() : null; return s != null ? s : "?"; } @Override public String getClassName() { String s = source != null ? source.getClassName() : null; return s != null ? s : "?"; } @Override public String getLineNumber() { return source != null ? Integer.toString(source.getLineNumber()) : "?"; } @Override public String getMethodName() { String s = source != null ? source.getMethodName() : null; return s != null ? s : "?"; } } static class PaxLevelImpl implements PaxLevel { // this data comes from the log4j level class public static final int SYSLOG_DEBUG = 7; public static final int SYSLOG_INFO = 6; public static final int SYSLOG_WARN = 4; public static final int SYSLOG_ERROR = 3; public static final int SYSLOG_OFF = 0; private final Level level; public PaxLevelImpl(Level level) { this.level = level; } @Override public boolean isGreaterOrEqual(PaxLevel r) { return getSyslogEquivalent() <= r.getSyslogEquivalent(); } @Override public int toInt() { int lvl = level.intLevel(); if (lvl <= Level.ERROR.intLevel()) { return PaxLogger.LEVEL_ERROR; } if (lvl <= Level.WARN.intLevel()) { return PaxLogger.LEVEL_WARNING; } if (lvl <= Level.INFO.intLevel()) { return PaxLogger.LEVEL_INFO; } if (lvl <= Level.DEBUG.intLevel()) { return PaxLogger.LEVEL_DEBUG; } return PaxLogger.LEVEL_TRACE; } @Override public int getSyslogEquivalent() { int lvl = level.intLevel(); if (lvl <= Level.OFF.intLevel()) { return SYSLOG_OFF; } if (lvl <= Level.ERROR.intLevel()) { return SYSLOG_ERROR; } if (lvl <= Level.WARN.intLevel()) { return SYSLOG_WARN; } if (lvl <= Level.INFO.intLevel()) { return SYSLOG_INFO; } return SYSLOG_DEBUG; } @Override public String toString() { return level.toString(); } } }