Class ThreadContext
- java.lang.Object
-
- org.apache.logging.log4j.ThreadContext
-
public final class ThreadContext extends java.lang.Object
The ThreadContext allows applications to store information either in a Map or a Stack.The MDC is managed on a per thread basis. To enable automatic inheritance of copies of the MDC to newly created threads, enable the "isThreadContextMapInheritable" Log4j system property.
- See Also:
- Thread Context Manual
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
ThreadContext.ContextStack
The ThreadContext Stack interface.
-
Field Summary
Fields Modifier and Type Field Description static java.util.Map<java.lang.String,java.lang.String>
EMPTY_MAP
Empty, immutable Map.static ThreadContextStack
EMPTY_STACK
Empty, immutable ContextStack.
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static void
clearAll()
Clears the context map and stack.static void
clearMap()
Clears the context map.static void
clearStack()
Clears the stack for this thread.static ThreadContext.ContextStack
cloneStack()
Returns a copy of this thread's stack.static boolean
containsKey(java.lang.String key)
Determines if the key is in the context.static java.lang.String
get(java.lang.String key)
Gets the context value identified by thekey
parameter.static java.util.Map<java.lang.String,java.lang.String>
getContext()
Returns a mutable copy of current thread's context Map.static int
getDepth()
Gets the current nesting depth of this thread's stack.static java.util.Map<java.lang.String,java.lang.String>
getImmutableContext()
Returns an immutable view of the current thread's context Map.static ThreadContext.ContextStack
getImmutableStack()
Gets an immutable copy of this current thread's context stack.static ReadOnlyThreadContextMap
getThreadContextMap()
Returns a read-only view of the internal data structure used to store thread context key-value pairs, ornull
if the internal data structure does not implement theReadOnlyThreadContextMap
interface.static void
init()
Consider private, used for testing.static boolean
isEmpty()
Returns true if the Map is empty.static java.lang.String
peek()
Looks at the last diagnostic context at the top of this NDC without removing it.static java.lang.String
pop()
Returns the value of the last item placed on the stack.static void
push(java.lang.String message)
Pushes new diagnostic context information for the current thread.static void
push(java.lang.String message, java.lang.Object... args)
Pushes new diagnostic context information for the current thread.static void
put(java.lang.String key, java.lang.String value)
Puts a context value (thevalue
parameter) as identified with thekey
parameter into the current thread's context map.static void
putAll(java.util.Map<java.lang.String,java.lang.String> m)
Puts all given context map entries into the current thread's context map.static void
putIfNull(java.lang.String key, java.lang.String value)
Puts a context value (thevalue
parameter) as identified with thekey
parameter into the current thread's context map if the key does not exist.static void
remove(java.lang.String key)
Removes the context value identified by thekey
parameter.static void
removeAll(java.lang.Iterable<java.lang.String> keys)
Removes the context values identified by thekeys
parameter.static void
removeStack()
Removes the diagnostic context for this thread.static void
setStack(java.util.Collection<java.lang.String> stack)
Sets this thread's stack.static void
trim(int depth)
Trims elements from this diagnostic context.
-
-
-
Field Detail
-
EMPTY_MAP
public static final java.util.Map<java.lang.String,java.lang.String> EMPTY_MAP
Empty, immutable Map.
-
EMPTY_STACK
public static final ThreadContextStack EMPTY_STACK
Empty, immutable ContextStack.
-
-
Method Detail
-
init
public static void init()
Consider private, used for testing.
-
put
public static void put(java.lang.String key, java.lang.String value)
Puts a context value (thevalue
parameter) as identified with thekey
parameter into the current thread's context map.If the current thread does not have a context map it is created as a side effect.
- Parameters:
key
- The key name.value
- The key value.
-
putIfNull
public static void putIfNull(java.lang.String key, java.lang.String value)
Puts a context value (thevalue
parameter) as identified with thekey
parameter into the current thread's context map if the key does not exist.If the current thread does not have a context map it is created as a side effect.
- Parameters:
key
- The key name.value
- The key value.- Since:
- 2.13.0
-
putAll
public static void putAll(java.util.Map<java.lang.String,java.lang.String> m)
Puts all given context map entries into the current thread's context map.If the current thread does not have a context map it is created as a side effect.
- Parameters:
m
- The map.- Since:
- 2.7
-
get
public static java.lang.String get(java.lang.String key)
Gets the context value identified by thekey
parameter.This method has no side effects.
- Parameters:
key
- The key to locate.- Returns:
- The value associated with the key or null.
-
remove
public static void remove(java.lang.String key)
Removes the context value identified by thekey
parameter.- Parameters:
key
- The key to remove.
-
removeAll
public static void removeAll(java.lang.Iterable<java.lang.String> keys)
Removes the context values identified by thekeys
parameter.- Parameters:
keys
- The keys to remove.- Since:
- 2.8
-
clearMap
public static void clearMap()
Clears the context map.
-
clearAll
public static void clearAll()
Clears the context map and stack.
-
containsKey
public static boolean containsKey(java.lang.String key)
Determines if the key is in the context.- Parameters:
key
- The key to locate.- Returns:
- True if the key is in the context, false otherwise.
-
getContext
public static java.util.Map<java.lang.String,java.lang.String> getContext()
Returns a mutable copy of current thread's context Map.- Returns:
- a mutable copy of the context.
-
getImmutableContext
public static java.util.Map<java.lang.String,java.lang.String> getImmutableContext()
Returns an immutable view of the current thread's context Map.- Returns:
- An immutable view of the ThreadContext Map.
-
getThreadContextMap
public static ReadOnlyThreadContextMap getThreadContextMap()
Returns a read-only view of the internal data structure used to store thread context key-value pairs, ornull
if the internal data structure does not implement theReadOnlyThreadContextMap
interface.The
DefaultThreadContextMap
implementation does not implementReadOnlyThreadContextMap
, so by default this method returnsnull
.- Returns:
- the internal data structure used to store thread context key-value pairs or
null
- Since:
- 2.8
- See Also:
ThreadContextMapFactory
,DefaultThreadContextMap
,CopyOnWriteSortedArrayThreadContextMap
,GarbageFreeSortedArrayThreadContextMap
-
isEmpty
public static boolean isEmpty()
Returns true if the Map is empty.- Returns:
- true if the Map is empty, false otherwise.
-
clearStack
public static void clearStack()
Clears the stack for this thread.
-
cloneStack
public static ThreadContext.ContextStack cloneStack()
Returns a copy of this thread's stack.- Returns:
- A copy of this thread's stack.
-
getImmutableStack
public static ThreadContext.ContextStack getImmutableStack()
Gets an immutable copy of this current thread's context stack.- Returns:
- an immutable copy of the ThreadContext stack.
-
setStack
public static void setStack(java.util.Collection<java.lang.String> stack)
Sets this thread's stack.- Parameters:
stack
- The stack to use.
-
getDepth
public static int getDepth()
Gets the current nesting depth of this thread's stack.- Returns:
- the number of items in the stack.
- See Also:
trim(int)
-
pop
public static java.lang.String pop()
Returns the value of the last item placed on the stack.The returned value is the value that was pushed last. If no context is available, then the empty string "" is returned.
- Returns:
- String The innermost diagnostic context.
-
peek
public static java.lang.String peek()
Looks at the last diagnostic context at the top of this NDC without removing it.The returned value is the value that was pushed last. If no context is available, then the empty string "" is returned.
- Returns:
- String The innermost diagnostic context.
-
push
public static void push(java.lang.String message)
Pushes new diagnostic context information for the current thread.The contents of the
message
parameter is determined solely by the client.- Parameters:
message
- The new diagnostic context information.
-
push
public static void push(java.lang.String message, java.lang.Object... args)
Pushes new diagnostic context information for the current thread.The contents of the
message
and args parameters are determined solely by the client. The message will be treated as a format String and tokens will be replaced with the String value of the arguments in accordance with ParameterizedMessage.- Parameters:
message
- The new diagnostic context information.args
- Parameters for the message.
-
removeStack
public static void removeStack()
Removes the diagnostic context for this thread.Each thread that created a diagnostic context by calling
push(java.lang.String)
should call this method before exiting. Otherwise, the memory used by the thread cannot be reclaimed by the VM.As this is such an important problem in heavy duty systems and because it is difficult to always guarantee that the remove method is called before exiting a thread, this method has been augmented to lazily remove references to dead threads. In practice, this means that you can be a little sloppy and occasionally forget to call
remove(java.lang.String)
before exiting a thread. However, you must callremove
sometime. If you never call it, then your application is sure to run out of memory.
-
trim
public static void trim(int depth)
Trims elements from this diagnostic context. If the current depth is smaller or equal tomaxDepth
, then no action is taken. If the current depth is larger than newDepth then all elements at maxDepth or higher are discarded.This method is a convenient alternative to multiple
pop()
calls. Moreover, it is often the case that at the end of complex call sequences, the depth of the ThreadContext is unpredictable. Thetrim
method circumvents this problem.For example, the combination
void foo() { final int depth = ThreadContext.getDepth(); // ... complex sequence of calls ThreadContext.trim(depth); }
ensures that between the entry and exit of
foo
the depth of the diagnostic stack is conserved.- Parameters:
depth
- The number of elements to keep.- See Also:
getDepth()
-
-