I have done some investigation. SocketAppender is working separate thread. It calls getCallerData() method, which basically throws exception and tries to get caller information from a stack trace. In theory it should work, but SocketAppender is working in the another thread, so the stack trace is useless.
Here is creating new Throwable:
LoggingEvent.java
public StackTraceElement[] getCallerData() {
if (callerDataArray == null) {
callerDataArray = CallerData.extract(new Throwable(), fqnOfLoggerClass,
loggerContext.getMaxCallerDataDepth(), loggerContext.getFrameworkPackages());
}
return callerDataArray;
}
Caller data iterate through StackTraceElements:
CallerData.java
```java
/**
Extract caller data information as an array based on a Throwable passed as
parameter
*/
public static StackTraceElement[] extract(Throwable t,
String fqnOfInvokingClass, final int maxDepth,
List<String> frameworkPackageList) {
if (t == null)
{
return null;
}
int found = LINE_NA;
for (int i = 0; i < steArray.length; i++) {
if (isInFrameworkSpace(steArray[i].getClassName(),
fqnOfInvokingClass, frameworkPackageList))
{
// the caller is assumed to be the next stack frame, hence the +1.
found = i + 1;
}
else {
if (found != LINE_NA)
{
break;
}
}
}
// we failed to extract caller data
if (found == LINE_NA)
{
return EMPTY_CALLER_DATA_ARRAY;
}
int availableDepth = steArray.length - found;
int desiredDepth = maxDepth < (availableDepth) ? maxDepth : availableDepth;
callerDataArray = new StackTraceElement[desiredDepth];
for (int i = 0; i < desiredDepth; i++)
{
callerDataArray[i] = steArray[found + i];
}
return callerDataArray;
}
static boolean isInFrameworkSpace(String currentClass,
String fqnOfInvokingClass, List<String> frameworkPackageList) {
// the check for org.apache.log4j.Category class is intended to support
// log4j-over-slf4j. it solves http://bugzilla.slf4j.org/show_bug.cgi?id=66
if (currentClass.equals(fqnOfInvokingClass) || currentClass.equals(LOG4J_CATEGORY)
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
I have done some investigation. SocketAppender is working separate thread. It calls getCallerData() method, which basically throws exception and tries to get caller information from a stack trace. In theory it should work, but SocketAppender is working in the another thread, so the stack trace is useless.
Here is creating new Throwable:
Caller data iterate through StackTraceElements:
CallerData.java
```java
/**
*/
public static StackTraceElement[] extract(Throwable t,
String fqnOfInvokingClass, final int maxDepth,
List<String> frameworkPackageList) {
if (t == null) { return null; }
StackTraceElement[] steArray = t.getStackTrace();
StackTraceElement[] callerDataArray;
int found = LINE_NA;
{ // the caller is assumed to be the next stack frame, hence the +1. found = i + 1; }for (int i = 0; i < steArray.length; i++) {
if (isInFrameworkSpace(steArray[i].getClassName(),
fqnOfInvokingClass, frameworkPackageList))
else {
{ break; }if (found != LINE_NA)
}
}
// we failed to extract caller data
{ return EMPTY_CALLER_DATA_ARRAY; }if (found == LINE_NA)
int availableDepth = steArray.length - found;
int desiredDepth = maxDepth < (availableDepth) ? maxDepth : availableDepth;
callerDataArray = new StackTraceElement[desiredDepth];
{ callerDataArray[i] = steArray[found + i]; }for (int i = 0; i < desiredDepth; i++)
return callerDataArray;
}
static boolean isInFrameworkSpace(String currentClass,
String fqnOfInvokingClass, List<String> frameworkPackageList) {
// the check for org.apache.log4j.Category class is intended to support
// log4j-over-slf4j. it solves http://bugzilla.slf4j.org/show_bug.cgi?id=66
if (currentClass.equals(fqnOfInvokingClass) || currentClass.equals(LOG4J_CATEGORY)
else
{ return false; }}
```
If you check in debug what are the StackTraceElements:
```
{java.lang.StackTraceElement[12]@1686}ch.qos.logback.classic.spi.CallerData#extract
steArray =
0 =
"ch.qos.logback.classic.spi.LoggingEvent.getCallerData(LoggingEvent.java:262)"
{java.lang.StackTraceElement@1688}1 =
"ch.qos.logback.classic.net.SocketAppender.postProcessEvent(SocketAppender.java:48)"
{java.lang.StackTraceElement@1689}2 =
"ch.qos.logback.classic.net.SocketAppender.postProcessEvent(SocketAppender.java:34)"
{java.lang.StackTraceElement@1690}3 =
"ch.qos.logback.core.net.AbstractSocketAppender.dispatchEvents(AbstractSocketAppender.java:230)"
{java.lang.StackTraceElement@1691}4 =
"ch.qos.logback.core.net.AbstractSocketAppender.connectSocketAndDispatchEvents(AbstractSocketAppender.java:194)"
{java.lang.StackTraceElement@1692}5 =
"ch.qos.logback.core.net.AbstractSocketAppender.access$000(AbstractSocketAppender.java:44)"
{java.lang.StackTraceElement@1693}6 =
"ch.qos.logback.core.net.AbstractSocketAppender$1.run(AbstractSocketAppender.java:153)"
{java.lang.StackTraceElement@1694}7 =
"java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)"
{java.lang.StackTraceElement@1695}8 =
"java.util.concurrent.FutureTask.run(FutureTask.java:266)"
{java.lang.StackTraceElement@1696}9 =
"java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)"
{java.lang.StackTraceElement@1697}10 =
"java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)"
{java.lang.StackTraceElement@1698}11 =
"java.lang.Thread.run(Thread.java:745)"
```