blob: 1a8d7fda2caac13ad9b59b83a89ce7124acdb9cf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.apache.geode.internal.logging.log4j;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.logging.log4j.Level;
import org.apache.geode.annotations.Immutable;
import org.apache.geode.internal.logging.LogWriterLevel;
/**
* Provides lookup of any string representation of a logging level to Log4J2 {@code Level} or
* {@code LogWriterLevel} int value.
*/
public class LogLevel {
@Immutable
private static final Map<String, Level> ANY_NAME_TO_LEVEL;
@Immutable
private static final Map<String, LogWriterLevel> ANY_NAME_TO_LOGWRITERLEVEL;
static {
Map<String, Level> nameToLevel = new HashMap<>();
Map<String, LogWriterLevel> nameToLogLevel = new HashMap<>();
// LogWriterLevel name to LogWriterLevel
nameToLogLevel.put(LogWriterLevel.NONE.name(), LogWriterLevel.NONE);
nameToLogLevel.put(LogWriterLevel.SEVERE.name(), LogWriterLevel.SEVERE);
nameToLogLevel.put(LogWriterLevel.ERROR.name(), LogWriterLevel.ERROR);
nameToLogLevel.put(LogWriterLevel.WARNING.name(), LogWriterLevel.WARNING);
nameToLogLevel.put(LogWriterLevel.INFO.name(), LogWriterLevel.INFO);
nameToLogLevel.put(LogWriterLevel.CONFIG.name(), LogWriterLevel.CONFIG);
nameToLogLevel.put(LogWriterLevel.FINE.name(), LogWriterLevel.FINE);
nameToLogLevel.put(LogWriterLevel.FINER.name(), LogWriterLevel.FINER);
nameToLogLevel.put(LogWriterLevel.FINEST.name(), LogWriterLevel.FINEST);
nameToLogLevel.put(LogWriterLevel.ALL.name(), LogWriterLevel.ALL);
// additional Log4J2 names to LogWriterLevel
nameToLogLevel.put(Level.OFF.name(), LogWriterLevel.NONE);
nameToLogLevel.put(Level.FATAL.name(), LogWriterLevel.SEVERE);
nameToLogLevel.put(Level.WARN.name(), LogWriterLevel.WARNING);
nameToLogLevel.put(Level.DEBUG.name(), LogWriterLevel.FINE);
nameToLogLevel.put(Level.TRACE.name(), LogWriterLevel.FINEST);
// put all the log4j levels in the map first
Arrays.stream(Level.values()).forEach(level -> {
nameToLevel.put(level.name(), level);
});
// map all the other logwriter level to log4j levels
nameToLevel.put(LogWriterLevel.SEVERE.name(),
LogWriterLevelConverter.toLevel(LogWriterLevel.find(LogWriterLevel.SEVERE.intLevel())));
nameToLevel.put(LogWriterLevel.WARNING.name(),
LogWriterLevelConverter.toLevel(LogWriterLevel.find(LogWriterLevel.WARNING.intLevel())));
nameToLevel.put(LogWriterLevel.CONFIG.name(),
LogWriterLevelConverter.toLevel(LogWriterLevel.find(LogWriterLevel.CONFIG.intLevel())));
nameToLevel.put(LogWriterLevel.FINE.name(),
LogWriterLevelConverter.toLevel(LogWriterLevel.find(LogWriterLevel.FINE.intLevel())));
nameToLevel.put(LogWriterLevel.FINER.name(),
LogWriterLevelConverter.toLevel(LogWriterLevel.find(LogWriterLevel.FINER.intLevel())));
nameToLevel.put(LogWriterLevel.FINEST.name(),
LogWriterLevelConverter.toLevel(LogWriterLevel.find(LogWriterLevel.FINEST.intLevel())));
nameToLevel.put(LogWriterLevel.NONE.name(),
LogWriterLevelConverter.toLevel(LogWriterLevel.find(LogWriterLevel.NONE.intLevel())));
ANY_NAME_TO_LOGWRITERLEVEL = Collections.unmodifiableMap(nameToLogLevel);
ANY_NAME_TO_LEVEL = Collections.unmodifiableMap(nameToLevel);
}
/**
* Convert any string representation of a logging level to a Log4J2 {@code Level}. Returns
* {@code Level.OFF} if invalid.
*
* <p>
* resolve the log4j level from any log statement in the log file.
*/
public static Level resolveLevel(final String anyLevelName) {
Level log4jLevel = ANY_NAME_TO_LEVEL.get(anyLevelName.toUpperCase());
// make sure any unrecognizable log level is assigned a most specific level
return log4jLevel == null ? Level.OFF : log4jLevel;
}
/**
* Convert any string representation of a logging level to a Log4J2 {@code Level}. Returns null
* if invalid.
*
* <p>
* get Log4j Level from either legacy level string or log4j level string
*/
public static Level getLevel(String anyLevelName) {
return ANY_NAME_TO_LEVEL.get(anyLevelName.toUpperCase());
}
/**
* Convert any string representation of a logging level to a {@code LogWriterLevel} int value.
*
* <p>
* convert a string to logwriter code, either log4j level or logwriter string, or a level-xxx
*/
public static int getLogWriterLevel(final String anyLevelName) {
if (anyLevelName == null) {
throw new IllegalArgumentException("LevelName cannot be null");
}
if (ANY_NAME_TO_LOGWRITERLEVEL.get(anyLevelName.toUpperCase()) != null) {
return ANY_NAME_TO_LOGWRITERLEVEL.get(anyLevelName.toUpperCase()).intLevel();
}
if (anyLevelName.toLowerCase().startsWith("level-")) {
String levelValue = anyLevelName.toLowerCase().substring("level-".length());
return Integer.parseInt(levelValue);
}
String values =
Arrays.stream(Level.values()).sorted().map(Level::name).collect(Collectors.joining(", "));
throw new IllegalArgumentException(
"Unknown log-level \"" + anyLevelName + "\". Valid levels are: " + values + ".");
}
}