001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache license, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the license for the specific language governing permissions and 015 * limitations under the license. 016 */ 017package org.apache.logging.slf4j; 018 019import org.apache.logging.log4j.Level; 020import org.apache.logging.log4j.Marker; 021import org.apache.logging.log4j.message.LoggerNameAwareMessage; 022import org.apache.logging.log4j.message.Message; 023import org.apache.logging.log4j.message.MessageFactory; 024import org.apache.logging.log4j.spi.AbstractLogger; 025import org.slf4j.MarkerFactory; 026import org.slf4j.spi.LocationAwareLogger; 027 028/** 029 * 030 */ 031public class SLF4JLogger extends AbstractLogger { 032 033 private static final long serialVersionUID = 1L; 034 private final org.slf4j.Logger logger; 035 private final LocationAwareLogger locationAwareLogger; 036 037 public SLF4JLogger(final String name, final MessageFactory messageFactory, final org.slf4j.Logger logger) { 038 super(name, messageFactory); 039 this.logger = logger; 040 this.locationAwareLogger = logger instanceof LocationAwareLogger ? (LocationAwareLogger) logger : null; 041 } 042 043 public SLF4JLogger(final String name, final org.slf4j.Logger logger) { 044 super(name); 045 this.logger = logger; 046 this.locationAwareLogger = logger instanceof LocationAwareLogger ? (LocationAwareLogger) logger : null; 047 } 048 049 private int convertLevel(final Level level) { 050 switch (level.getStandardLevel()) { 051 case DEBUG : 052 return LocationAwareLogger.DEBUG_INT; 053 case TRACE : 054 return LocationAwareLogger.TRACE_INT; 055 case INFO : 056 return LocationAwareLogger.INFO_INT; 057 case WARN : 058 return LocationAwareLogger.WARN_INT; 059 case ERROR : 060 return LocationAwareLogger.ERROR_INT; 061 default : 062 return LocationAwareLogger.ERROR_INT; 063 } 064 } 065 066 @Override 067 public Level getLevel() { 068 if (logger.isTraceEnabled()) { 069 return Level.TRACE; 070 } 071 if (logger.isDebugEnabled()) { 072 return Level.DEBUG; 073 } 074 if (logger.isInfoEnabled()) { 075 return Level.INFO; 076 } 077 if (logger.isWarnEnabled()) { 078 return Level.WARN; 079 } 080 if (logger.isErrorEnabled()) { 081 return Level.ERROR; 082 } 083 // Option: throw new IllegalStateException("Unknown SLF4JLevel"); 084 // Option: return Level.ALL; 085 return Level.OFF; 086 } 087 088 public org.slf4j.Logger getLogger() { 089 return locationAwareLogger != null ? locationAwareLogger : logger; 090 } 091 092 private org.slf4j.Marker getMarker(final Marker marker) { 093 if (marker == null) { 094 return null; 095 } 096 final org.slf4j.Marker slf4jMarker = MarkerFactory.getMarker(marker.getName()); 097 final Marker[] parents = marker.getParents(); 098 if (parents != null) { 099 for (final Marker parent : parents) { 100 final org.slf4j.Marker slf4jParent = getMarker(parent); 101 if (!slf4jMarker.contains(slf4jParent)) { 102 slf4jMarker.add(slf4jParent); 103 } 104 } 105 } 106 return slf4jMarker; 107 } 108 109 @Override 110 public boolean isEnabled(final Level level, final Marker marker, final Message data, final Throwable t) { 111 return isEnabledFor(level, marker); 112 } 113 114 @Override 115 public boolean isEnabled(final Level level, final Marker marker, final Object data, final Throwable t) { 116 return isEnabledFor(level, marker); 117 } 118 119 @Override 120 public boolean isEnabled(final Level level, final Marker marker, final String data) { 121 return isEnabledFor(level, marker); 122 } 123 124 @Override 125 public boolean isEnabled(final Level level, final Marker marker, final String data, final Object... p1) { 126 return isEnabledFor(level, marker); 127 } 128 129 @Override 130 public boolean isEnabled(final Level level, final Marker marker, final String data, final Throwable t) { 131 return isEnabledFor(level, marker); 132 } 133 134 private boolean isEnabledFor(final Level level, final Marker marker) { 135 final org.slf4j.Marker slf4jMarker = getMarker(marker); 136 switch (level.getStandardLevel()) { 137 case DEBUG : 138 return logger.isDebugEnabled(slf4jMarker); 139 case TRACE : 140 return logger.isTraceEnabled(slf4jMarker); 141 case INFO : 142 return logger.isInfoEnabled(slf4jMarker); 143 case WARN : 144 return logger.isWarnEnabled(slf4jMarker); 145 case ERROR : 146 return logger.isErrorEnabled(slf4jMarker); 147 default : 148 return logger.isErrorEnabled(slf4jMarker); 149 150 } 151 } 152 153 @Override 154 public void logMessage(final String fqcn, final Level level, final Marker marker, final Message message, final Throwable t) { 155 if (locationAwareLogger != null) { 156 if (message instanceof LoggerNameAwareMessage) { 157 ((LoggerNameAwareMessage) message).setLoggerName(getName()); 158 } 159 locationAwareLogger.log(getMarker(marker), fqcn, convertLevel(level), message.getFormattedMessage(), 160 message.getParameters(), t); 161 } else { 162 switch (level.getStandardLevel()) { 163 case DEBUG : 164 logger.debug(getMarker(marker), message.getFormattedMessage(), message.getParameters(), t); 165 break; 166 case TRACE : 167 logger.trace(getMarker(marker), message.getFormattedMessage(), message.getParameters(), t); 168 break; 169 case INFO : 170 logger.info(getMarker(marker), message.getFormattedMessage(), message.getParameters(), t); 171 break; 172 case WARN : 173 logger.warn(getMarker(marker), message.getFormattedMessage(), message.getParameters(), t); 174 break; 175 case ERROR : 176 logger.error(getMarker(marker), message.getFormattedMessage(), message.getParameters(), t); 177 break; 178 default : 179 logger.error(getMarker(marker), message.getFormattedMessage(), message.getParameters(), t); 180 break; 181 } 182 } 183 } 184 185}