You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2016/03/01 19:43:30 UTC

[1/2] logging-log4j2 git commit: [LOG4J2-1299] Add pattern converter for thread id and priority in PatternLayout.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 1bd8a5139 -> 585beba1e


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
----------------------------------------------------------------------
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
index 611f23f..769fa74 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
@@ -248,6 +248,24 @@ public class FlumeEvent extends SimpleEvent implements LogEvent {
     }
 
     /**
+     * Returns the ID of the Thread.
+     * @return the ID of the Thread.
+     */
+    @Override
+    public long getThreadId() {
+        return event.getThreadId();
+    }
+
+    /**
+     * Returns the priority of the Thread.
+     * @return the priority of the Thread.
+     */
+    @Override
+    public int getThreadPriority() {
+        return event.getThreadPriority();
+    }
+
+    /**
      * Returns the name of the Thread.
      * @return the name of the Thread.
      */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-nosql/src/main/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManager.java
----------------------------------------------------------------------
diff --git a/log4j-nosql/src/main/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManager.java b/log4j-nosql/src/main/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManager.java
index d879b07..448cd04 100644
--- a/log4j-nosql/src/main/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManager.java
+++ b/log4j-nosql/src/main/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManager.java
@@ -90,7 +90,9 @@ public final class NoSqlDatabaseManager<W> extends AbstractDatabaseManager {
             entity.set("marker", buildMarkerEntity(marker));
         }
 
+        entity.set("threadId", event.getThreadId());
         entity.set("threadName", event.getThreadName());
+        entity.set("threadPriority", event.getThreadPriority());
         entity.set("millis", event.getTimeMillis());
         entity.set("date", new java.util.Date(event.getTimeMillis()));
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java
----------------------------------------------------------------------
diff --git a/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java b/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java
index d90a804..7809451 100644
--- a/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java
+++ b/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java
@@ -185,7 +185,9 @@ public class NoSqlDatabaseManagerTest {
             expect(message.getFormattedMessage()).andReturn("My formatted message 01.");
             expect(event.getSource()).andReturn(new StackTraceElement("com.foo.Bar", "testMethod01", "Bar.java", 15));
             expect(event.getMarker()).andReturn(null);
+            expect(event.getThreadId()).andReturn(1L);
             expect(event.getThreadName()).andReturn("MyThread-A");
+            expect(event.getThreadPriority()).andReturn(1);
             expect(event.getTimeMillis()).andReturn(1234567890123L).times(2);
             expect(event.getThrown()).andReturn(null);
             expect(event.getContextMap()).andReturn(null);
@@ -293,7 +295,9 @@ public class NoSqlDatabaseManagerTest {
             expect(message.getFormattedMessage()).andReturn("Another cool message 02.");
             expect(event.getSource()).andReturn(new StackTraceElement("com.bar.Foo", "anotherMethod03", "Foo.java", 9));
             expect(event.getMarker()).andReturn(MarkerManager.getMarker("LoneMarker"));
+            expect(event.getThreadId()).andReturn(1L);
             expect(event.getThreadName()).andReturn("AnotherThread-B");
+            expect(event.getThreadPriority()).andReturn(1);
             expect(event.getTimeMillis()).andReturn(987654321564L).times(2);
             expect(event.getThrown()).andReturn(exception);
             expect(event.getContextMap()).andReturn(context);
@@ -443,7 +447,9 @@ public class NoSqlDatabaseManagerTest {
             expect(event.getMarker()).andReturn(
                     MarkerManager.getMarker("AnotherMarker").addParents(MarkerManager.getMarker("Parent1").addParents(MarkerManager.getMarker("GrandParent1")),
                             MarkerManager.getMarker("Parent2")));
+            expect(event.getThreadId()).andReturn(1L);
             expect(event.getThreadName()).andReturn("AnotherThread-B");
+            expect(event.getThreadPriority()).andReturn(1);
             expect(event.getTimeMillis()).andReturn(987654321564L).times(2);
             expect(event.getThrown()).andReturn(exception2);
             expect(event.getContextMap()).andReturn(context);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index d1e92fe..42c4c1b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,9 @@
   </properties>
   <body>
     <release version="2.6" date="2016-MM-DD" description="GA Release 2.6">
+      <action issue="LOG4J2-1299" dev="ggregory" type="add">
+        Add pattern converter for thread id and priority in PatternLayout.
+      </action>
       <action issue="LOG4J2-1271" dev="rpopma" type="add">
         Add MessageFactory that avoid allocation by reusing a cached ParameterizedMessage instance.
       </action>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/src/site/xdoc/manual/layouts.xml.vm
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/layouts.xml.vm b/src/site/xdoc/manual/layouts.xml.vm
index 03b4b05..fa602e4 100644
--- a/src/site/xdoc/manual/layouts.xml.vm
+++ b/src/site/xdoc/manual/layouts.xml.vm
@@ -166,7 +166,9 @@ logger.debug("one={}, two={}, three={}", 1, 2, 3);
             <li>Time Nanos</li>
             <li>Time Millis</li>
             <li>Level</li>
+            <li>Thread ID</li>
             <li>Thread Name</li>
+            <li>Thread Priority</li>
             <li>Formatted Message</li>
             <li>Logger FQCN</li>
             <li>Logger Name</li>
@@ -273,14 +275,18 @@ logger.debug("one={}, two={}, three={}", 1, 2, 3);
     "logger":"com.foo.Bar",
     "timestamp":"1376681196470",
     "level":"INFO",
+    "threadId":1,
     "thread":"main",
+    "threadPriority":1,
     "message":"Message flushed with immediate flush=true"
   },
   {
     "logger":"com.foo.Bar",
     "timestamp":"1376681196471",
     "level":"ERROR",
+    "threadId":1,
     "thread":"main",
+    "threadPriority":1,
     "message":"Message flushed with immediate flush=true",
     "throwable":"java.lang.IllegalArgumentException: badarg\\n\\tat org.apache.logging.log4j.core.appender.JSONCompleteFileAppenderTest.testFlushAtEndOfBatch(JSONCompleteFileAppenderTest.java:54)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\\n\\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\n\\tat java.lang.reflect.Method.invoke(Method.java:606)\\n\\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)\\n\\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\\n\\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)\\n\\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\\n\\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)\\n\\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(Bl
 ockJUnit4ClassRunner.java:70)\\n\\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)\\n\\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)\\n\\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)\\n\\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)\\n\\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)\\n\\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)\\n\\tat org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)\\n\\tat org.junit.runners.ParentRunner.run(ParentRunner.java:309)\\n\\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\\n\\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\\n\\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)\\n\\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
 stRunner.java:683)\\n\\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)\\n\\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)\\n"
   }
@@ -1233,13 +1239,29 @@ WARN  [main]: Message 2</pre>
             </tr>
             <tr>
               <td align="center">
+                <b>T</b><br />
+                <b>tid</b><br />
+                <b>threadId</b>
+              </td>
+              <td>Outputs the ID of the thread that generated the logging event.</td>
+            </tr>
+            <tr>
+              <td align="center">
                 <b>t</b><br />
-                <b>thread</b>
+                <b>thread</b><br />
+                <b>threadName</b>
               </td>
               <td>Outputs the name of the thread that generated the logging event.</td>
             </tr>
             <tr>
               <td align="center">
+                <b>tp</b><br />
+                <b>threadPriority</b>
+              </td>
+              <td>Outputs the priority of the thread that generated the logging event.</td>
+            </tr>
+            <tr>
+              <td align="center">
                 <b>x</b><br />
                 <b>NDC</b>
               </td>
