blob: c0e1e5ea3dd878d38c25251629ce327619a84c3d [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Generated by javadoc (17) -->
<title>ContextDataInjector (Apache Log4j Core 2.23.1 API)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="description" content="declaration: package: org.apache.logging.log4j.core, interface: ContextDataInjector">
<meta name="generator" content="javadoc/ClassWriterImpl">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../script-dir/jquery-ui.min.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery-ui.overrides.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jquery-ui.min.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">var evenRowColor = "even-row-color";
var oddRowColor = "odd-row-color";
var tableTab = "table-tab";
var activeTableTab = "active-table-tab";
var pathtoroot = "../../../../../";
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<div class="flex-box">
<header role="banner" class="flex-header">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top">
<div class="skip-nav"><a href="#skip-navbar-top" title="Skip navigation links">Skip navigation links</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="nav-bar-cell1-rev">Class</li>
<li><a href="class-use/ContextDataInjector.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html#class">Help</a></li>
</ul>
</div>
<div class="sub-nav">
<div>
<ul class="sub-nav-list">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method-summary">Method</a></li>
</ul>
<ul class="sub-nav-list">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method-detail">Method</a></li>
</ul>
</div>
<div class="nav-list-search"><label for="search-input">SEARCH:</label>
<input type="text" id="search-input" value="search" disabled="disabled">
<input type="reset" id="reset-button" value="reset" disabled="disabled">
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="flex-content">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="sub-title"><span class="package-label-in-type">Package</span>&nbsp;<a href="package-summary.html">org.apache.logging.log4j.core</a></div>
<h1 title="Interface ContextDataInjector" class="title">Interface ContextDataInjector</h1>
</div>
<section class="class-description" id="class-description">
<dl class="notes">
<dt>All Known Implementing Classes:</dt>
<dd><code><a href="impl/ThreadContextDataInjector.ForCopyOnWriteThreadContextMap.html" title="class in org.apache.logging.log4j.core.impl">ThreadContextDataInjector.ForCopyOnWriteThreadContextMap</a></code>, <code><a href="impl/ThreadContextDataInjector.ForDefaultThreadContextMap.html" title="class in org.apache.logging.log4j.core.impl">ThreadContextDataInjector.ForDefaultThreadContextMap</a></code>, <code><a href="impl/ThreadContextDataInjector.ForGarbageFreeThreadContextMap.html" title="class in org.apache.logging.log4j.core.impl">ThreadContextDataInjector.ForGarbageFreeThreadContextMap</a></code></dd>
</dl>
<hr>
<div class="type-signature"><span class="modifiers">public interface </span><span class="element-name type-name-label">ContextDataInjector</span></div>
<div class="block">Responsible for initializing the context data of LogEvents. Context data is data that is set by the application to be
included in all subsequent log events.
<p><b>NOTE: It is no longer recommended that custom implementations of this interface be provided as it is
difficult to do. Instead, provide a custom ContextDataProvider.</b></p>
<p>
<p>
The source of the context data is implementation-specific. The default source for context data is the ThreadContext.
</p><p>
In some asynchronous models, work may be delegated to several threads, while conceptually this work shares the same
context. In such models, storing context data in <code>ThreadLocal</code> variables is not convenient or desirable.
Users can configure the <code>ContextDataInjectorFactory</code> to provide custom <code>ContextDataInjector</code> objects,
in order to initialize log events with context data from any arbitrary context.
</p><p>
When providing a custom <code>ContextDataInjector</code>, be aware that the <code>ContextDataInjectorFactory</code> may be
invoked multiple times and the various components in Log4j that need access to context data may each have their own
instance of <code>ContextDataInjector</code>.
This includes the object(s) that populate log events, but also various lookups and filters that look at
context data to determine whether an event should be logged.
</p><p>
Implementors should take particular note of how the different methods in the interface have different thread-safety
guarantees to enable optimal performance.
</p></div>
<dl class="notes">
<dt>Since:</dt>
<dd>2.7</dd>
<dt>See Also:</dt>
<dd>
<ul class="see-list">
<li><a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/util/StringMap.html" title="class or interface in org.apache.logging.log4j.util" class="external-link"><code>StringMap</code></a></li>
<li><a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/util/ReadOnlyStringMap.html" title="class or interface in org.apache.logging.log4j.util" class="external-link"><code>ReadOnlyStringMap</code></a></li>
<li><a href="impl/ContextDataInjectorFactory.html" title="class in org.apache.logging.log4j.core.impl"><code>ContextDataInjectorFactory</code></a></li>
<li><a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/ThreadContext.html" title="class or interface in org.apache.logging.log4j" class="external-link"><code>ThreadContext</code></a></li>
<li><a href="impl/ThreadContextDataInjector.html" title="class in org.apache.logging.log4j.core.impl"><code>ThreadContextDataInjector</code></a></li>
</ul>
</dd>
</dl>
</section>
<section class="summary">
<ul class="summary-list">
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>Method Summary</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">All Methods</button><button id="method-summary-table-tab2" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab2', 3)" class="table-tab">Instance Methods</button><button id="method-summary-table-tab3" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab3', 3)" class="table-tab">Abstract Methods</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel">
<div class="summary-table three-column-summary" aria-labelledby="method-summary-table-tab0">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Method</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/util/StringMap.html" title="class or interface in org.apache.logging.log4j.util" class="external-link">StringMap</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#injectContextData(java.util.List,org.apache.logging.log4j.util.StringMap)" class="member-name-link">injectContextData</a><wbr>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="config/Property.html" title="class in org.apache.logging.log4j.core.config">Property</a>&gt;&nbsp;properties,
<a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/util/StringMap.html" title="class or interface in org.apache.logging.log4j.util" class="external-link">StringMap</a>&nbsp;reusable)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Returns a <code>StringMap</code> object initialized with the specified properties and the appropriate
context data.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/util/ReadOnlyStringMap.html" title="class or interface in org.apache.logging.log4j.util" class="external-link">ReadOnlyStringMap</a></code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#rawContextData()" class="member-name-link">rawContextData</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Returns a <code>ReadOnlyStringMap</code> object reflecting the current state of the context.</div>
</div>
</div>
</div>
</div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>Method Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="injectContextData(java.util.List,org.apache.logging.log4j.util.StringMap)">
<h3>injectContextData</h3>
<div class="member-signature"><span class="return-type"><a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/util/StringMap.html" title="class or interface in org.apache.logging.log4j.util" class="external-link">StringMap</a></span>&nbsp;<span class="element-name">injectContextData</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="config/Property.html" title="class in org.apache.logging.log4j.core.config">Property</a>&gt;&nbsp;properties,
<a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/util/StringMap.html" title="class or interface in org.apache.logging.log4j.util" class="external-link">StringMap</a>&nbsp;reusable)</span></div>
<div class="block">Returns a <code>StringMap</code> object initialized with the specified properties and the appropriate
context data. The returned value may be the specified parameter or a different object.
<p>
This method will be called for each log event to initialize its context data and implementors should take
care to make this method as performant as possible while preserving at least the following thread-safety
guarantee.
</p><p>
Thread-safety note: The returned object can safely be passed off to another thread: future changes in the
underlying context data will not be reflected in the returned object.
</p><p>
Example implementation:
</p>
<pre>
public StringMap injectContextData(List<Property> properties, StringMap reusable) {
if (properties == null || properties.isEmpty()) {
// assume context data is stored in a copy-on-write data structure that is safe to pass to another thread
return (StringMap) rawContextData();
}
// first copy configuration properties into the result
ThreadContextDataInjector.copyProperties(properties, reusable);
// then copy context data key-value pairs (may overwrite configuration properties)
reusable.putAll(rawContextData());
return reusable;
}
</pre></div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>properties</code> - Properties from the log4j configuration to be added to the resulting ReadOnlyStringMap. May be
<code>null</code> or empty</dd>
<dd><code>reusable</code> - a <code>StringMap</code> instance that may be reused to avoid creating temporary objects</dd>
<dt>Returns:</dt>
<dd>a <code>StringMap</code> instance initialized with the specified properties and the appropriate
context data. The returned value may be the specified parameter or a different object.</dd>
<dt>See Also:</dt>
<dd>
<ul class="see-list-long">
<li><a href="impl/ThreadContextDataInjector.html#copyProperties(java.util.List,org.apache.logging.log4j.util.StringMap)"><code>ThreadContextDataInjector.copyProperties(List, StringMap)</code></a></li>
</ul>
</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="rawContextData()">
<h3>rawContextData</h3>
<div class="member-signature"><span class="return-type"><a href="https://logging.apache.org/log4j/2.x/apidocs/org/apache/logging/log4j/util/ReadOnlyStringMap.html" title="class or interface in org.apache.logging.log4j.util" class="external-link">ReadOnlyStringMap</a></span>&nbsp;<span class="element-name">rawContextData</span>()</div>
<div class="block">Returns a <code>ReadOnlyStringMap</code> object reflecting the current state of the context. Configuration properties
are not included in the result.
<p>
This method may be called multiple times for each log event by Filters and Lookups and implementors should take
care to make this method as performant as possible while preserving at least the following thread-safety
guarantee.
</p><p>
Thread-safety note: The returned object can only be safely used <em>in the current thread</em>. Changes in the
underlying context may or may not be reflected in the returned object, depending on the context data source and
the implementation of this method. It is not safe to pass the returned object to another thread.
</p></div>
<dl class="notes">
<dt>Returns:</dt>
<dd>a <code>ReadOnlyStringMap</code> object reflecting the current state of the context, may not return <code>null</code></dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
<footer role="contentinfo">
<hr>
<p class="legal-copy"><small><p align="center"> Copyright &copy; 1999-2024 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.<br/> Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, the Apache Logging project logo, and the Apache Log4j logo are trademarks of The Apache Software Foundation. </p></small></p>
</footer>
</div>
</div>
</body>
</html>