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 package org.apache.logging.log4j.spi;
18
19 import org.apache.logging.log4j.message.MessageFactory;
20
21 /**
22 * Anchor point for logging implementations.
23 */
24 public interface LoggerContext {
25
26 /**
27 * An anchor for some other context, such as a ClassLoader or ServletContext.
28 * @return The external context.
29 */
30 Object getExternalContext();
31
32 /**
33 * Retrieve an object by its name.
34 * @param key The object's key.
35 * @since 2.13.0
36 */
37 default Object getObject(String key) {
38 return null;
39 }
40
41 /**
42 * Store an object into the LoggerContext by name for later use.
43 * @param key The object's key.
44 * @param value The object.
45 * @return The previous object or null.
46 * @since 2.13.0
47 */
48 default Object putObject(String key, Object value) {
49 return null;
50 }
51
52 /**
53 * Store an object into the LoggerContext by name for later use if an object is not already stored with that key.
54 * @param key The object's key.
55 * @param value The object.
56 * @return The previous object or null.
57 * @since 2.13.0
58 */
59 default Object putObjectIfAbsent(String key, Object value) {
60 return null;
61 }
62
63 /**
64 * Remove an object if it is present.
65 * @param key The object's key.
66 * @return The object if it was present, null if it was not.
67 * @since 2.13.0
68 */
69 default Object removeObject(String key) {
70 return null;
71 }
72
73 /**
74 * Remove an object if it is present and the provided object is stored.
75 * @param key The object's key.
76 * @param value The object.
77 * @return The object if it was present, null if it was not.
78 * @since 2.13.0
79 */
80 default boolean removeObject(String key, Object value) {
81 return false;
82 }
83
84 /**
85 * Returns an ExtendedLogger.
86 * @param name The name of the Logger to return.
87 * @return The logger with the specified name.
88 */
89 ExtendedLogger getLogger(String name);
90
91 /**
92 * Returns an ExtendedLogger using the fully qualified name of the Class as the Logger name.
93 * @param cls The Class whose name should be used as the Logger name.
94 * @return The logger.
95 * @since 2.14.0
96 */
97 default ExtendedLogger getLogger(Class<?> cls) {
98 final String canonicalName = cls.getCanonicalName();
99 return getLogger(canonicalName != null ? canonicalName : cls.getName());
100 }
101
102 /**
103 * Returns an ExtendedLogger.
104 * @param name The name of the Logger to return.
105 * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
106 * the logger but will log a warning if mismatched.
107 * @return The logger with the specified name.
108 */
109 ExtendedLogger getLogger(String name, MessageFactory messageFactory);
110
111 /**
112 * Returns an ExtendedLogger using the fully qualified name of the Class as the Logger name.
113 * @param cls The Class whose name should be used as the Logger name.
114 * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change the
115 * logger but will log a warning if mismatched.
116 * @return The logger.
117 * @since 2.14.0
118 */
119 default ExtendedLogger getLogger(Class<?> cls, MessageFactory messageFactory) {
120 final String canonicalName = cls.getCanonicalName();
121 return getLogger(canonicalName != null ? canonicalName : cls.getName(), messageFactory);
122 }
123
124 /**
125 * Detects if a Logger with the specified name exists.
126 * @param name The Logger name to search for.
127 * @return true if the Logger exists, false otherwise.
128 */
129 boolean hasLogger(String name);
130
131 /**
132 * Detects if a Logger with the specified name and MessageFactory exists.
133 * @param name The Logger name to search for.
134 * @param messageFactory The message factory to search for.
135 * @return true if the Logger exists, false otherwise.
136 * @since 2.5
137 */
138 boolean hasLogger(String name, MessageFactory messageFactory);
139
140 /**
141 * Detects if a Logger with the specified name and MessageFactory type exists.
142 * @param name The Logger name to search for.
143 * @param messageFactoryClass The message factory class to search for.
144 * @return true if the Logger exists, false otherwise.
145 * @since 2.5
146 */
147 boolean hasLogger(String name, Class<? extends MessageFactory> messageFactoryClass);
148 }