Skip to content

Commit 97922ee

Browse files
committed
fix LOGBACK-805
1 parent ba2185a commit 97922ee

File tree

2 files changed

+42
-24
lines changed

2 files changed

+42
-24
lines changed

logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import ch.qos.logback.classic.spi.*;
2828
import ch.qos.logback.core.CoreConstants;
2929
import ch.qos.logback.core.db.DBAppenderBase;
30-
import static ch.qos.logback.core.CoreConstants.EMPTY_STRING;
3130

3231
/**
3332
* The DBAppender inserts logging events into three database tables in a format
@@ -163,14 +162,23 @@ String asStringTruncatedTo254(Object o) {
163162
void bindCallerDataWithPreparedStatement(PreparedStatement stmt,
164163
StackTraceElement[] callerDataArray) throws SQLException {
165164

166-
StackTraceElement callerData = EMPTY_CALLER_DATA;
167-
if(callerDataArray != null && callerDataArray[0] != null)
168-
callerData = callerDataArray[0];
165+
StackTraceElement caller = extractFirstCaller(callerDataArray);
169166

170-
stmt.setString(CALLER_FILENAME_INDEX, callerData.getFileName());
171-
stmt.setString(CALLER_CLASS_INDEX, callerData.getClassName());
172-
stmt.setString(CALLER_METHOD_INDEX, callerData.getMethodName());
173-
stmt.setString(CALLER_LINE_INDEX, Integer.toString(callerData.getLineNumber()));
167+
stmt.setString(CALLER_FILENAME_INDEX, caller.getFileName());
168+
stmt.setString(CALLER_CLASS_INDEX, caller.getClassName());
169+
stmt.setString(CALLER_METHOD_INDEX, caller.getMethodName());
170+
stmt.setString(CALLER_LINE_INDEX, Integer.toString(caller.getLineNumber()));
171+
}
172+
173+
private StackTraceElement extractFirstCaller(StackTraceElement[] callerDataArray) {
174+
StackTraceElement caller = EMPTY_CALLER_DATA;
175+
if(hasAtLeastOneNonNullElement(callerDataArray))
176+
caller = callerDataArray[0];
177+
return caller;
178+
}
179+
180+
private boolean hasAtLeastOneNonNullElement(StackTraceElement[] callerDataArray) {
181+
return callerDataArray != null && callerDataArray.length > 0 && callerDataArray[0] != null;
174182
}
175183

176184
Map<String, String> mergePropertyMaps(ILoggingEvent event) {

logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderH2Test.java

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import java.util.Date;
2424
import java.util.Map;
2525

26+
import ch.qos.logback.classic.spi.CallerData;
27+
import ch.qos.logback.core.status.StatusChecker;
2628
import org.apache.log4j.MDC;
2729
import org.junit.After;
2830
import org.junit.Before;
@@ -39,27 +41,25 @@
3941

4042
public class DBAppenderH2Test {
4143

42-
LoggerContext lc;
44+
LoggerContext loggerContext = new LoggerContext();;
4345
Logger logger;
4446
DBAppender appender;
4547
DriverManagerConnectionSource connectionSource;
4648
DBAppenderH2TestFixture dbAppenderH2TestFixture;
4749
int diff = RandomUtil.getPositiveInt();
50+
StatusChecker checker = new StatusChecker(loggerContext);
4851

4952
@Before
5053
public void setUp() throws SQLException {
5154
dbAppenderH2TestFixture = new DBAppenderH2TestFixture();
52-
5355
dbAppenderH2TestFixture.setUp();
54-
55-
lc = new LoggerContext();
56-
lc.setName("default");
57-
logger = lc.getLogger("root");
56+
loggerContext.setName("default");
57+
logger = loggerContext.getLogger("root");
5858
appender = new DBAppender();
5959
appender.setName("DB");
60-
appender.setContext(lc);
60+
appender.setContext(loggerContext);
6161
connectionSource = new DriverManagerConnectionSource();
62-
connectionSource.setContext(lc);
62+
connectionSource.setContext(loggerContext);
6363
connectionSource.setDriverClass(DBAppenderH2TestFixture.H2_DRIVER_CLASS);
6464
connectionSource.setUrl(dbAppenderH2TestFixture.url);
6565
System.out.println("cs.url=" + dbAppenderH2TestFixture.url);
@@ -75,7 +75,7 @@ public void setUp() throws SQLException {
7575
@After
7676
public void tearDown() throws SQLException {
7777
logger = null;
78-
lc = null;
78+
loggerContext = null;
7979
appender = null;
8080
connectionSource = null;
8181
dbAppenderH2TestFixture.tearDown();
@@ -87,7 +87,7 @@ public void testAppendLoggingEvent() throws SQLException {
8787

8888
appender.append(event);
8989

90-
StatusPrinter.print(lc);
90+
StatusPrinter.print(loggerContext);
9191

9292
Statement stmt = connectionSource.getConnection().createStatement();
9393
ResultSet rs = null;
@@ -150,14 +150,11 @@ public void withNullArgument() throws SQLException {
150150
assertEquals(event.getTimeStamp(), rs.getLong(DBAppender.TIMESTMP_INDEX));
151151
assertEquals(event.getFormattedMessage(), rs.getString(DBAppender.FORMATTED_MESSAGE_INDEX));
152152
}
153-
154-
StatusPrinter.print(lc);
155-
156153
}
157154

158155
@Test
159156
public void testContextInfo() throws SQLException {
160-
lc.putProperty("testKey1", "testValue1");
157+
loggerContext.putProperty("testKey1", "testValue1");
161158
MDC.put("k" + diff, "v" + diff);
162159
ILoggingEvent event = createLoggingEvent();
163160

@@ -200,14 +197,27 @@ public void testAppendMultipleEvents() throws SQLException {
200197
stmt.close();
201198
}
202199

200+
// http://jira.qos.ch/browse/LOGBACK-805
201+
@Test
202+
public void emptyCallerDataShouldBeHandledGracefully() {
203+
LoggingEvent event = createLoggingEvent();
204+
event.setCallerData(new StackTraceElement[0]);
205+
appender.append(event);
206+
207+
event.setCallerData(new StackTraceElement[] {null});
208+
appender.append(event);
209+
210+
checker.assertIsErrorFree();
211+
}
212+
203213

204-
private ILoggingEvent createLoggingEvent(String msg, Object[] args) {
214+
private LoggingEvent createLoggingEvent(String msg, Object[] args) {
205215
return new LoggingEvent(this.getClass().getName(), logger,
206216
Level.DEBUG, msg, new Exception("test Ex"), args);
207217
}
208218

209219

210-
private ILoggingEvent createLoggingEvent() {
220+
private LoggingEvent createLoggingEvent() {
211221
return createLoggingEvent("test message", new Integer[]{diff});
212222
}
213223

0 commit comments

Comments
 (0)