@@ -1714,11 +1736,11 @@ at org.apache.logging.log4j.core.pattern.ExtendedThrowableTest.testException(Ext
           </p>
           <pre class="prettyprint linenums">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 &lt;Events xmlns=&quot;http://logging.apache.org/log4j/2.0/events&quot;&gt;
-  &lt;Event logger=&quot;com.foo.Bar&quot; timestamp=&quot;1373436580419&quot; level=&quot;INFO&quot; thread=&quot;main&quot;&gt;
+  &lt;Event logger=&quot;com.foo.Bar&quot; timestamp=&quot;1373436580419&quot; level=&quot;INFO&quot; threadId=&quot;1&quot; thread=&quot;main&quot; threadPriority=&quot;1&quot;&gt;
     &lt;Message&gt;&lt;![CDATA[This is a log message 1]]&gt;&lt;/Message&gt;
     &lt;Marker parent=&quot;Parent Marker&quot;&gt;&lt;Child Marker&gt;&lt;/Marker&gt;
   &lt;/Event&gt;
-  &lt;Event logger=&quot;com.foo.Baz&quot; timestamp=&quot;1373436580420&quot; level=&quot;INFO&quot; thread=&quot;main&quot;&gt;
+  &lt;Event logger=&quot;com.foo.Baz&quot; timestamp=&quot;1373436580420&quot; level=&quot;INFO&quot; threadId=&quot;1&quot; thread=&quot;main&quot; threadPriority=&quot;1&quot;&gt;
     &lt;Message&gt;&lt;![CDATA[This is a log message 2]]&gt;&lt;/Message&gt;
     &lt;Marker&gt;&lt;The Marker Name&gt;&lt;/Marker&gt;
   &lt;/Event&gt;


Re: [2/2] logging-log4j2 git commit: [LOG4J2-1299] Add pattern converter for thread id and priority in PatternLayout.

Posted by Matt Sicker <bo...@gmail.com>.
Thread.getId() just returns a field value.

On 1 March 2016 at 16:04, Gary Gregory <ga...@gmail.com> wrote:

> YW. I might not be able to get back to this until tonight or tomorrow so
> feel free to tweak.
>
> Gary
> On Mar 1, 2016 1:53 PM, "Remko Popma" <re...@gmail.com> wrote:
>
>> Gary, thanks for doing the work on this!
>>
>> There's no need to cache the thread ID or priority in the
>> ThreadNameCachingStrategy, we can just ask the Thread.currentThread().
>>
>> The reason the thread name is cached is that Thread.getName() is
>> implemented as a JNI method returning a char[] array, which is then wrapped
>> in a new String. There's significant overhead with that. Obtaining an
>> int/long should not have that drawback.
>>
>> (Although I haven't checked the implementation on Thread, I hope they're
>> not expensive JNI methods, that would change things...)
>>
>> Directly calling the relevant methods on Thread also means we don't need
>> to autobox the values which is nice.
>>
>> Sent from my iPhone
>>
>> > On 2016/03/02, at 3:43, ggregory@apache.org wrote:
>> >
>> > ThreadNameCachingStrategy
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>
>>


-- 
Matt Sicker <bo...@gmail.com>

Re: [2/2] logging-log4j2 git commit: [LOG4J2-1299] Add pattern converter for thread id and priority in PatternLayout.

Posted by Gary Gregory <ga...@gmail.com>.
YW. I might not be able to get back to this until tonight or tomorrow so
feel free to tweak.

Gary
On Mar 1, 2016 1:53 PM, "Remko Popma" <re...@gmail.com> wrote:

> Gary, thanks for doing the work on this!
>
> There's no need to cache the thread ID or priority in the
> ThreadNameCachingStrategy, we can just ask the Thread.currentThread().
>
> The reason the thread name is cached is that Thread.getName() is
> implemented as a JNI method returning a char[] array, which is then wrapped
> in a new String. There's significant overhead with that. Obtaining an
> int/long should not have that drawback.
>
> (Although I haven't checked the implementation on Thread, I hope they're
> not expensive JNI methods, that would change things...)
>
> Directly calling the relevant methods on Thread also means we don't need
> to autobox the values which is nice.
>
> Sent from my iPhone
>
> > On 2016/03/02, at 3:43, ggregory@apache.org wrote:
> >
> > ThreadNameCachingStrategy
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>
>

Re: [2/2] logging-log4j2 git commit: [LOG4J2-1299] Add pattern converter for thread id and priority in PatternLayout.

Posted by Remko Popma <re...@gmail.com>.
Gary, thanks for doing the work on this!

There's no need to cache the thread ID or priority in the ThreadNameCachingStrategy, we can just ask the Thread.currentThread(). 

The reason the thread name is cached is that Thread.getName() is implemented as a JNI method returning a char[] array, which is then wrapped in a new String. There's significant overhead with that. Obtaining an int/long should not have that drawback. 

(Although I haven't checked the implementation on Thread, I hope they're not expensive JNI methods, that would change things...)

Directly calling the relevant methods on Thread also means we don't need to autobox the values which is nice. 

Sent from my iPhone

> On 2016/03/02, at 3:43, ggregory@apache.org wrote:
> 
> ThreadNameCachingStrategy

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org


[2/2] logging-log4j2 git commit: [LOG4J2-1299] Add pattern converter for thread id and priority in PatternLayout.

Posted by gg...@apache.org.
[LOG4J2-1299] Add pattern converter for thread id and priority in
PatternLayout.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/585beba1
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/585beba1
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/585beba1

Branch: refs/heads/master
Commit: 585beba1eeebe0ba771ce0e4364954861e1db154
Parents: 1bd8a51
Author: ggregory <gg...@apache.org>
Authored: Tue Mar 1 10:43:21 2016 -0800
Committer: ggregory <gg...@apache.org>
Committed: Tue Mar 1 10:43:21 2016 -0800

----------------------------------------------------------------------
 .../logging/log4j/core/AbstractLogEvent.java    | 10 ++
 .../org/apache/logging/log4j/core/LogEvent.java | 16 +++-
 .../db/jpa/AbstractLogEventWrapperEntity.java   | 20 ++++
 .../appender/db/jpa/BasicLogEventEntity.java    | 22 +++++
 .../logging/log4j/core/async/AsyncLogger.java   | 15 +--
 .../log4j/core/async/RingBufferLogEvent.java    | 28 +++++-
 .../async/RingBufferLogEventTranslator.java     | 28 +++---
 .../core/async/ThreadNameCachingStrategy.java   | 35 ++++++-
 .../logging/log4j/core/impl/Log4jLogEvent.java  | 96 +++++++++++++++-----
 .../log4j/core/jackson/LogEventMixIn.java       | 10 ++
 .../log4j/core/layout/CsvLogEventLayout.java    |  2 +
 .../core/pattern/ThreadIdPatternConverter.java  | 61 +++++++++++++
 .../pattern/ThreadNamePatternConverter.java     | 59 ++++++++++++
 .../core/pattern/ThreadPatternConverter.java    | 59 ------------
 .../pattern/ThreadPriorityPatternConverter.java | 61 +++++++++++++
 .../apache/logging/log4j/core/LogEventTest.java |  2 +
 .../core/appender/db/jpa/JpaH2AppenderTest.java |  2 +-
 .../db/jpa/JpaHyperSqlAppenderTest.java         |  2 +-
 .../core/appender/db/jpa/TestBaseEntity.java    | 12 +++
 .../core/async/RingBufferLogEventTest.java      | 10 +-
 .../log4j/core/impl/Log4jLogEventTest.java      |  3 +-
 .../log4j/core/net/server/ThreadIdFilter.java   | 40 ++++++++
 .../core/net/server/ThreadPriorityFilter.java   | 40 ++++++++
 .../log4j/core/pattern/PatternParserTest.java   | 37 +++++++-
 .../pattern/ThreadIdPatternConverterTest.java   | 39 ++++++++
 .../pattern/ThreadNamePatternConverterTest.java |  2 +-
 .../ThreadPriorityPatternConverterTest.java     | 39 ++++++++
 .../log4j/flume/appender/FlumeEvent.java        | 18 ++++
 .../nosql/appender/NoSqlDatabaseManager.java    |  2 +
 .../appender/NoSqlDatabaseManagerTest.java      |  6 ++
 src/changes/changes.xml                         |  3 +
 src/site/xdoc/manual/layouts.xml.vm             | 28 +++++-
 32 files changed, 689 insertions(+), 118 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java
index cd1b4e9..489a156 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java
@@ -78,11 +78,21 @@ public abstract class AbstractLogEvent implements LogEvent {
     }
 
     @Override
+    public long getThreadId() {
+        return 0;
+    }
+
+    @Override
     public String getThreadName() {
         return null;
     }
 
     @Override
+    public int getThreadPriority() {
+        return 0;
+    }
+
+    @Override
     public Throwable getThrown() {
         return null;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
index e89f6e5..422a2d1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
@@ -106,7 +106,7 @@ public interface LogEvent extends Serializable {
     StackTraceElement getSource();
 
     /**
-     * Gets thread name.
+     * Gets the thread name.
      *
      * @return thread name, may be null.
      * TODO guess this could go into a thread context object too. (RG) Why?
@@ -114,6 +114,20 @@ public interface LogEvent extends Serializable {
     String getThreadName();
 
     /**
+     * Gets the thread ID.
+     *
+     * @return thread ID.
+     */
+    long getThreadId();
+
+    /**
+     * Gets the thread priority.
+     *
+     * @return thread priority.
+     */
+    int getThreadPriority();
+
+    /**
      * Gets throwable associated with logging request.
      *
      * <p>Convenience method for {@code ThrowableProxy.getThrowable();}</p>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractLogEventWrapperEntity.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractLogEventWrapperEntity.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractLogEventWrapperEntity.java
index ae256ef..edddfb4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractLogEventWrapperEntity.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractLogEventWrapperEntity.java
@@ -159,6 +159,16 @@ public abstract class AbstractLogEventWrapperEntity implements LogEvent {
     /**
      * A no-op mutator to satisfy JPA requirements, as this entity is write-only.
      *
+     * @param threadId Ignored.
+     */
+    @SuppressWarnings("unused")
+    public void setThreadId(final long threadId) {
+        // this entity is write-only
+    }
+
+    /**
+     * A no-op mutator to satisfy JPA requirements, as this entity is write-only.
+     *
      * @param threadName Ignored.
      */
     @SuppressWarnings("unused")
@@ -169,6 +179,16 @@ public abstract class AbstractLogEventWrapperEntity implements LogEvent {
     /**
      * A no-op mutator to satisfy JPA requirements, as this entity is write-only.
      *
+     * @param threadPriority Ignored.
+     */
+    @SuppressWarnings("unused")
+    public void setThreadPriority(final int threadPriority) {
+        // this entity is write-only
+    }
+
+    /**
+     * A no-op mutator to satisfy JPA requirements, as this entity is write-only.
+     *
      * @param nanoTime Ignored.
      */
     @SuppressWarnings("unused")

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
index a732e53..8fc49dc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
@@ -147,6 +147,28 @@ public abstract class BasicLogEventEntity extends AbstractLogEventWrapperEntity
     }
 
     /**
+     * Gets the thread ID. Annotated with {@code @Basic}.
+     *
+     * @return the thread ID.
+     */
+    @Override
+    @Basic
+    public long getThreadId() {
+        return this.getWrappedEvent().getThreadId();
+    }
+
+    /**
+     * Gets the thread name. Annotated with {@code @Basic}.
+     *
+     * @return the thread name.
+     */
+    @Override
+    @Basic
+    public int getThreadPriority() {
+        return this.getWrappedEvent().getThreadPriority();
+    }
+
+    /**
      * Gets the thread name. Annotated with {@code @Basic}.
      *
      * @return the thread name.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
index dbee74f..d7ffb3c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
@@ -245,14 +245,15 @@ public class AsyncLogger extends Logger implements EventTranslatorVararg<RingBuf
                 // needs shallow copy to be fast (LOG4J2-154)
                 ThreadContext.getImmutableStack(), //
 
+                THREAD_NAME_CACHING_STRATEGY.getThreadId(), //
+
                 // Thread.currentThread().getName(), //
-                THREAD_NAME_CACHING_STRATEGY.getThreadName(), //
+                THREAD_NAME_CACHING_STRATEGY.getThreadName(),
 
+                THREAD_NAME_CACHING_STRATEGY.getThreadPriority(), //
                 // location (expensive to calculate)
-                calcLocationIfRequested(fqcn),
-
-                eventTimeMillis(message), //
-                nanoClock.nanoTime() //
+                calcLocationIfRequested(fqcn)
+, eventTimeMillis(message), nanoClock.nanoTime() //
                 );
     }
 
@@ -315,10 +316,12 @@ public class AsyncLogger extends Logger implements EventTranslatorVararg<RingBuf
         // needs shallow copy to be fast (LOG4J2-154)
         final ContextStack contextStack = ThreadContext.getImmutableStack();
 
+        final Long threadId = THREAD_NAME_CACHING_STRATEGY.getThreadId();
         final String threadName = THREAD_NAME_CACHING_STRATEGY.getThreadName();
+        final Integer threadPriority = THREAD_NAME_CACHING_STRATEGY.getThreadPriority();
 
         event.setValues(asyncLogger, asyncLogger.getName(), marker, fqcn, level, message, thrown, contextMap,
-                contextStack, threadName, location, eventTimeMillis(message), nanoClock.nanoTime());
+                contextStack, threadId, threadName, threadPriority, location, eventTimeMillis(message), nanoClock.nanoTime());
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
index 010b877..37c7be0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
@@ -119,7 +119,9 @@ public class RingBufferLogEvent implements LogEvent {
     private ThrowableProxy thrownProxy;
     private Map<String, String> contextMap;
     private ContextStack contextStack;
+    private long threadId;
     private String threadName;
+    private int threadPriority;
     private StackTraceElement location;
     private long currentTimeMillis;
     private boolean endOfBatch;
@@ -128,8 +130,8 @@ public class RingBufferLogEvent implements LogEvent {
 
     public void setValues(final AsyncLogger anAsyncLogger, final String aLoggerName, final Marker aMarker,
             final String theFqcn, final Level aLevel, final Message msg, final Throwable aThrowable,
-            final Map<String, String> aMap, final ContextStack aContextStack, final String aThreadName,
-            final StackTraceElement aLocation, final long aCurrentTimeMillis, final long aNanoTime) {
+            final Map<String, String> aMap, final ContextStack aContextStack, long threadId,
+            final String threadName, int threadPriority, final StackTraceElement aLocation, final long aCurrentTimeMillis, final long aNanoTime) {
         this.asyncLogger = anAsyncLogger;
         this.loggerName = aLoggerName;
         this.marker = aMarker;
@@ -150,7 +152,9 @@ public class RingBufferLogEvent implements LogEvent {
         this.thrownProxy = null;
         this.contextMap = aMap;
         this.contextStack = aContextStack;
-        this.threadName = aThreadName;
+        this.threadId = threadId;
+        this.threadName = threadName;
+        this.threadPriority = threadPriority;
         this.location = aLocation;
         this.currentTimeMillis = aCurrentTimeMillis;
         this.nanoTime = aNanoTime;
@@ -259,11 +263,21 @@ public class RingBufferLogEvent implements LogEvent {
     }
 
     @Override
+    public long getThreadId() {
+        return threadId;
+    }
+
+    @Override
     public String getThreadName() {
         return threadName;
     }
 
     @Override
+    public int getThreadPriority() {
+        return threadPriority;
+    }
+
+    @Override
     public StackTraceElement getSource() {
         return location;
     }
@@ -319,10 +333,11 @@ public class RingBufferLogEvent implements LogEvent {
                 null, // t
                 null, // map
                 null, // contextStack
-                null, // threadName
+                0, // threadName
                 null, // location
                 0, // currentTimeMillis
-                0 // nanoTime
+                null, 
+                0, 0 // nanoTime
         );
     }
 
@@ -357,9 +372,12 @@ public class RingBufferLogEvent implements LogEvent {
                 .setMessage(getMessage()) // ensure non-null
                 .setNanoTime(nanoTime) //
                 .setSource(location) //
+                .setThreadId(threadId) //
                 .setThreadName(threadName) //
+                .setThreadPriority(threadPriority) //
                 .setThrown(getThrown()) // may deserialize from thrownProxy
                 .setThrownProxy(thrownProxy) // avoid unnecessarily creating thrownProxy
                 .setTimeMillis(currentTimeMillis);
     }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java
index 519ffb9..37a4825 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java
@@ -43,7 +43,9 @@ public class RingBufferLogEventTranslator implements
     private Throwable thrown;
     private Map<String, String> contextMap;
     private ContextStack contextStack;
+    private long threadId;
     private String threadName;
+    private int threadPriority;
     private StackTraceElement location;
     private long currentTimeMillis;
     private long nanoTime;
@@ -51,9 +53,8 @@ public class RingBufferLogEventTranslator implements
     // @Override
     @Override
     public void translateTo(final RingBufferLogEvent event, final long sequence) {
-        event.setValues(asyncLogger, loggerName, marker, fqcn, level, message,
-                thrown, contextMap, contextStack, threadName, location,
-                currentTimeMillis, nanoTime);
+        event.setValues(asyncLogger, loggerName, marker, fqcn, level, message, thrown, contextMap, contextStack,
+                threadId, threadName, threadPriority, location, currentTimeMillis, nanoTime);
         clear();
     }
 
@@ -71,17 +72,18 @@ public class RingBufferLogEventTranslator implements
                 null, // t
                 null, // map
                 null, // contextStack
-                null, // threadName
+                0, // threadName
                 null, // location
                 0, // currentTimeMillis
-                0 // nanoTime
+                null, 
+                0, 0 // nanoTime
         );
     }
 
     public void setValues(final AsyncLogger anAsyncLogger, final String aLoggerName, final Marker aMarker,
             final String theFqcn, final Level aLevel, final Message msg, final Throwable aThrowable,
-            final Map<String, String> aMap, final ContextStack aContextStack, final String aThreadName,
-            final StackTraceElement aLocation, final long aCurrentTimeMillis, final long aNanoTime) {
+            final Map<String, String> aMap, final ContextStack aContextStack, long threadId,
+            final String threadName, int threadPriority, final StackTraceElement aLocation, final long aCurrentTimeMillis, final long aNanoTime) {
         this.asyncLogger = anAsyncLogger;
         this.loggerName = aLoggerName;
         this.marker = aMarker;
@@ -91,7 +93,9 @@ public class RingBufferLogEventTranslator implements
         this.thrown = aThrowable;
         this.contextMap = aMap;
         this.contextStack = aContextStack;
-        this.threadName = aThreadName;
+        this.threadId = threadId;
+        this.threadName = threadName;
+        this.threadPriority = threadPriority;
         this.location = aLocation;
         this.currentTimeMillis = aCurrentTimeMillis;
         this.nanoTime = aNanoTime;
@@ -108,11 +112,13 @@ public class RingBufferLogEventTranslator implements
         this.thrown = aThrowable;
     }
 
-    public void setValuesPart2(final Map<String, String> aMap, final ContextStack aContextStack, final String aThreadName,
-            final StackTraceElement aLocation, final long aCurrentTimeMillis, final long aNanoTime) {
+    public void setValuesPart2(final Map<String, String> aMap, final ContextStack aContextStack, long threadId,
+            final String threadName, int threadPriority, final StackTraceElement aLocation, final long aCurrentTimeMillis, final long aNanoTime) {
         this.contextMap = aMap;
         this.contextStack = aContextStack;
-        this.threadName = aThreadName;
+        this.threadId = threadId;
+        this.threadName = threadName;
+        this.threadPriority = threadPriority;
         this.location = aLocation;
         this.currentTimeMillis = aCurrentTimeMillis;
         this.nanoTime = aNanoTime;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
index 69fb55b..0de95a8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
@@ -26,6 +26,16 @@ import org.apache.logging.log4j.util.PropertiesUtil;
 enum ThreadNameCachingStrategy { // LOG4J2-467
     CACHED {
         @Override
+        public long getThreadId() {
+            Long result = THREADLOCAL_ID.get();
+            if (result == null) {
+                result = Thread.currentThread().getId();
+                THREADLOCAL_ID.set(result);
+            }
+            return result;
+        }
+
+        @Override
         public String getThreadName() {
             String result = THREADLOCAL_NAME.get();
             if (result == null) {
@@ -34,19 +44,42 @@ enum ThreadNameCachingStrategy { // LOG4J2-467
             }
             return result;
         }
+
+        @Override
+        public int getThreadPriority() {
+            Integer result = THREADLOCAL_PRIORITY.get();
+            if (result == null) {
+                result = Thread.currentThread().getPriority();
+                THREADLOCAL_PRIORITY.set(result);
+            }
+            return result;
+        }
     },
     UNCACHED {
         @Override
+        public long getThreadId() {
+            return Thread.currentThread().getId();
+        }
+
+        @Override
         public String getThreadName() {
             return Thread.currentThread().getName();
         }
+
+        @Override
+        public int getThreadPriority() {
+            return Thread.currentThread().getPriority();
+        }
     };
     
     private static final StatusLogger LOGGER = StatusLogger.getLogger();
+    private static final ThreadLocal<Long> THREADLOCAL_ID = new ThreadLocal<>();
     private static final ThreadLocal<String> THREADLOCAL_NAME = new ThreadLocal<>();
+    private static final ThreadLocal<Integer> THREADLOCAL_PRIORITY = new ThreadLocal<>();
     
-    
+    abstract long getThreadId();
     abstract String getThreadName();
+    abstract int getThreadPriority();
 
     static ThreadNameCachingStrategy create() {
         final String name = PropertiesUtil.getProperties().getStringProperty("AsyncLogger.ThreadNameStrategy",

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index 4fe1b38..d8ff470 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -47,7 +47,7 @@ import org.apache.logging.log4j.util.Strings;
  */
 public class Log4jLogEvent implements LogEvent {
 
-    private static final long serialVersionUID = -1351367343806656055L;
+    private static final long serialVersionUID = -8393305700508709443L;
     private static final Clock CLOCK = ClockFactory.getClock();
     private static volatile NanoClock nanoClock = new DummyNanoClock();
     private final String loggerFqcn;
@@ -60,7 +60,9 @@ public class Log4jLogEvent implements LogEvent {
     private ThrowableProxy thrownProxy;
     private final Map<String, String> contextMap;
     private final ThreadContext.ContextStack contextStack;
+    private long threadId;
     private String threadName;
+    private int threadPriority;
     private StackTraceElement source;
     private boolean includeLocation;
     private boolean endOfBatch = false;
@@ -80,7 +82,9 @@ public class Log4jLogEvent implements LogEvent {
         private ThrowableProxy thrownProxy;
         private Map<String, String> contextMap = ThreadContext.getImmutableContext();
         private ThreadContext.ContextStack contextStack = ThreadContext.getImmutableStack();
-        private String threadName = null;
+        private long threadId;
+        private String threadName;
+        private int threadPriority;
         private StackTraceElement source;
         private boolean includeLocation;
         private boolean endOfBatch = false;
@@ -114,11 +118,15 @@ public class Log4jLogEvent implements LogEvent {
                 Log4jLogEvent evt = (Log4jLogEvent) other;
                 this.thrownProxy = evt.thrownProxy;
                 this.source = evt.source;
+                this.threadId = evt.threadId;
                 this.threadName = evt.threadName;
+                this.threadPriority = evt.threadPriority;
             } else {
                 this.thrownProxy = other.getThrownProxy();
                 this.source = other.getSource();
+                this.threadId = other.getThreadId();
                 this.threadName = other.getThreadName();
+                this.threadPriority = other.getThreadPriority();
             }
         }
 
@@ -172,11 +180,21 @@ public class Log4jLogEvent implements LogEvent {
             return this;
         }
 
+        public Builder setThreadId(long threadId) {
+            this.threadId = threadId;
+            return this;
+        }
+
         public Builder setThreadName(String threadName) {
             this.threadName = threadName;
             return this;
         }
 
+        public Builder setThreadPriority(int threadPriority) {
+            this.threadPriority = threadPriority;
+            return this;
+        }
+
         public Builder setSource(StackTraceElement source) {
             this.source = source;
             return this;
@@ -206,7 +224,7 @@ public class Log4jLogEvent implements LogEvent {
         @Override
         public Log4jLogEvent build() {
             final Log4jLogEvent result = new Log4jLogEvent(loggerName, marker, loggerFqcn, level, message, thrown,
-                    thrownProxy, contextMap, contextStack, threadName, source, timeMillis, nanoTime);
+                    thrownProxy, contextMap, contextStack, threadId, threadName, threadPriority, source, timeMillis, nanoTime);
             result.setIncludeLocation(includeLocation);
             result.setEndOfBatch(endOfBatch);
             return result;
@@ -222,8 +240,8 @@ public class Log4jLogEvent implements LogEvent {
     }
 
     public Log4jLogEvent() {
-        this(Strings.EMPTY, null, Strings.EMPTY, null, null, (Throwable) null, null, null, null, null, null,
-                CLOCK.currentTimeMillis(), nanoClock.nanoTime());
+        this(Strings.EMPTY, null, Strings.EMPTY, null, null, (Throwable) null, null, null, null, 0, null,
+                0, null, CLOCK.currentTimeMillis(), nanoClock.nanoTime());
     }
 
     /**
@@ -232,8 +250,8 @@ public class Log4jLogEvent implements LogEvent {
     */
    @Deprecated
    public Log4jLogEvent(final long timestamp) {
-       this(Strings.EMPTY, null, Strings.EMPTY, null, null, (Throwable) null, null, null, null, null, null,
-               timestamp, nanoClock.nanoTime());
+       this(Strings.EMPTY, null, Strings.EMPTY, null, null, (Throwable) null, null, null, null, 0, null,
+               0, null, timestamp, nanoClock.nanoTime());
    }
 
    /**
@@ -268,13 +286,13 @@ public class Log4jLogEvent implements LogEvent {
        this(loggerName, marker, loggerFQCN, level, message, t, null,
            createMap(properties),
            ThreadContext.getDepth() == 0 ? null : ThreadContext.cloneStack(), // mutable copy
-           null, // thread name
+           0, // thread name
            null, // stack trace element
-           // LOG4J2-628 use log4j.Clock for timestamps
+           0,
+           null, // LOG4J2-628 use log4j.Clock for timestamps
            // LOG4J2-744 unless TimestampMessage already has one
            message instanceof TimestampMessage ? ((TimestampMessage) message).getTimestamp() :
-               CLOCK.currentTimeMillis(),
-           nanoClock.nanoTime());
+               CLOCK.currentTimeMillis(), nanoClock.nanoTime());
    }
 
    /**
@@ -297,8 +315,8 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
                         final Message message, final Throwable t, final Map<String, String> mdc,
                         final ThreadContext.ContextStack ndc, final String threadName,
                         final StackTraceElement location, final long timestampMillis) {
-       this(loggerName, marker, loggerFQCN, level, message, t, null, mdc, ndc, threadName,
-               location, timestampMillis, nanoClock.nanoTime());
+       this(loggerName, marker, loggerFQCN, level, message, t, null, mdc, ndc, 0,
+               threadName, 0, location, timestampMillis, nanoClock.nanoTime());
    }
 
    /**
@@ -326,7 +344,7 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
                                             final String threadName, final StackTraceElement location,
                                             final long timestamp) {
         final Log4jLogEvent result = new Log4jLogEvent(loggerName, marker, loggerFQCN, level, message, thrown,
-                thrownProxy, mdc, ndc, threadName, location, timestamp, nanoClock.nanoTime());
+                thrownProxy, mdc, ndc, 0, threadName, 0, location, timestamp, nanoClock.nanoTime());
         return result;
     }
 
@@ -341,7 +359,9 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
      * @param thrownProxy A ThrowableProxy or null.
      * @param contextMap The mapped diagnostic context.
      * @param contextStack the nested diagnostic context.
+     * @param threadId the thread ID
      * @param threadName The name of the thread.
+     * @param threadPriority the thread priority
      * @param source The locations of the caller.
      * @param timestampMillis The timestamp of the event.
      * @param nanoTime The value of the running Java Virtual Machine's high-resolution time source when the event was
@@ -349,8 +369,9 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
      */
     private Log4jLogEvent(final String loggerName, final Marker marker, final String loggerFQCN, final Level level,
             final Message message, final Throwable thrown, final ThrowableProxy thrownProxy,
-            final Map<String, String> contextMap, final ThreadContext.ContextStack contextStack,
-            final String threadName, final StackTraceElement source, final long timestampMillis, final long nanoTime) {
+            final Map<String, String> contextMap, final ThreadContext.ContextStack contextStack, long threadId,
+            final String threadName, int threadPriority, final StackTraceElement source, final long timestampMillis,
+            final long nanoTime) {
         this.loggerName = loggerName;
         this.marker = marker;
         this.loggerFqcn = loggerFQCN;
@@ -363,7 +384,9 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
         this.timeMillis = message instanceof TimestampMessage
                 ? ((TimestampMessage) message).getTimestamp()
                 : timestampMillis;
+        this.threadId = threadId;
         this.threadName = threadName;
+        this.threadPriority = threadPriority;
         this.source = source;
         if (message != null && message instanceof LoggerNameAwareMessage) {
             ((LoggerNameAwareMessage) message).setLoggerName(loggerName);
@@ -442,6 +465,14 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
         return message;
     }
 
+    @Override
+    public long getThreadId() {
+        if (threadId == 0) {
+            threadId = Thread.currentThread().getId();
+        }
+        return threadId;
+    }
+
     /**
      * Returns the name of the Thread on which the event was generated.
      * @return The name of the Thread.
@@ -454,6 +485,14 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
         return threadName;
     }
 
+    @Override
+    public int getThreadPriority() {
+        if (threadPriority == 0) {
+            threadPriority = Thread.currentThread().getPriority();
+        }
+        return threadPriority;
+    }
+
     /**
      * Returns the time in milliseconds from the epoch when the event occurred.
      * @return The time the event occurred.
@@ -605,8 +644,8 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
             final LogEventProxy proxy = (LogEventProxy) event;
             final Log4jLogEvent result = new Log4jLogEvent(proxy.loggerName, proxy.marker,
                     proxy.loggerFQCN, proxy.level, proxy.message,
-                    proxy.thrown, proxy.thrownProxy, proxy.contextMap, proxy.contextStack, proxy.threadName,
-                    proxy.source, proxy.timeMillis, proxy.nanoTime);
+                    proxy.thrown, proxy.thrownProxy, proxy.contextMap, proxy.contextStack, proxy.threadId,
+                    proxy.threadName, proxy.threadPriority, proxy.source, proxy.timeMillis, proxy.nanoTime);
             result.setEndOfBatch(proxy.isEndOfBatch);
             result.setIncludeLocation(proxy.isLocationRequired);
             return result;
@@ -675,9 +714,15 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
         if (contextStack != null ? !contextStack.equals(that.contextStack) : that.contextStack != null) {
             return false;
         }
+        if (threadId != that.threadId) {
+            return false;
+        }
         if (threadName != null ? !threadName.equals(that.threadName) : that.threadName != null) {
             return false;
         }
+        if (threadPriority != that.threadPriority) {
+            return false;
+        }
         if (thrown != null ? !thrown.equals(that.thrown) : that.thrown != null) {
             return false;
         }
@@ -702,7 +747,9 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
         result = 31 * result + (thrownProxy != null ? thrownProxy.hashCode() : 0);
         result = 31 * result + (contextMap != null ? contextMap.hashCode() : 0);
         result = 31 * result + (contextStack != null ? contextStack.hashCode() : 0);
+        result = 31 * result + (int) (threadId ^ (threadId >>> 32));
         result = 31 * result + (threadName != null ? threadName.hashCode() : 0);
+        result = 31 * result + (threadPriority ^ (threadPriority >>> 32));
         result = 31 * result + (source != null ? source.hashCode() : 0);
         result = 31 * result + (includeLocation ? 1 : 0);
         result = 31 * result + (endOfBatch ? 1 : 0);
@@ -715,7 +762,7 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
      */
     private static class LogEventProxy implements Serializable {
 
-        private static final long serialVersionUID = -7139032940312647146L;
+        private static final long serialVersionUID = -8634075037355293699L;
         private final String loggerFQCN;
         private final Marker marker;
         private final Level level;
@@ -726,11 +773,15 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
         private final ThrowableProxy thrownProxy;
         private final Map<String, String> contextMap;
         private final ThreadContext.ContextStack contextStack;
+        /** @since 2.6 */
+        private final long threadId;
         private final String threadName;
+        /** @since 2.6 */
+        private final int threadPriority;
         private final StackTraceElement source;
         private final boolean isLocationRequired;
         private final boolean isEndOfBatch;
-        /** @since Log4J 2.4 */
+        /** @since 2.4 */
         private final transient long nanoTime;
 
         public LogEventProxy(final Log4jLogEvent event, final boolean includeLocation) {
@@ -745,7 +796,9 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
             this.contextMap = event.contextMap;
             this.contextStack = event.contextStack;
             this.source = includeLocation ? event.getSource() : null;
+            this.threadId = event.getThreadId();
             this.threadName = event.getThreadName();
+            this.threadPriority = event.getThreadPriority();
             this.isLocationRequired = includeLocation;
             this.isEndOfBatch = event.endOfBatch;
             this.nanoTime = event.nanoTime;
@@ -757,10 +810,11 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
          */
         protected Object readResolve() {
             final Log4jLogEvent result = new Log4jLogEvent(loggerName, marker, loggerFQCN, level, message, thrown,
-                    thrownProxy, contextMap, contextStack, threadName, source, timeMillis, nanoTime);
+                    thrownProxy, contextMap, contextStack, threadId, threadName, threadPriority, source, timeMillis, nanoTime);
             result.setEndOfBatch(isEndOfBatch);
             result.setIncludeLocation(isLocationRequired);
             return result;
         }
     }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java
index a926499..ab9cd19 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java
@@ -92,10 +92,20 @@ abstract class LogEventMixIn implements LogEvent {
     public abstract StackTraceElement getSource();
 
     @Override
+    @JsonProperty("threadId")
+    @JacksonXmlProperty(isAttribute = true, localName = "threadId")
+    public abstract long getThreadId();
+
+    @Override
     @JsonProperty("thread")
     @JacksonXmlProperty(isAttribute = true, localName = "thread")
     public abstract String getThreadName();
 
+    @Override
+    @JsonProperty("threadPriority")
+    @JacksonXmlProperty(isAttribute = true, localName = "threadPriority")
+    public abstract int getThreadPriority();
+
     @JsonIgnore
     @Override
     public abstract Throwable getThrown();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java
index 1a3d6ad..ef69f0f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java
@@ -85,7 +85,9 @@ public class CsvLogEventLayout extends AbstractCsvLayout {
             printer.print(event.getNanoTime());
             printer.print(event.getTimeMillis());
             printer.print(event.getLevel());
+            printer.print(event.getThreadId());
             printer.print(event.getThreadName());
+            printer.print(event.getThreadPriority());
             printer.print(event.getMessage().getFormattedMessage());
             printer.print(event.getLoggerFqcn());
             printer.print(event.getLoggerName());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
new file mode 100644
index 0000000..844d47d
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
@@ -0,0 +1,61 @@
+/*
+ * 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.logging.log4j.core.pattern;
+
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+
+/**
+ * Formats the event thread ID.
+ * 
+ * @since 2.6
+ */
+@Plugin(name = "ThreadIdPatternConverter", category = PatternConverter.CATEGORY)
+@ConverterKeys({ "tid", "threadId" })
+public final class ThreadIdPatternConverter extends LogEventPatternConverter {
+    /**
+     * Singleton.
+     */
+    private static final ThreadIdPatternConverter INSTANCE =
+        new ThreadIdPatternConverter();
+
+    /**
+     * Private constructor.
+     */
+    private ThreadIdPatternConverter() {
+        super("ThreadId", "threadId");
+    }
+
+    /**
+     * Obtains an instance of ThreadPatternConverter.
+     *
+     * @param options options, currently ignored, may be null.
+     * @return instance of ThreadPatternConverter.
+     */
+    public static ThreadIdPatternConverter newInstance(
+        final String[] options) {
+        return INSTANCE;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void format(final LogEvent event, final StringBuilder toAppendTo) {
+        toAppendTo.append(event.getThreadId());
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
new file mode 100644
index 0000000..37c0861
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
@@ -0,0 +1,59 @@
+/*
+ * 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.logging.log4j.core.pattern;
+
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+
+/**
+ * Formats the event thread name.
+ */
+@Plugin(name = "ThreadPatternConverter", category = PatternConverter.CATEGORY)
+@ConverterKeys({ "t", "thread", "threadName" })
+public final class ThreadNamePatternConverter extends LogEventPatternConverter {
+    /**
+     * Singleton.
+     */
+    private static final ThreadNamePatternConverter INSTANCE =
+        new ThreadNamePatternConverter();
+
+    /**
+     * Private constructor.
+     */
+    private ThreadNamePatternConverter() {
+        super("Thread", "thread");
+    }
+
+    /**
+     * Obtains an instance of ThreadPatternConverter.
+     *
+     * @param options options, currently ignored, may be null.
+     * @return instance of ThreadPatternConverter.
+     */
+    public static ThreadNamePatternConverter newInstance(
+        final String[] options) {
+        return INSTANCE;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void format(final LogEvent event, final StringBuilder toAppendTo) {
+        toAppendTo.append(event.getThreadName());
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPatternConverter.java
deleted file mode 100644
index 8817bbc..0000000
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPatternConverter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.logging.log4j.core.pattern;
-
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-
-/**
- * Formats the event thread name.
- */
-@Plugin(name = "ThreadPatternConverter", category = PatternConverter.CATEGORY)
-@ConverterKeys({ "t", "thread", "threadName" })
-public final class ThreadPatternConverter extends LogEventPatternConverter {
-    /**
-     * Singleton.
-     */
-    private static final ThreadPatternConverter INSTANCE =
-        new ThreadPatternConverter();
-
-    /**
-     * Private constructor.
-     */
-    private ThreadPatternConverter() {
-        super("Thread", "thread");
-    }
-
-    /**
-     * Obtains an instance of ThreadPatternConverter.
-     *
-     * @param options options, currently ignored, may be null.
-     * @return instance of ThreadPatternConverter.
-     */
-    public static ThreadPatternConverter newInstance(
-        final String[] options) {
-        return INSTANCE;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        toAppendTo.append(event.getThreadName());
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
new file mode 100644
index 0000000..31ae15d
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
@@ -0,0 +1,61 @@
+/*
+ * 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.logging.log4j.core.pattern;
+
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+
+/**
+ * Formats the event thread priority.
+ * 
+ * @since 2.6
+ */
+@Plugin(name = "ThreadPriorityPatternConverter", category = PatternConverter.CATEGORY)
+@ConverterKeys({ "tp", "threadPriority" })
+public final class ThreadPriorityPatternConverter extends LogEventPatternConverter {
+    /**
+     * Singleton.
+     */
+    private static final ThreadPriorityPatternConverter INSTANCE =
+        new ThreadPriorityPatternConverter();
+
+    /**
+     * Private constructor.
+     */
+    private ThreadPriorityPatternConverter() {
+        super("ThreadPriority", "threadPriority");
+    }
+
+    /**
+     * Obtains an instance of ThreadPatternConverter.
+     *
+     * @param options options, currently ignored, may be null.
+     * @return instance of ThreadPatternConverter.
+     */
+    public static ThreadPriorityPatternConverter newInstance(
+        final String[] options) {
+        return INSTANCE;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void format(final LogEvent event, final StringBuilder toAppendTo) {
+        toAppendTo.append(event.getThreadPriority());
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/LogEventTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/LogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/LogEventTest.java
index fc53583..722c5a1 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/LogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/LogEventTest.java
@@ -105,7 +105,9 @@ public class LogEventTest {
                 .setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
                 .setLevel(Level.INFO) //
                 .setMessage(new SimpleMessage("Hello, world!")) //
+                .setThreadId(1) // this must be initialized or the test fails
                 .setThreadName("this must be initialized or the test fails") //
+                .setThreadPriority(2) // this must be initialized or the test fails
                 .setNanoTime(0) //
                 .build();
         final LogEvent event2 = new Log4jLogEvent.Builder(event1).build();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaH2AppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaH2AppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaH2AppenderTest.java
index c4b9ae7..638fbe4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaH2AppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaH2AppenderTest.java
@@ -47,7 +47,7 @@ public class JpaH2AppenderTest extends AbstractJpaAppenderTest {
                 "id INTEGER IDENTITY, timemillis BIGINT, nanoTime BIGINT, level NVARCHAR(10), loggerName NVARCHAR(255), " +
                 "message NVARCHAR(1024), thrown NVARCHAR(1048576), contextMapJson NVARCHAR(1048576)," +
                 "loggerFQCN NVARCHAR(1024), contextStack NVARCHAR(1048576), marker NVARCHAR(255), source NVARCHAR(2048)," +
-                "threadName NVARCHAR(255)" +
+                "threadId BIGINT, threadName NVARCHAR(255), threadPriority INTEGER" +
                 " )");
         statement.close();
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaHyperSqlAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaHyperSqlAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaHyperSqlAppenderTest.java
index 7ef8a24..a5379c3 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaHyperSqlAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaHyperSqlAppenderTest.java
@@ -51,7 +51,7 @@ public class JpaHyperSqlAppenderTest extends AbstractJpaAppenderTest {
                 "id INTEGER IDENTITY, timemillis BIGINT, nanoTime BIGINT, level VARCHAR(10), loggerName VARCHAR(255), " +
                 "message VARCHAR(1024), thrown VARCHAR(1048576), contextMapJson VARCHAR(1048576)," +
                 "loggerFQCN VARCHAR(1024), contextStack VARCHAR(1048576), marker VARCHAR(255), source VARCHAR(2048)," +
-                "threadName VARCHAR(255)" +
+                "threadId BIGINT, threadName NVARCHAR(255), threadPriority INTEGER" +
                 " )");
         statement.close();
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBaseEntity.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBaseEntity.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBaseEntity.java
index e70cdb9..02ef9ab 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBaseEntity.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBaseEntity.java
@@ -112,12 +112,24 @@ public class TestBaseEntity extends AbstractLogEventWrapperEntity {
 
     @Override
     @Transient
+    public long getThreadId() {
+        return this.getWrappedEvent().getThreadId();
+    }
+
+    @Override
+    @Transient
     public String getThreadName() {
         return this.getWrappedEvent().getThreadName();
     }
 
     @Override
     @Transient
+    public int getThreadPriority() {
+        return this.getWrappedEvent().getThreadPriority();
+    }
+
+    @Override
+    @Transient
     public long getTimeMillis() {
         return this.getWrappedEvent().getTimeMillis();
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
index 2da7b11..ec3a874 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
@@ -60,7 +60,7 @@ public class RingBufferLogEventTest {
         final long currentTimeMillis = 0;
         final long nanoTime = 1;
         evt.setValues(null, loggerName, marker, fqcn, level, data, t, map,
-                contextStack, threadName, location, currentTimeMillis, nanoTime);
+                contextStack, -1, threadName, -1, location, currentTimeMillis, nanoTime);
         assertEquals(Level.OFF, evt.getLevel());
     }
 
@@ -80,7 +80,7 @@ public class RingBufferLogEventTest {
         final long currentTimeMillis = 0;
         final long nanoTime = 1;
         evt.setValues(null, loggerName, marker, fqcn, level, data, t, map,
-                contextStack, threadName, location, currentTimeMillis, nanoTime);
+                contextStack, -1, threadName, -1, location, currentTimeMillis, nanoTime);
         assertNotNull(evt.getMessage());
     }
 
@@ -100,7 +100,7 @@ public class RingBufferLogEventTest {
         final long currentTimeMillis = 123;
         final long nanoTime = 1;
         evt.setValues(null, loggerName, marker, fqcn, level, data, t, map,
-                contextStack, threadName, location, currentTimeMillis, nanoTime);
+                contextStack, -1, threadName, -1, location, currentTimeMillis, nanoTime);
         assertEquals(123, evt.getTimeMillis());
     }
 
@@ -120,7 +120,7 @@ public class RingBufferLogEventTest {
         final long currentTimeMillis = 12345;
         final long nanoTime = 1;
         evt.setValues(null, loggerName, marker, fqcn, level, data, t, map,
-                contextStack, threadName, location, currentTimeMillis, nanoTime);
+                contextStack, -1, threadName, -1, location, currentTimeMillis, nanoTime);
         
         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
         final ObjectOutputStream out = new ObjectOutputStream(baos);
@@ -159,7 +159,7 @@ public class RingBufferLogEventTest {
         final long currentTimeMillis = 12345;
         final long nanoTime = 1;
         evt.setValues(null, loggerName, marker, fqcn, level, data, t, map,
-                contextStack, threadName, location, currentTimeMillis, nanoTime);
+                contextStack, -1, threadName, -1, location, currentTimeMillis, nanoTime);
         
         final LogEvent actual = evt.createMemento();
         assertEquals(evt.getLoggerName(), actual.getLoggerName());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
index e029a53..0a7df37 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
@@ -174,7 +174,8 @@ public class Log4jLogEventTest {
         // System.out.println("final String base64 = \"" + base64Str.replaceAll("\r\n", "\\\\r\\\\n\" +\r\n\"") +
         // "\";");
         
-         final String base64 = "rO0ABXNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnQkTG9nRXZlbnRQcm94eZztD11w2ioWAgANWgAMaXNFbmRPZkJhdGNoWgASaXNMb2NhdGlvblJlcXVpcmVkSgAKdGltZU1pbGxpc0wACmNvbnRleHRNYXB0AA9MamF2YS91dGlsL01hcDtMAAxjb250ZXh0U3RhY2t0ADVMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL1RocmVhZENvbnRleHQkQ29udGV4dFN0YWNrO0wABWxldmVsdAAgTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9MZXZlbDtMAApsb2dnZXJGUUNOdAASTGphdmEvbGFuZy9TdHJpbmc7TAAKbG9nZ2VyTmFtZXEAfgAETAAGbWFya2VydAAhTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9NYXJrZXI7TAAHbWVzc2FnZXQAKkxvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovbWVzc2FnZS9NZXNzYWdlO0wABnNvdXJjZXQAHUxqYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnQ7TAAKdGhyZWFkTmFtZXEAfgAETAALdGhyb3duUHJveHl0ADNMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1wbC9UaHJvd2FibGVQcm94eTt4cAAAAAAAAEmWAtJzcgAeamF2YS51dGlsLkNvbGxlY3Rpb25zJEVtcHR5TWFwWTYUhVrc59ACAAB4cHNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouVGhyZWFkQ29udGV4dCRFbXB0eVRocmVhZENvbnRleHRTdGFjawAAAAAAAAABAgAAeHBzcgAeb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLkxld
 mVsAAAAAAAYIBoCAANJAAhpbnRMZXZlbEwABG5hbWVxAH4ABEwADXN0YW5kYXJkTGV2ZWx0ACxMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL3NwaS9TdGFuZGFyZExldmVsO3hwAAABkHQABElORk9+cgAqb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLnNwaS5TdGFuZGFyZExldmVsAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAESU5GT3QAAHQACXNvbWUudGVzdHBzcgAub3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLm1lc3NhZ2UuU2ltcGxlTWVzc2FnZYt0TTBgt6KoAgABTAAHbWVzc2FnZXEAfgAEeHB0AANhYmNwdAAEbWFpbnNyADFvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLlRocm93YWJsZVByb3h52cww1Zp7rPoCAAdJABJjb21tb25FbGVtZW50Q291bnRMAApjYXVzZVByb3h5cQB+AAhbABJleHRlbmRlZFN0YWNrVHJhY2V0AD9bTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWVudDtMABBsb2NhbGl6ZWRNZXNzYWdlcQB+AARMAAdtZXNzYWdlcQB+AARMAARuYW1lcQB+AARbABFzdXBwcmVzc2VkUHJveGllc3QANFtMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1wbC9UaHJvd2FibGVQcm94eTt4cAAAAABwdXIAP1tMb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5FeHRlbmRlZFN0YWNrVHJhY2VFbGVtZW50O8rPiCOlx8+8AgAAeHAAAAAac3IAPG9yZy5hcGFjaGUubG9nZ2luZy5sb2
 c0ai5jb3JlLmltcGwuRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWVudOHez7rGtpAHAgACTAAOZXh0cmFDbGFzc0luZm90ADZMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1wbC9FeHRlbmRlZENsYXNzSW5mbztMABFzdGFja1RyYWNlRWxlbWVudHEAfgAHeHBzcgA0b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5FeHRlbmRlZENsYXNzSW5mbwAAAAAAAAABAgADWgAFZXhhY3RMAAhsb2NhdGlvbnEAfgAETAAHdmVyc2lvbnEAfgAEeHABdAANdGVzdC1jbGFzc2VzL3QAAT9zcgAbamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50YQnFmiY23YUCAARJAApsaW5lTnVtYmVyTAAOZGVjbGFyaW5nQ2xhc3NxAH4ABEwACGZpbGVOYW1lcQB+AARMAAptZXRob2ROYW1lcQB+AAR4cAAAAJh0ADRvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnRUZXN0dAAWTG9nNGpMb2dFdmVudFRlc3QuamF2YXQAKnRlc3RKYXZhSW9TZXJpYWxpemFibGVXaXRoVW5rbm93blRocm93YWJsZXNxAH4AInNxAH4AJQBxAH4AKHQACDEuNy4wXzU1c3EAfgAp/////nQAJHN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbHB0AAdpbnZva2Uwc3EAfgAic3EAfgAlAHEAfgAocQB+ADBzcQB+ACn/////cQB+ADJwdAAGaW52b2tlc3EAfgAic3EAfgAlAHEAfgAocQB+ADBzcQB+ACn/////dAAoc3VuLnJlZmxlY3QuRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbHBxAH4AN3NxAH4AInN
 xAH4AJQBxAH4AKHEAfgAwc3EAfgAp/////3QAGGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZHBxAH4AN3NxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAAL3QAKW9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkZyYW1ld29ya01ldGhvZCQxdAAURnJhbWV3b3JrTWV0aG9kLmphdmF0ABFydW5SZWZsZWN0aXZlQ2FsbHNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAADHQAM29yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLm1vZGVsLlJlZmxlY3RpdmVDYWxsYWJsZXQAF1JlZmxlY3RpdmVDYWxsYWJsZS5qYXZhdAADcnVuc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTEuamFycQB+AChzcQB+ACkAAAAsdAAnb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuRnJhbWV3b3JrTWV0aG9kcQB+AEV0ABFpbnZva2VFeHBsb3NpdmVseXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAAEXQAMm9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuSW52b2tlTWV0aG9kdAARSW52b2tlTWV0aG9kLmphdmF0AAhldmFsdWF0ZXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAABD3QAHm9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lcnQAEVBhcmVudFJ1bm5lci5qYXZhdAAHcnVuTGVhZnNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAARnQAKG9yZy5qdW5pdC5ydW5uZXJzLkJsb2NrSlVuaXQ0
 Q2xhc3NSdW5uZXJ0ABtCbG9ja0pVbml0NENsYXNzUnVubmVyLmphdmF0AAhydW5DaGlsZHNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAAMnEAfgBmcQB+AGdxAH4AaHNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAA7nQAIG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQzcQB+AGBxAH4ATXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAAP3QAIG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQxcQB+AGB0AAhzY2hlZHVsZXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAA7HEAfgBfcQB+AGB0AAtydW5DaGlsZHJlbnNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAANXEAfgBfcQB+AGB0AAphY2Nlc3MkMDAwc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTEuamFycQB+AChzcQB+ACkAAADldAAgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDJxAH4AYHEAfgBac3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTEuamFycQB+AChzcQB+ACkAAAAadAAwb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5SdW5CZWZvcmVzdAAPUnVuQmVmb3Jlcy5qYXZhcQB+AFpzcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMS5qYXJxAH4AKHNxAH4AKQAAABt0AC9vcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLlJ1bkFmdGVyc3QADlJ1bkFmd
 GVycy5qYXZhcQB+AFpzcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMS5qYXJxAH4AKHNxAH4AKQAAATVxAH4AX3EAfgBgcQB+AE1zcQB+ACJzcQB+ACUBdAAELmNwL3EAfgAoc3EAfgApAAAAMnQAOm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdDQucnVubmVyLkpVbml0NFRlc3RSZWZlcmVuY2V0ABhKVW5pdDRUZXN0UmVmZXJlbmNlLmphdmFxAH4ATXNxAH4AInNxAH4AJQF0AAQuY3AvcQB+AChzcQB+ACkAAAAmdAAzb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5UZXN0RXhlY3V0aW9udAASVGVzdEV4ZWN1dGlvbi5qYXZhcQB+AE1zcQB+ACJzcQB+ACUBdAAELmNwL3EAfgAoc3EAfgApAAAB03QANm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5ydW5uZXIuUmVtb3RlVGVzdFJ1bm5lcnQAFVJlbW90ZVRlc3RSdW5uZXIuamF2YXQACHJ1blRlc3Rzc3EAfgAic3EAfgAlAXQABC5jcC9xAH4AKHNxAH4AKQAAAqtxAH4Ap3EAfgCocQB+AKlzcQB+ACJzcQB+ACUBdAAELmNwL3EAfgAoc3EAfgApAAABhnEAfgCncQB+AKhxAH4ATXNxAH4AInNxAH4AJQF0AAQuY3AvcQB+AChzcQB+ACkAAADFcQB+AKdxAH4AqHQABG1haW50ABZPTUcgSSd2ZSBiZWVuIGRlbGV0ZWQhcQB+ALd0AEVvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnRUZXN0JERlbGV0ZWRFeGNlcHRpb251cgA0W0xvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLlRocm93YWJsZV
 Byb3h5O/rtAeCFous5AgAAeHAAAAAA";
+        final String base64_v_2_5 = "rO0ABXNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnQkTG9nRXZlbnRQcm94eZztD11w2ioWAgANWgAMaXNFbmRPZkJhdGNoWgASaXNMb2NhdGlvblJlcXVpcmVkSgAKdGltZU1pbGxpc0wACmNvbnRleHRNYXB0AA9MamF2YS91dGlsL01hcDtMAAxjb250ZXh0U3RhY2t0ADVMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL1RocmVhZENvbnRleHQkQ29udGV4dFN0YWNrO0wABWxldmVsdAAgTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9MZXZlbDtMAApsb2dnZXJGUUNOdAASTGphdmEvbGFuZy9TdHJpbmc7TAAKbG9nZ2VyTmFtZXEAfgAETAAGbWFya2VydAAhTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9NYXJrZXI7TAAHbWVzc2FnZXQAKkxvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovbWVzc2FnZS9NZXNzYWdlO0wABnNvdXJjZXQAHUxqYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnQ7TAAKdGhyZWFkTmFtZXEAfgAETAALdGhyb3duUHJveHl0ADNMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1wbC9UaHJvd2FibGVQcm94eTt4cAAAAAAAAEmWAtJzcgAeamF2YS51dGlsLkNvbGxlY3Rpb25zJEVtcHR5TWFwWTYUhVrc59ACAAB4cHNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouVGhyZWFkQ29udGV4dCRFbXB0eVRocmVhZENvbnRleHRTdGFjawAAAAAAAAABAgAAeHBzcgAeb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRq
 LkxldmVsAAAAAAAYIBoCAANJAAhpbnRMZXZlbEwABG5hbWVxAH4ABEwADXN0YW5kYXJkTGV2ZWx0ACxMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL3NwaS9TdGFuZGFyZExldmVsO3hwAAABkHQABElORk9+cgAqb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLnNwaS5TdGFuZGFyZExldmVsAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAESU5GT3QAAHQACXNvbWUudGVzdHBzcgAub3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLm1lc3NhZ2UuU2ltcGxlTWVzc2FnZYt0TTBgt6KoAgABTAAHbWVzc2FnZXEAfgAEeHB0AANhYmNwdAAEbWFpbnNyADFvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLlRocm93YWJsZVByb3h52cww1Zp7rPoCAAdJABJjb21tb25FbGVtZW50Q291bnRMAApjYXVzZVByb3h5cQB+AAhbABJleHRlbmRlZFN0YWNrVHJhY2V0AD9bTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWVudDtMABBsb2NhbGl6ZWRNZXNzYWdlcQB+AARMAAdtZXNzYWdlcQB+AARMAARuYW1lcQB+AARbABFzdXBwcmVzc2VkUHJveGllc3QANFtMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1wbC9UaHJvd2FibGVQcm94eTt4cAAAAABwdXIAP1tMb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5FeHRlbmRlZFN0YWNrVHJhY2VFbGVtZW50O8rPiCOlx8+8AgAAeHAAAAAac3IAPG9yZy5hcGFjaGUubG9nZ2luZ
 y5sb2c0ai5jb3JlLmltcGwuRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWVudOHez7rGtpAHAgACTAAOZXh0cmFDbGFzc0luZm90ADZMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1wbC9FeHRlbmRlZENsYXNzSW5mbztMABFzdGFja1RyYWNlRWxlbWVudHEAfgAHeHBzcgA0b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5FeHRlbmRlZENsYXNzSW5mbwAAAAAAAAABAgADWgAFZXhhY3RMAAhsb2NhdGlvbnEAfgAETAAHdmVyc2lvbnEAfgAEeHABdAANdGVzdC1jbGFzc2VzL3QAAT9zcgAbamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50YQnFmiY23YUCAARJAApsaW5lTnVtYmVyTAAOZGVjbGFyaW5nQ2xhc3NxAH4ABEwACGZpbGVOYW1lcQB+AARMAAptZXRob2ROYW1lcQB+AAR4cAAAAJh0ADRvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnRUZXN0dAAWTG9nNGpMb2dFdmVudFRlc3QuamF2YXQAKnRlc3RKYXZhSW9TZXJpYWxpemFibGVXaXRoVW5rbm93blRocm93YWJsZXNxAH4AInNxAH4AJQBxAH4AKHQACDEuNy4wXzU1c3EAfgAp/////nQAJHN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbHB0AAdpbnZva2Uwc3EAfgAic3EAfgAlAHEAfgAocQB+ADBzcQB+ACn/////cQB+ADJwdAAGaW52b2tlc3EAfgAic3EAfgAlAHEAfgAocQB+ADBzcQB+ACn/////dAAoc3VuLnJlZmxlY3QuRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbHBxAH4AN3NxAH
 4AInNxAH4AJQBxAH4AKHEAfgAwc3EAfgAp/////3QAGGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZHBxAH4AN3NxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAAL3QAKW9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkZyYW1ld29ya01ldGhvZCQxdAAURnJhbWV3b3JrTWV0aG9kLmphdmF0ABFydW5SZWZsZWN0aXZlQ2FsbHNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAADHQAM29yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLm1vZGVsLlJlZmxlY3RpdmVDYWxsYWJsZXQAF1JlZmxlY3RpdmVDYWxsYWJsZS5qYXZhdAADcnVuc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTEuamFycQB+AChzcQB+ACkAAAAsdAAnb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuRnJhbWV3b3JrTWV0aG9kcQB+AEV0ABFpbnZva2VFeHBsb3NpdmVseXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAAEXQAMm9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuSW52b2tlTWV0aG9kdAARSW52b2tlTWV0aG9kLmphdmF0AAhldmFsdWF0ZXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAABD3QAHm9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lcnQAEVBhcmVudFJ1bm5lci5qYXZhdAAHcnVuTGVhZnNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAARnQAKG9yZy5qdW5pdC5ydW5uZXJzLkJsb2NrSlV
 uaXQ0Q2xhc3NSdW5uZXJ0ABtCbG9ja0pVbml0NENsYXNzUnVubmVyLmphdmF0AAhydW5DaGlsZHNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAAMnEAfgBmcQB+AGdxAH4AaHNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAA7nQAIG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQzcQB+AGBxAH4ATXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAAP3QAIG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQxcQB+AGB0AAhzY2hlZHVsZXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAA7HEAfgBfcQB+AGB0AAtydW5DaGlsZHJlbnNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjExLmphcnEAfgAoc3EAfgApAAAANXEAfgBfcQB+AGB0AAphY2Nlc3MkMDAwc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTEuamFycQB+AChzcQB+ACkAAADldAAgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDJxAH4AYHEAfgBac3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTEuamFycQB+AChzcQB+ACkAAAAadAAwb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5SdW5CZWZvcmVzdAAPUnVuQmVmb3Jlcy5qYXZhcQB+AFpzcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMS5qYXJxAH4AKHNxAH4AKQAAABt0AC9vcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLlJ1bkFmdGVyc3QADlJ1
 bkFmdGVycy5qYXZhcQB+AFpzcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMS5qYXJxAH4AKHNxAH4AKQAAATVxAH4AX3EAfgBgcQB+AE1zcQB+ACJzcQB+ACUBdAAELmNwL3EAfgAoc3EAfgApAAAAMnQAOm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdDQucnVubmVyLkpVbml0NFRlc3RSZWZlcmVuY2V0ABhKVW5pdDRUZXN0UmVmZXJlbmNlLmphdmFxAH4ATXNxAH4AInNxAH4AJQF0AAQuY3AvcQB+AChzcQB+ACkAAAAmdAAzb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5UZXN0RXhlY3V0aW9udAASVGVzdEV4ZWN1dGlvbi5qYXZhcQB+AE1zcQB+ACJzcQB+ACUBdAAELmNwL3EAfgAoc3EAfgApAAAB03QANm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5ydW5uZXIuUmVtb3RlVGVzdFJ1bm5lcnQAFVJlbW90ZVRlc3RSdW5uZXIuamF2YXQACHJ1blRlc3Rzc3EAfgAic3EAfgAlAXQABC5jcC9xAH4AKHNxAH4AKQAAAqtxAH4Ap3EAfgCocQB+AKlzcQB+ACJzcQB+ACUBdAAELmNwL3EAfgAoc3EAfgApAAABhnEAfgCncQB+AKhxAH4ATXNxAH4AInNxAH4AJQF0AAQuY3AvcQB+AChzcQB+ACkAAADFcQB+AKdxAH4AqHQABG1haW50ABZPTUcgSSd2ZSBiZWVuIGRlbGV0ZWQhcQB+ALd0AEVvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnRUZXN0JERlbGV0ZWRFeGNlcHRpb251cgA0W0xvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLlRocm93Y
 WJsZVByb3h5O/rtAeCFous5AgAAeHAAAAAA";
+        final String base64 = "rO0ABXNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnQkTG9nRXZlbnRQcm94eYgtmn+yXsP9AgAPWgAMaXNFbmRPZkJhdGNoWgASaXNMb2NhdGlvblJlcXVpcmVkSgAIdGhyZWFkSWRJAA50aHJlYWRQcmlvcml0eUoACnRpbWVNaWxsaXNMAApjb250ZXh0TWFwdAAPTGphdmEvdXRpbC9NYXA7TAAMY29udGV4dFN0YWNrdAA1TG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9UaHJlYWRDb250ZXh0JENvbnRleHRTdGFjaztMAAVsZXZlbHQAIExvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovTGV2ZWw7TAAKbG9nZ2VyRlFDTnQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACmxvZ2dlck5hbWVxAH4ABEwABm1hcmtlcnQAIUxvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovTWFya2VyO0wAB21lc3NhZ2V0ACpMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL21lc3NhZ2UvTWVzc2FnZTtMAAZzb3VyY2V0AB1MamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50O0wACnRocmVhZE5hbWVxAH4ABEwAC3Rocm93blByb3h5dAAzTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvVGhyb3dhYmxlUHJveHk7eHAAAAAAAAAAAAABAAAABQAAAABJlgLSc3IAHmphdmEudXRpbC5Db2xsZWN0aW9ucyRFbXB0eU1hcFk2FIVa3OfQAgAAeHBzcgA+b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLlRocmVhZENvbnRleHQkRW1wdHlUaHJlYWRDb250ZXh0U3RhY2sAAAAAAA
 AAAQIAAHhwc3IAHm9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5MZXZlbAAAAAAAGCAaAgADSQAIaW50TGV2ZWxMAARuYW1lcQB+AARMAA1zdGFuZGFyZExldmVsdAAsTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9zcGkvU3RhbmRhcmRMZXZlbDt4cAAAAZB0AARJTkZPfnIAKm9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5zcGkuU3RhbmRhcmRMZXZlbAAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5FbnVtAAAAAAAAAAASAAB4cHQABElORk90AAB0AAlzb21lLnRlc3Rwc3IALm9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5tZXNzYWdlLlNpbXBsZU1lc3NhZ2WLdE0wYLeiqAIAAUwAB21lc3NhZ2VxAH4ABHhwdAADYWJjcHQABG1haW5zcgAxb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5UaHJvd2FibGVQcm94ednMMNWae6z6AgAHSQASY29tbW9uRWxlbWVudENvdW50TAAKY2F1c2VQcm94eXEAfgAIWwASZXh0ZW5kZWRTdGFja1RyYWNldAA/W0xvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovY29yZS9pbXBsL0V4dGVuZGVkU3RhY2tUcmFjZUVsZW1lbnQ7TAAQbG9jYWxpemVkTWVzc2FnZXEAfgAETAAHbWVzc2FnZXEAfgAETAAEbmFtZXEAfgAEWwARc3VwcHJlc3NlZFByb3hpZXN0ADRbTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvVGhyb3dhYmxlUHJveHk7eHAAAAAAcHVyAD9bTG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWVudDvKz4g
 jpcfPvAIAAHhwAAAAGnNyADxvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkV4dGVuZGVkU3RhY2tUcmFjZUVsZW1lbnTh3s+6xraQBwIAAkwADmV4dHJhQ2xhc3NJbmZvdAA2TG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvRXh0ZW5kZWRDbGFzc0luZm87TAARc3RhY2tUcmFjZUVsZW1lbnRxAH4AB3hwc3IANG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuRXh0ZW5kZWRDbGFzc0luZm8AAAAAAAAAAQIAA1oABWV4YWN0TAAIbG9jYXRpb25xAH4ABEwAB3ZlcnNpb25xAH4ABHhwAXQADXRlc3QtY2xhc3Nlcy90AAE/c3IAG2phdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudGEJxZomNt2FAgAESQAKbGluZU51bWJlckwADmRlY2xhcmluZ0NsYXNzcQB+AARMAAhmaWxlTmFtZXEAfgAETAAKbWV0aG9kTmFtZXEAfgAEeHAAAACqdAA0b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5Mb2c0akxvZ0V2ZW50VGVzdHQAFkxvZzRqTG9nRXZlbnRUZXN0LmphdmF0ACp0ZXN0SmF2YUlvU2VyaWFsaXphYmxlV2l0aFVua25vd25UaHJvd2FibGVzcQB+ACJzcQB+ACUAcQB+ACh0AAgxLjcuMF83OXNxAH4AKf////50ACRzdW4ucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGx0AB1OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuamF2YXQAB2ludm9rZTBzcQB+ACJzcQB+ACUAcQB+AChxAH4AMHNxAH4AKQAAADlxAH4AMnEAfgAzdAAGaW52b2tlc3EAfgAic3EAfgAlAHEA
 fgAocQB+ADBzcQB+ACkAAAArdAAoc3VuLnJlZmxlY3QuRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbHQAIURlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuamF2YXEAfgA4c3EAfgAic3EAfgAlAHEAfgAocQB+ADBzcQB+ACkAAAJedAAYamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kdAALTWV0aG9kLmphdmFxAH4AOHNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjEyLmphcnQABDQuMTJzcQB+ACkAAAAydAApb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuRnJhbWV3b3JrTWV0aG9kJDF0ABRGcmFtZXdvcmtNZXRob2QuamF2YXQAEXJ1blJlZmxlY3RpdmVDYWxsc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAAMdAAzb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMubW9kZWwuUmVmbGVjdGl2ZUNhbGxhYmxldAAXUmVmbGVjdGl2ZUNhbGxhYmxlLmphdmF0AANydW5zcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMi5qYXJxAH4ARnNxAH4AKQAAAC90ACdvcmcuanVuaXQucnVubmVycy5tb2RlbC5GcmFtZXdvcmtNZXRob2RxAH4ASXQAEWludm9rZUV4cGxvc2l2ZWx5c3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAARdAAyb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5JbnZva2VNZXRob2R0ABFJbnZva2VNZXRob2QuamF2YXQACGV2YWx1YXRlc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAFFdAAeb3JnLmp1bml0LnJ1b
 m5lcnMuUGFyZW50UnVubmVydAARUGFyZW50UnVubmVyLmphdmF0AAdydW5MZWFmc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAABOdAAob3JnLmp1bml0LnJ1bm5lcnMuQmxvY2tKVW5pdDRDbGFzc1J1bm5lcnQAG0Jsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIuamF2YXQACHJ1bkNoaWxkc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAA5cQB+AGpxAH4Aa3EAfgBsc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAEidAAgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDNxAH4AZHEAfgBRc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAABHdAAgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDFxAH4AZHQACHNjaGVkdWxlc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAEgcQB+AGNxAH4AZHQAC3J1bkNoaWxkcmVuc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAA6cQB+AGNxAH4AZHQACmFjY2VzcyQwMDBzcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMi5qYXJxAH4ARnNxAH4AKQAAAQx0ACBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkMnEAfgBkcQB+AF5zcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMi5qYXJxAH4ARnNxAH4AKQAAABp0ADBvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLlJ1bkJlZm9yZXN0AA
 9SdW5CZWZvcmVzLmphdmFxAH4AXnNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjEyLmphcnEAfgBGc3EAfgApAAAAG3QAL29yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuUnVuQWZ0ZXJzdAAOUnVuQWZ0ZXJzLmphdmFxAH4AXnNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjEyLmphcnEAfgBGc3EAfgApAAABa3EAfgBjcQB+AGRxAH4AUXNxAH4AInNxAH4AJQF0AAQuY3AvcQB+AChzcQB+ACkAAABWdAA6b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0NC5ydW5uZXIuSlVuaXQ0VGVzdFJlZmVyZW5jZXQAGEpVbml0NFRlc3RSZWZlcmVuY2UuamF2YXEAfgBRc3EAfgAic3EAfgAlAXQABC5jcC9xAH4AKHNxAH4AKQAAACZ0ADNvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQucnVubmVyLlRlc3RFeGVjdXRpb250ABJUZXN0RXhlY3V0aW9uLmphdmFxAH4AUXNxAH4AInNxAH4AJQF0AAQuY3AvcQB+AChzcQB+ACkAAAHLdAA2b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5SZW1vdGVUZXN0UnVubmVydAAVUmVtb3RlVGVzdFJ1bm5lci5qYXZhdAAIcnVuVGVzdHNzcQB+ACJzcQB+ACUBdAAELmNwL3EAfgAoc3EAfgApAAACo3EAfgCrcQB+AKxxAH4ArXNxAH4AInNxAH4AJQF0AAQuY3AvcQB+AChzcQB+ACkAAAF+cQB+AKtxAH4ArHEAfgBRc3EAfgAic3EAfgAlAXQABC5jcC9xAH4AKHNxAH4AKQAAAMBxAH4Aq3EAfgCsdAAEbWFpbnQAFk9NRyBJJ3ZlIGJlZW4gZGVsZXRlZCFxAH4
 Au3QARW9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuTG9nNGpMb2dFdmVudFRlc3QkRGVsZXRlZEV4Y2VwdGlvbnVyADRbTG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuVGhyb3dhYmxlUHJveHk7+u0B4IWi6zkCAAB4cAAAAAA=";
 
         final byte[] binaryDecoded = DatatypeConverter.parseBase64Binary(base64);
         final Log4jLogEvent evt2 = deserialize(binaryDecoded);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/ThreadIdFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/ThreadIdFilter.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/ThreadIdFilter.java
new file mode 100644
index 0000000..d00edb2
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/ThreadIdFilter.java
@@ -0,0 +1,40 @@
+/*
+ * 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.logging.log4j.core.net.server;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.filter.AbstractFilter;
+
+/**
+ * TODO Should use thread ID cache?
+ * @since 2.6
+ */
+public class ThreadIdFilter extends AbstractFilter {
+
+    private static final long serialVersionUID = 1L;
+
+    public ThreadIdFilter(final Result onMatch, final Result onMismatch) {
+        super(onMatch, onMismatch);
+    }
+
+    @Override
+    public Filter.Result filter(final LogEvent event) {
+        return event.getThreadId() == Thread.currentThread().getId() ? onMatch : onMismatch;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/ThreadPriorityFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/ThreadPriorityFilter.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/ThreadPriorityFilter.java
new file mode 100644
index 0000000..7c9c734
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/ThreadPriorityFilter.java
@@ -0,0 +1,40 @@
+/*
+ * 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.logging.log4j.core.net.server;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.filter.AbstractFilter;
+
+/**
+ * TODO Should use thread priority cache?
+ * @since 2.6
+ */
+public class ThreadPriorityFilter extends AbstractFilter {
+
+    private static final long serialVersionUID = 1L;
+
+    public ThreadPriorityFilter(final Result onMatch, final Result onMismatch) {
+        super(onMatch, onMismatch);
+    }
+
+    @Override
+    public Filter.Result filter(final LogEvent event) {
+        return event.getThreadPriority() == Thread.currentThread().getPriority() ? onMatch : onMismatch;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
index b01f2bc..2545f88 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
@@ -253,11 +253,44 @@ public class PatternParserTest {
         testThreadNamePattern("%threadName");
     }
 
+    @Test
+    public void testThreadIdFullPattern() {
+        testThreadIdPattern("%threadId");
+    }
+
+    @Test
+    public void testThreadIdShortPattern() {
+        testThreadIdPattern("%tid");
+    }
+
+    @Test
+    public void testThreadPriorityShortPattern() {
+        testThreadPriorityPattern("%tp");
+    }
+
+    @Test
+    public void testThreadPriorityFullPattern() {
+        testThreadPriorityPattern("%threadPriority");
+    }
+
+    private void testThreadIdPattern(final String pattern) {
+        testFirstConverter(pattern, ThreadIdPatternConverter.class);
+    }
+
     private void testThreadNamePattern(final String pattern) {
+        testFirstConverter(pattern, ThreadNamePatternConverter.class);
+    }
+
+    private void testThreadPriorityPattern(final String pattern) {
+        testFirstConverter(pattern, ThreadPriorityPatternConverter.class);
+    }
+
+    private void testFirstConverter(final String pattern, Class<?> checkClass) {
         final List<PatternFormatter> formatters = parser.parse(pattern);
         assertNotNull(formatters);
-        assertEquals(1, formatters.size());
-        assertTrue(formatters.get(0).getConverter() instanceof ThreadPatternConverter);
+        final String msg = formatters.toString();
+        assertEquals(msg, 1, formatters.size());
+        assertTrue(msg, checkClass.isInstance(formatters.get(0).getConverter()));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverterTest.java
new file mode 100644
index 0000000..b608df8
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverterTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.logging.log4j.core.pattern;
+
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ */
+public class ThreadIdPatternConverterTest {
+
+    @Test
+    public void testConverterAppendsLogEventNanoTimeToStringBuilder() {
+        final LogEvent event = Log4jLogEvent.newBuilder() //
+                .setThreadId(1).build();
+        final StringBuilder sb = new StringBuilder();
+        final ThreadIdPatternConverter converter = ThreadIdPatternConverter.newInstance(null);
+        converter.format(event, sb);
+        assertEquals("1", sb.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverterTest.java
index 6b5dfc6..1ae94d2 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverterTest.java
@@ -32,7 +32,7 @@ public class ThreadNamePatternConverterTest {
         final LogEvent event = Log4jLogEvent.newBuilder() //
                 .setThreadName("Hello-1").build();
         final StringBuilder sb = new StringBuilder();
-        final ThreadPatternConverter converter = ThreadPatternConverter.newInstance(null);
+        final ThreadNamePatternConverter converter = ThreadNamePatternConverter.newInstance(null);
         converter.format(event, sb);
         assertEquals("Hello-1", sb.toString());
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/585beba1/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverterTest.java
new file mode 100644
index 0000000..37db555
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverterTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.logging.log4j.core.pattern;
+
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ */
+public class ThreadPriorityPatternConverterTest {
+
+    @Test
+    public void testConverterAppendsLogEventNanoTimeToStringBuilder() {
+        final LogEvent event = Log4jLogEvent.newBuilder() //
+                .setThreadPriority(1).build();
+        final StringBuilder sb = new StringBuilder();
+        final ThreadPriorityPatternConverter converter = ThreadPriorityPatternConverter.newInstance(null);
+        converter.format(event, sb);
+        assertEquals("1", sb.toString());
+    }
+}