1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache license, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the license for the specific language governing permissions and
15 * limitations under the license.
16 */
17
18 package org.apache.logging.log4j.jul;
19
20 import org.apache.logging.log4j.Level;
21 import org.apache.logging.log4j.Logger;
22 import org.apache.logging.log4j.status.StatusLogger;
23 import org.apache.logging.log4j.util.LoaderUtil;
24 import org.apache.logging.log4j.util.PropertiesUtil;
25
26 /**
27 * Utility class to convert between JDK Levels and Log4j 2 Levels.
28 *
29 * @since 2.1
30 */
31 public final class LevelTranslator {
32
33 /**
34 * Custom Log4j level corresponding to the {@link java.util.logging.Level#FINEST} logging level. This maps to a
35 * level more specific than {@link org.apache.logging.log4j.Level#TRACE}.
36 */
37 public static final Level FINEST = Level.forName("FINEST", Level.TRACE.intLevel() + 100);
38
39 /**
40 * Custom Log4j level corresponding to the {@link java.util.logging.Level#CONFIG} logging level. This maps to a
41 * level in between {@link org.apache.logging.log4j.Level#INFO} and {@link org.apache.logging.log4j.Level#DEBUG}.
42 */
43 public static final Level CONFIG = Level.forName("CONFIG", Level.INFO.intLevel() + 50);
44
45 private static final Logger LOGGER = StatusLogger.getLogger();
46 private static final LevelConverter LEVEL_CONVERTER;
47
48 static {
49 final String levelConverterClassName =
50 PropertiesUtil.getProperties().getStringProperty(Constants.LEVEL_CONVERTER_PROPERTY);
51 if (levelConverterClassName != null) {
52 LevelConverter levelConverter;
53 try {
54 levelConverter = LoaderUtil.newCheckedInstanceOf(levelConverterClassName, LevelConverter.class);
55 } catch (final Exception e) {
56 LOGGER.error("Could not create custom LevelConverter [{}].", levelConverterClassName, e);
57 levelConverter = new DefaultLevelConverter();
58 }
59 LEVEL_CONVERTER = levelConverter;
60 } else {
61 LEVEL_CONVERTER = new DefaultLevelConverter();
62 }
63 }
64
65 /**
66 * Converts a JDK logging Level to a Log4j logging Level.
67 *
68 * @param level JDK Level to convert, may be null per the JUL specification.
69 * @return converted Level or null
70 */
71 public static Level toLevel(final java.util.logging.Level level) {
72 return LEVEL_CONVERTER.toLevel(level);
73 }
74
75 /**
76 * Converts a Log4j logging Level to a JDK logging Level.
77 *
78 * @param level Log4j Level to convert.
79 * @return converted Level.
80 */
81 public static java.util.logging.Level toJavaLevel(final Level level) {
82 return LEVEL_CONVERTER.toJavaLevel(level);
83 }
84
85 private LevelTranslator() {
86 }
87 }