logback-dev
Threads by month
- ----- 2025 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
March 2010
- 11 participants
- 188 discussions

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-97-g544292b
by git-noreply@pixie.qos.ch 19 Mar '10
by git-noreply@pixie.qos.ch 19 Mar '10
19 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 544292b758f9d296f581b6ec265fbeea954e6c6a (commit)
from ea6065ca315b78c7e0eb40d3fe85faec6441a834 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=544292b758f9d296f581b6ec…
http://github.com/ceki/logback/commit/544292b758f9d296f581b6ec265fbeea954e6…
commit 544292b758f9d296f581b6ec265fbeea954e6c6a
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Fri Mar 19 13:46:55 2010 +0100
- added req.requestURL to MDCInsertingServletFilter
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java b/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
index 492c8e4..12fedc5 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
@@ -35,7 +35,8 @@ public class ClassicConstants {
public final static String REQUEST_REMOTE_HOST_MDC_KEY = "req.remoteHost";
public final static String REQUEST_USER_AGENT_MDC_KEY = "req.userAgent";
- public final static String REQUEST_REQUST_URI = "req.requestURI";
+ public final static String REQUEST_REQUEST_URI = "req.requestURI";
+ public final static String REQUEST_REQUEST_URL = "req.requestURL";
public final static String REQUEST_X_FORWARDED_FOR = "req.xForwardedFor";
}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
index d9f25d6..5efae36 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java
@@ -31,8 +31,9 @@ import ch.qos.logback.classic.ClassicConstants;
* A servlet filter that inserts various values retrieved from the incoming http
* request into the MDC.
*
- * <p>The values are removed after the request is processed.
- *
+ * <p>
+ * The values are removed after the request is processed.
+ *
* @author Ceki Gülcü
*/
public class MDCInsertingServletFilter implements Filter {
@@ -57,11 +58,15 @@ public class MDCInsertingServletFilter implements Filter {
MDC.put(ClassicConstants.REQUEST_REMOTE_HOST_MDC_KEY, request
.getRemoteHost());
-
+
if (request instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
- MDC.put(ClassicConstants.REQUEST_REQUST_URI, httpServletRequest
+ MDC.put(ClassicConstants.REQUEST_REQUEST_URI, httpServletRequest
.getRequestURI());
+ StringBuffer requestURL = httpServletRequest.getRequestURL();
+ if (requestURL != null) {
+ MDC.put(ClassicConstants.REQUEST_REQUEST_URL, requestURL.toString());
+ }
MDC.put(ClassicConstants.REQUEST_USER_AGENT_MDC_KEY, httpServletRequest
.getHeader("User-Agent"));
MDC.put(ClassicConstants.REQUEST_X_FORWARDED_FOR, httpServletRequest
@@ -72,8 +77,11 @@ public class MDCInsertingServletFilter implements Filter {
void clearMDC() {
MDC.remove(ClassicConstants.REQUEST_REMOTE_HOST_MDC_KEY);
- MDC.remove(ClassicConstants.REQUEST_REQUST_URI);
+ MDC.remove(ClassicConstants.REQUEST_REQUEST_URI);
+ // removing possibly inexistent item is OK
+ MDC.remove(ClassicConstants.REQUEST_REQUEST_URL);
MDC.remove(ClassicConstants.REQUEST_USER_AGENT_MDC_KEY);
+ MDC.remove(ClassicConstants.REQUEST_X_FORWARDED_FOR);
}
public void init(FilterConfig arg0) throws ServletException {
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java b/logback-classic/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java
index 9af2532..2c4f807 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java
@@ -19,14 +19,16 @@ import java.util.Set;
import org.slf4j.spi.MDCAdapter;
-
/**
- * A <em>Mapped Diagnostic Context</em>, or MDC in short, is an instrument
- * for distinguishing interleaved log output from different sources. Log output
- * is typically interleaved when a server handles multiple clients
- * near-simultaneously. <p> <b><em>The MDC is managed on a per thread basis</em></b>.
- * A child thread automatically inherits a <em>copy</em> of the mapped
- * diagnostic context of its parent. <p>
+ * A <em>Mapped Diagnostic Context</em>, or MDC in short, is an instrument for
+ * distinguishing interleaved log output from different sources. Log output is
+ * typically interleaved when a server handles multiple clients
+ * near-simultaneously.
+ * <p>
+ * <b><em>The MDC is managed on a per thread basis</em></b>. A child thread
+ * automatically inherits a <em>copy</em> of the mapped diagnostic context of
+ * its parent.
+ * <p>
*
* For more information about MDC, please refer to the online manual at
* http://logback.qos.ch/manual/mdc.html
@@ -44,20 +46,22 @@ public class LogbackMDCAdapter implements MDCAdapter {
}
/**
- * Put a context value (the <code>val</code> parameter) as identified with
- * the <code>key</code> parameter into the current thread's context map.
- * Note that contrary to log4j, the <code>val</code> parameter can be null.
+ * Put a context value (the <code>val</code> parameter) as identified with the
+ * <code>key</code> parameter into the current thread's context map. Note that
+ * contrary to log4j, the <code>val</code> parameter can be null.
*
- * <p> If the current thread does not have a context map it is created as a
- * side effect of this call.
+ * <p>
+ * If the current thread does not have a context map it is created as a side
+ * effect of this call.
*
- * <p> Each time a value is added, a new instance of the map is created. This
- * is to be certain that the serialization process will operate on the updated
+ * <p>
+ * Each time a value is added, a new instance of the map is created. This is
+ * to be certain that the serialization process will operate on the updated
* map and not send a reference to the old map, thus not allowing the remote
* logback component to see the latest changes.
*
* @throws IllegalArgumentException
- * in case the "key" parameter is null
+ * in case the "key" parameter is null
*/
public void put(String key, String val) throws IllegalArgumentException {
if (key == null) {
@@ -78,7 +82,8 @@ public class LogbackMDCAdapter implements MDCAdapter {
/**
* Get the context identified by the <code>key</code> parameter.
*
- * <p> This method has no side effects.
+ * <p>
+ * This method has no side effects.
*/
public String get(String key) {
HashMap<String, String> hashMap = copyOnInheritThreadLocal.get();
@@ -93,12 +98,16 @@ public class LogbackMDCAdapter implements MDCAdapter {
/**
* Remove the the context identified by the <code>key</code> parameter.
*
- * <p> Each time a value is removed, a new instance of the map is created.
- * This is to be certain that the serialization process will operate on the
- * updated map and not send a reference to the old map, thus not allowing the
- * remote logback component to see the latest changes.
+ * <p>
+ * Each time a value is removed, a new instance of the map is created. This is
+ * to be certain that the serialization process will operate on the updated
+ * map and not send a reference to the old map, thus not allowing the remote
+ * logback component to see the latest changes.
*/
public void remove(String key) {
+ if(key == null) {
+ return;
+ }
HashMap<String, String> oldMap = copyOnInheritThreadLocal.get();
HashMap<String, String> newMap = new HashMap<String, String>();
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
index 24dc122..a88d9d0 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
@@ -51,6 +51,18 @@ public class LogbackMDCAdapterTest {
assertNull(childThread.childHM);
}
+ @Test
+ public void removeForNullKey() {
+ LogbackMDCAdapter lma = new LogbackMDCAdapter();
+ lma.remove(null);
+ }
+
+ @Test
+ public void removeInexistnetKey() {
+ LogbackMDCAdapter lma = new LogbackMDCAdapter();
+ lma.remove("abcdlw0");
+ }
+
class ChildThreadForMDCAdapter extends Thread {
LogbackMDCAdapter logbackMDCAdapter;
diff --git a/logback-site/src/site/pages/index.html b/logback-site/src/site/pages/index.html
index f9942ce..0cd8ee0 100644
--- a/logback-site/src/site/pages/index.html
+++ b/logback-site/src/site/pages/index.html
@@ -56,14 +56,21 @@
</p>
- <h3>Select projects known to rely on logback</h3>
+ <h3>Projects known to rely on logback</h3>
- <ul>
+ <p>Here is a non-exhaustive list of projects known to depend on
+ logback, in alphabetical order:
+ </p>
+
+ <ul>
<li><a href="http://www.jfrog.org/products.php">Artifactory</a></li>
<li><a href="http://www.geomajas.org/">Geomajas</a></li>
+ <li><a href="http://jmxmonitor.sourceforge.net/">jmxmonitor</a></li>
+
+
<li><a href="http://code.google.com/p/openmeetings/">OpenMeetings</a></li>
<li><a href="http://liftweb.net/">Lift</a></li>
diff --git a/logback-site/src/site/pages/manual/mdc.html b/logback-site/src/site/pages/manual/mdc.html
index 6cdfc59..9cf843b 100644
--- a/logback-site/src/site/pages/manual/mdc.html
+++ b/logback-site/src/site/pages/manual/mdc.html
@@ -678,6 +678,15 @@ public class UserServletFilter implements Filter {
</tr>
<tr >
+ <td><code>req.requestURL</code></td>
+ <td>
+ as returned by <a
+ href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServle…">getRequestURL()</a>
+ method
+ </td>
+ </tr>
+
+ <tr class="alt">
<td><code>req.userAgent</code></td>
<td>value of the "User-Agent" header
</td>
-----------------------------------------------------------------------
Summary of changes:
.../ch/qos/logback/classic/ClassicConstants.java | 3 +-
.../classic/helpers/MDCInsertingServletFilter.java | 18 +++++--
.../logback/classic/util/LogbackMDCAdapter.java | 49 ++++++++++++--------
.../classic/util/LogbackMDCAdapterTest.java | 12 +++++
logback-site/src/site/pages/index.html | 11 ++++-
logback-site/src/site/pages/manual/mdc.html | 9 ++++
6 files changed, 74 insertions(+), 28 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, dbname, created. v0.9.18-100-g13148e6
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, dbname has been created
at 13148e6ffc936dfafa2888c1bdb20f097494357e (commit)
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=13148e6ffc936dfafa2888c1…
http://github.com/ceki/logback/commit/13148e6ffc936dfafa2888c1bdb20f0974943…
commit 13148e6ffc936dfafa2888c1bdb20f097494357e
Merge: ea6065c 35a2ffe
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 23:54:24 2010 +0100
- Merge branch 'master' of http://github.com/nurkiewicz/logback into dbname
- plus ceki's simplifications
diff --cc logback-classic/src/main/java/ch/qos/logback/classic/db/SQLBuilder.java
index 0000000,9c197a0..1390237
mode 000000,100644..100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/db/SQLBuilder.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/SQLBuilder.java
@@@ -1,0 -1,47 +1,60 @@@
++/**
++ * Logback: the reliable, generic, fast and flexible logging framework.
++ * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
++ *
++ * This program and the accompanying materials are dual-licensed under either
++ * the terms of the Eclipse Public License v1.0 as published by the Eclipse
++ * Foundation
++ *
++ * or (per the licensee's choosing)
++ *
++ * under the terms of the GNU Lesser General Public License version 2.1 as
++ * published by the Free Software Foundation.
++ */
+ package ch.qos.logback.classic.db;
+
+ import ch.qos.logback.classic.db.names.*;
+
+ /**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-16
+ */
+ public class SQLBuilder {
+
+ static String buildInsertPropertiesSQL(DBNameResolver dbNameResolver) {
+ StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
+ sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT_PROPERTY)).append(" (");
- sqlBuilder.append(dbNameResolver.getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName.EVENT_ID)).append(",");
- sqlBuilder.append(dbNameResolver.getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName.MAPPED_KEY)).append(",");
- sqlBuilder.append(dbNameResolver.getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName.MAPPED_VALUE)).append(") ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.EVENT_ID)).append(",");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.MAPPED_KEY)).append(",");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.MAPPED_VALUE)).append(") ");
+ sqlBuilder.append("VALUES (?, ?, ?)");
+ return sqlBuilder.toString();
+ }
+
+ static String buildInsertExceptionSQL(DBNameResolver dbNameResolver) {
+ StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
+ sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT_EXCEPTION)).append(" (");
- sqlBuilder.append(dbNameResolver.getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName.EVENT_ID)).append(",");
- sqlBuilder.append(dbNameResolver.getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName.I)).append(",");
- sqlBuilder.append(dbNameResolver.getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName.TRACE_LINE)).append(") ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.EVENT_ID)).append(",");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.I)).append(",");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.TRACE_LINE)).append(") ");
+ sqlBuilder.append("VALUES (?, ?, ?)");
+ return sqlBuilder.toString();
+ }
+
+ static String buildInsertSQL(DBNameResolver dbNameResolver) {
+ StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
+ sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT)).append(" (");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.TIMESTMP)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.FORMATTED_MESSAGE)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.LOGGER_NAME)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.LEVEL_STRING)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.THREAD_NAME)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.REFERENCE_FLAG)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.CALLER_FILENAME)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.CALLER_CLASS)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.CALLER_METHOD)).append(", ");
- sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.CALLER_LINE)).append(") ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.TIMESTMP)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.FORMATTED_MESSAGE)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.LOGGER_NAME)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.LEVEL_STRING)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.THREAD_NAME)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.REFERENCE_FLAG)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.CALLER_FILENAME)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.CALLER_CLASS)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.CALLER_METHOD)).append(", ");
++ sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.CALLER_LINE)).append(") ");
+ sqlBuilder.append(" VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?, ?)");
+ return sqlBuilder.toString();
+ }
+ }
diff --cc logback-classic/src/main/java/ch/qos/logback/classic/db/names/ColumnName.java
index 0000000,0000000..2717331
new file mode 100644
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/ColumnName.java
@@@ -1,0 -1,0 +1,24 @@@
++package ch.qos.logback.classic.db.names;
++
++public enum ColumnName {
++
++ EVENT_ID,
++
++ TIMESTMP,
++ FORMATTED_MESSAGE,
++ LOGGER_NAME,
++ LEVEL_STRING,
++ THREAD_NAME,
++ REFERENCE_FLAG,
++ CALLER_FILENAME,
++ CALLER_CLASS,
++ CALLER_METHOD,
++ CALLER_LINE,
++
++ // MDC
++ MAPPED_KEY,
++ MAPPED_VALUE,
++
++ I,
++ TRACE_LINE;
++}
diff --cc logback-classic/src/main/java/ch/qos/logback/classic/db/names/CustomDBNameResolver.java
index 0000000,0880aa5..e0578f9
mode 000000,100644..100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/CustomDBNameResolver.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/CustomDBNameResolver.java
@@@ -1,0 -1,118 +1,52 @@@
++/**
++ * Logback: the reliable, generic, fast and flexible logging framework.
++ * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
++ *
++ * This program and the accompanying materials are dual-licensed under either
++ * the terms of the Eclipse Public License v1.0 as published by the Eclipse
++ * Foundation
++ *
++ * or (per the licensee's choosing)
++ *
++ * under the terms of the GNU Lesser General Public License version 2.1 as
++ * published by the Free Software Foundation.
++ */
+ package ch.qos.logback.classic.db.names;
+
-import java.util.EnumMap;
++import java.util.HashMap;
+ import java.util.Map;
+
+ /**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-16
+ */
+ public class CustomDBNameResolver implements DBNameResolver {
+
+ private final DBNameResolver defaultDbNameResolver = new DefaultDBNameResolver();
- private final Map<TableName, String> tableNameOverrides = new EnumMap<TableName, String>(TableName.class);
- private final Map<LoggingEventColumnName, String> leColumnNameOverrides = new EnumMap<LoggingEventColumnName, String>(LoggingEventColumnName.class);
- private final Map<LoggingEventPropertyColumnName, String> lePropertyColumnNameOverrides = new EnumMap<LoggingEventPropertyColumnName, String>(LoggingEventPropertyColumnName.class);
- private final Map<LoggingEventExceptionColumnName, String> leExceptionColumnNameOverrides = new EnumMap<LoggingEventExceptionColumnName, String>(LoggingEventExceptionColumnName.class);
-
- public String getTableName(TableName tableName) {
++ private final Map<String, String> tableNameOverrides = new HashMap<String, String>();
++ private final Map<String, String> columnNameOverrides = new HashMap<String, String>();
++
++ public <N extends Enum<?>> String getTableName(N tableName) {
+ if (tableNameOverrides.get(tableName) != null)
+ return tableNameOverrides.get(tableName);
+ return defaultDbNameResolver.getTableName(tableName);
+ }
+
- public String getLoggingEventColumnName(LoggingEventColumnName columnName) {
- if (leColumnNameOverrides.get(columnName) != null)
- return leColumnNameOverrides.get(columnName);
- return defaultDbNameResolver.getLoggingEventColumnName(columnName);
++ public <N extends Enum<?>> String getColumnName(N columnName) {
++ if (columnNameOverrides.get(columnName) != null)
++ return columnNameOverrides.get(columnName);
++ return defaultDbNameResolver.getColumnName(columnName);
+ }
-
- public String getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName columnName) {
- if (lePropertyColumnNameOverrides.get(columnName) != null)
- return lePropertyColumnNameOverrides.get(columnName);
- return defaultDbNameResolver.getLoggingEventPropertyColumnName(columnName);
++
++
++ public void overrideTableName(String reference, String name) {
++ tableNameOverrides.put(reference, name);
+ }
-
- public String getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName columnName) {
- if (leExceptionColumnNameOverrides.get(columnName) != null)
- return leExceptionColumnNameOverrides.get(columnName);
- return defaultDbNameResolver.getLoggingEventExceptionColumnName(columnName);
++ public void overrideColumnName(String reference, String name) {
++ columnNameOverrides.put(reference, name);
+ }
+
- public void setLoggingEventTableName(String tableName) {
- tableNameOverrides.put(TableName.LOGGING_EVENT, tableName);
- }
+
- public void setLoggingEventPropertyTableName(String tableName) {
- tableNameOverrides.put(TableName.LOGGING_EVENT_PROPERTY, tableName);
- }
-
- public void setLoggingEventExceptionTableName(String tableName) {
- tableNameOverrides.put(TableName.LOGGING_EVENT_EXCEPTION, tableName);
- }
-
- public void setLoggingEventTimestmpColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.TIMESTMP, columnName);
- }
-
- public void setLoggingEventFormattedMessageColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.FORMATTED_MESSAGE, columnName);
- }
-
- public void setLoggingEventLoggerNameColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.LOGGER_NAME, columnName);
- }
-
- public void setLoggingEventLevelStringColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.LEVEL_STRING, columnName);
- }
-
- public void setLoggingEventThreadNameColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.THREAD_NAME, columnName);
- }
-
- public void setLoggingEventReferenceFlagColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.REFERENCE_FLAG, columnName);
- }
-
- public void setLoggingEventCallerFilenameColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.CALLER_FILENAME, columnName);
- }
-
- public void setLoggingEventCallerClassColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.CALLER_CLASS, columnName);
- }
-
- public void setLoggingEventCallerMethodColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.CALLER_METHOD, columnName);
- }
-
- public void setLoggingEventCallerLineColumnName(String columnName) {
- leColumnNameOverrides.put(LoggingEventColumnName.CALLER_LINE, columnName);
- }
-
- public void setLoggingEventPropertyEventIdColumnName(String columnName) {
- lePropertyColumnNameOverrides.put(LoggingEventPropertyColumnName.EVENT_ID, columnName);
- }
-
- public void setMappedKeyColumnName(String columnName) {
- lePropertyColumnNameOverrides.put(LoggingEventPropertyColumnName.MAPPED_KEY, columnName);
- }
-
- public void setMappedValueColumnName(String columnName) {
- lePropertyColumnNameOverrides.put(LoggingEventPropertyColumnName.MAPPED_VALUE, columnName);
- }
-
- public void setLoggingEventExceptionEventIdColumnName(String columnName) {
- leExceptionColumnNameOverrides.put(LoggingEventExceptionColumnName.EVENT_ID, columnName);
- }
-
- public void setLoggingEventExceptionIColumnName(String columnName) {
- leExceptionColumnNameOverrides.put(LoggingEventExceptionColumnName.I, columnName);
- }
-
- public void setLoggingEventExceptionTraceLineColumnName(String columnName) {
- leExceptionColumnNameOverrides.put(LoggingEventExceptionColumnName.TRACE_LINE, columnName);
- }
++
+
+ }
diff --cc logback-classic/src/main/java/ch/qos/logback/classic/db/names/DBNameResolver.java
index 0000000,2647b00..e715fb5
mode 000000,100644..100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DBNameResolver.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DBNameResolver.java
@@@ -1,0 -1,13 +1,20 @@@
++/**
++ * Logback: the reliable, generic, fast and flexible logging framework.
++ * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
++ *
++ * This program and the accompanying materials are dual-licensed under either
++ * the terms of the Eclipse Public License v1.0 as published by the Eclipse
++ * Foundation
++ *
++ * or (per the licensee's choosing)
++ *
++ * under the terms of the GNU Lesser General Public License version 2.1 as
++ * published by the Free Software Foundation.
++ */
+ package ch.qos.logback.classic.db.names;
+
+ public interface DBNameResolver {
+
- String getTableName(TableName tableName);
-
- String getLoggingEventColumnName(LoggingEventColumnName columnName);
-
- String getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName columnName);
-
- String getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName columnName);
-
++ <N extends Enum<?>> String getTableName(N tableName);
++ <N extends Enum<?>> String getColumnName(N columnName);
+ }
diff --cc logback-classic/src/main/java/ch/qos/logback/classic/db/names/DefaultDBNameResolver.java
index 0000000,fbf17cb..db88a52
mode 000000,100644..100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DefaultDBNameResolver.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DefaultDBNameResolver.java
@@@ -1,0 -1,23 +1,30 @@@
++/**
++ * Logback: the reliable, generic, fast and flexible logging framework.
++ * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
++ *
++ * This program and the accompanying materials are dual-licensed under either
++ * the terms of the Eclipse Public License v1.0 as published by the Eclipse
++ * Foundation
++ *
++ * or (per the licensee's choosing)
++ *
++ * under the terms of the GNU Lesser General Public License version 2.1 as
++ * published by the Free Software Foundation.
++ */
+ package ch.qos.logback.classic.db.names;
+
+ /**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-16
+ */
+ public class DefaultDBNameResolver implements DBNameResolver {
- public String getTableName(TableName tableName) {
- return tableName.name().toLowerCase();
- }
+
- public String getLoggingEventColumnName(LoggingEventColumnName columnName) {
- return columnName.name().toLowerCase();
++ public <N extends Enum<?>> String getTableName(N tableName) {
++ return tableName.toString();
+ }
+
- public String getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName columnName) {
- return columnName.name().toLowerCase();
++ public <N extends Enum<?>> String getColumnName(N columnName) {
++ return columnName.toString();
+ }
+
- public String getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName columnName) {
- return columnName.name().toLowerCase();
- }
+ }
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=35a2ffe580a13ad82f6798ed…
http://github.com/ceki/logback/commit/35a2ffe580a13ad82f6798edf396ef9d5138e…
commit 35a2ffe580a13ad82f6798edf396ef9d5138e65b
Merge: 2ff886b fd195dc
Author: Tomasz Nurkiewicz <nurkiewicz(a)gmail.com>
Date: Wed Mar 17 00:04:16 2010 +0100
Merge branch 'master' of git://github.com/ceki/logback
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=2ff886bfdc0e731e8ed39e6d…
http://github.com/ceki/logback/commit/2ff886bfdc0e731e8ed39e6da029c3c88d130…
commit 2ff886bfdc0e731e8ed39e6da029c3c88d130b75
Author: Tomasz Nurkiewicz <nurkiewicz(a)gmail.com>
Date: Tue Mar 16 23:54:25 2010 +0100
[LBCLASSIC-188] Make table and column names overridable
* default implementation
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
index c4ecaa8..e055c5b 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
@@ -22,6 +22,8 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+import ch.qos.logback.classic.db.names.DBNameResolver;
+import ch.qos.logback.classic.db.names.DefaultDBNameResolver;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.core.db.DBAppenderBase;
@@ -38,27 +40,14 @@ import ch.qos.logback.core.db.DBAppenderBase;
* @author Sébastien Pennec
*/
public class DBAppender extends DBAppenderBase<ILoggingEvent> {
- protected final String insertPropertiesSQL = "INSERT INTO logging_event_property (event_id, mapped_key, mapped_value) VALUES (?, ?, ?)";
- protected final String insertExceptionSQL = "INSERT INTO logging_event_exception (event_id, i, trace_line) VALUES (?, ?, ?)";
- protected static final String insertSQL;
+ protected String insertPropertiesSQL;
+ protected String insertExceptionSQL;
+ protected String insertSQL;
protected static final Method GET_GENERATED_KEYS_METHOD;
+ private DBNameResolver dbNameResolver;
+
static {
- StringBuffer sql = new StringBuffer();
- sql.append("INSERT INTO logging_event (");
- sql.append("timestmp, ");
- sql.append("formatted_message, ");
- sql.append("logger_name, ");
- sql.append("level_string, ");
- sql.append("thread_name, ");
- sql.append("reference_flag, ");
- sql.append("caller_filename, ");
- sql.append("caller_class, ");
- sql.append("caller_method, ");
- sql.append("caller_line) ");
- sql.append(" VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?,?)");
- insertSQL = sql.toString();
-
// PreparedStatement.getGeneratedKeys() method was added in JDK 1.4
Method getGeneratedKeysMethod;
try {
@@ -74,6 +63,20 @@ public class DBAppender extends DBAppenderBase<ILoggingEvent> {
public DBAppender() {
}
+ public void setDbNameResolver(DBNameResolver dbNameResolver) {
+ this.dbNameResolver = dbNameResolver;
+ }
+
+ @Override
+ public void start() {
+ if(dbNameResolver == null)
+ dbNameResolver = new DefaultDBNameResolver();
+ insertExceptionSQL = SQLBuilder.buildInsertExceptionSQL(dbNameResolver);
+ insertPropertiesSQL = SQLBuilder.buildInsertPropertiesSQL(dbNameResolver);
+ insertSQL = SQLBuilder.buildInsertSQL(dbNameResolver);
+ super.start();
+ }
+
@Override
protected void subAppend(Object eventObject, Connection connection,
PreparedStatement insertStatement) throws Throwable {
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/SQLBuilder.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/SQLBuilder.java
new file mode 100644
index 0000000..9c197a0
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/SQLBuilder.java
@@ -0,0 +1,47 @@
+package ch.qos.logback.classic.db;
+
+import ch.qos.logback.classic.db.names.*;
+
+/**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-16
+ */
+public class SQLBuilder {
+
+ static String buildInsertPropertiesSQL(DBNameResolver dbNameResolver) {
+ StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
+ sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT_PROPERTY)).append(" (");
+ sqlBuilder.append(dbNameResolver.getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName.EVENT_ID)).append(",");
+ sqlBuilder.append(dbNameResolver.getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName.MAPPED_KEY)).append(",");
+ sqlBuilder.append(dbNameResolver.getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName.MAPPED_VALUE)).append(") ");
+ sqlBuilder.append("VALUES (?, ?, ?)");
+ return sqlBuilder.toString();
+ }
+
+ static String buildInsertExceptionSQL(DBNameResolver dbNameResolver) {
+ StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
+ sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT_EXCEPTION)).append(" (");
+ sqlBuilder.append(dbNameResolver.getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName.EVENT_ID)).append(",");
+ sqlBuilder.append(dbNameResolver.getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName.I)).append(",");
+ sqlBuilder.append(dbNameResolver.getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName.TRACE_LINE)).append(") ");
+ sqlBuilder.append("VALUES (?, ?, ?)");
+ return sqlBuilder.toString();
+ }
+
+ static String buildInsertSQL(DBNameResolver dbNameResolver) {
+ StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
+ sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT)).append(" (");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.TIMESTMP)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.FORMATTED_MESSAGE)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.LOGGER_NAME)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.LEVEL_STRING)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.THREAD_NAME)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.REFERENCE_FLAG)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.CALLER_FILENAME)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.CALLER_CLASS)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.CALLER_METHOD)).append(", ");
+ sqlBuilder.append(dbNameResolver.getLoggingEventColumnName(LoggingEventColumnName.CALLER_LINE)).append(") ");
+ sqlBuilder.append(" VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?, ?)");
+ return sqlBuilder.toString();
+ }
+}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/CustomDBNameResolver.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/CustomDBNameResolver.java
new file mode 100644
index 0000000..0880aa5
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/CustomDBNameResolver.java
@@ -0,0 +1,118 @@
+package ch.qos.logback.classic.db.names;
+
+import java.util.EnumMap;
+import java.util.Map;
+
+/**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-16
+ */
+public class CustomDBNameResolver implements DBNameResolver {
+
+ private final DBNameResolver defaultDbNameResolver = new DefaultDBNameResolver();
+ private final Map<TableName, String> tableNameOverrides = new EnumMap<TableName, String>(TableName.class);
+ private final Map<LoggingEventColumnName, String> leColumnNameOverrides = new EnumMap<LoggingEventColumnName, String>(LoggingEventColumnName.class);
+ private final Map<LoggingEventPropertyColumnName, String> lePropertyColumnNameOverrides = new EnumMap<LoggingEventPropertyColumnName, String>(LoggingEventPropertyColumnName.class);
+ private final Map<LoggingEventExceptionColumnName, String> leExceptionColumnNameOverrides = new EnumMap<LoggingEventExceptionColumnName, String>(LoggingEventExceptionColumnName.class);
+
+ public String getTableName(TableName tableName) {
+ if (tableNameOverrides.get(tableName) != null)
+ return tableNameOverrides.get(tableName);
+ return defaultDbNameResolver.getTableName(tableName);
+ }
+
+ public String getLoggingEventColumnName(LoggingEventColumnName columnName) {
+ if (leColumnNameOverrides.get(columnName) != null)
+ return leColumnNameOverrides.get(columnName);
+ return defaultDbNameResolver.getLoggingEventColumnName(columnName);
+ }
+
+ public String getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName columnName) {
+ if (lePropertyColumnNameOverrides.get(columnName) != null)
+ return lePropertyColumnNameOverrides.get(columnName);
+ return defaultDbNameResolver.getLoggingEventPropertyColumnName(columnName);
+ }
+
+ public String getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName columnName) {
+ if (leExceptionColumnNameOverrides.get(columnName) != null)
+ return leExceptionColumnNameOverrides.get(columnName);
+ return defaultDbNameResolver.getLoggingEventExceptionColumnName(columnName);
+ }
+
+ public void setLoggingEventTableName(String tableName) {
+ tableNameOverrides.put(TableName.LOGGING_EVENT, tableName);
+ }
+
+ public void setLoggingEventPropertyTableName(String tableName) {
+ tableNameOverrides.put(TableName.LOGGING_EVENT_PROPERTY, tableName);
+ }
+
+ public void setLoggingEventExceptionTableName(String tableName) {
+ tableNameOverrides.put(TableName.LOGGING_EVENT_EXCEPTION, tableName);
+ }
+
+ public void setLoggingEventTimestmpColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.TIMESTMP, columnName);
+ }
+
+ public void setLoggingEventFormattedMessageColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.FORMATTED_MESSAGE, columnName);
+ }
+
+ public void setLoggingEventLoggerNameColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.LOGGER_NAME, columnName);
+ }
+
+ public void setLoggingEventLevelStringColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.LEVEL_STRING, columnName);
+ }
+
+ public void setLoggingEventThreadNameColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.THREAD_NAME, columnName);
+ }
+
+ public void setLoggingEventReferenceFlagColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.REFERENCE_FLAG, columnName);
+ }
+
+ public void setLoggingEventCallerFilenameColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.CALLER_FILENAME, columnName);
+ }
+
+ public void setLoggingEventCallerClassColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.CALLER_CLASS, columnName);
+ }
+
+ public void setLoggingEventCallerMethodColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.CALLER_METHOD, columnName);
+ }
+
+ public void setLoggingEventCallerLineColumnName(String columnName) {
+ leColumnNameOverrides.put(LoggingEventColumnName.CALLER_LINE, columnName);
+ }
+
+ public void setLoggingEventPropertyEventIdColumnName(String columnName) {
+ lePropertyColumnNameOverrides.put(LoggingEventPropertyColumnName.EVENT_ID, columnName);
+ }
+
+ public void setMappedKeyColumnName(String columnName) {
+ lePropertyColumnNameOverrides.put(LoggingEventPropertyColumnName.MAPPED_KEY, columnName);
+ }
+
+ public void setMappedValueColumnName(String columnName) {
+ lePropertyColumnNameOverrides.put(LoggingEventPropertyColumnName.MAPPED_VALUE, columnName);
+ }
+
+ public void setLoggingEventExceptionEventIdColumnName(String columnName) {
+ leExceptionColumnNameOverrides.put(LoggingEventExceptionColumnName.EVENT_ID, columnName);
+ }
+
+ public void setLoggingEventExceptionIColumnName(String columnName) {
+ leExceptionColumnNameOverrides.put(LoggingEventExceptionColumnName.I, columnName);
+ }
+
+ public void setLoggingEventExceptionTraceLineColumnName(String columnName) {
+ leExceptionColumnNameOverrides.put(LoggingEventExceptionColumnName.TRACE_LINE, columnName);
+ }
+
+}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DBNameResolver.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DBNameResolver.java
new file mode 100644
index 0000000..2647b00
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DBNameResolver.java
@@ -0,0 +1,13 @@
+package ch.qos.logback.classic.db.names;
+
+public interface DBNameResolver {
+
+ String getTableName(TableName tableName);
+
+ String getLoggingEventColumnName(LoggingEventColumnName columnName);
+
+ String getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName columnName);
+
+ String getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName columnName);
+
+}
\ No newline at end of file
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DefaultDBNameResolver.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DefaultDBNameResolver.java
new file mode 100644
index 0000000..fbf17cb
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DefaultDBNameResolver.java
@@ -0,0 +1,23 @@
+package ch.qos.logback.classic.db.names;
+
+/**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-16
+ */
+public class DefaultDBNameResolver implements DBNameResolver {
+ public String getTableName(TableName tableName) {
+ return tableName.name().toLowerCase();
+ }
+
+ public String getLoggingEventColumnName(LoggingEventColumnName columnName) {
+ return columnName.name().toLowerCase();
+ }
+
+ public String getLoggingEventPropertyColumnName(LoggingEventPropertyColumnName columnName) {
+ return columnName.name().toLowerCase();
+ }
+
+ public String getLoggingEventExceptionColumnName(LoggingEventExceptionColumnName columnName) {
+ return columnName.name().toLowerCase();
+ }
+}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventColumnName.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventColumnName.java
new file mode 100644
index 0000000..bc25465
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventColumnName.java
@@ -0,0 +1,20 @@
+package ch.qos.logback.classic.db.names;
+
+/**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-15
+ */
+public enum LoggingEventColumnName {
+
+ TIMESTMP,
+ FORMATTED_MESSAGE,
+ LOGGER_NAME,
+ LEVEL_STRING,
+ THREAD_NAME,
+ REFERENCE_FLAG,
+ CALLER_FILENAME,
+ CALLER_CLASS,
+ CALLER_METHOD,
+ CALLER_LINE
+
+}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventExceptionColumnName.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventExceptionColumnName.java
new file mode 100644
index 0000000..2e12f1c
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventExceptionColumnName.java
@@ -0,0 +1,13 @@
+package ch.qos.logback.classic.db.names;
+
+/**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-15
+ */
+public enum LoggingEventExceptionColumnName {
+
+ EVENT_ID,
+ I,
+ TRACE_LINE
+
+}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventPropertyColumnName.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventPropertyColumnName.java
new file mode 100644
index 0000000..f123e2d
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/LoggingEventPropertyColumnName.java
@@ -0,0 +1,13 @@
+package ch.qos.logback.classic.db.names;
+
+/**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-15
+ */
+public enum LoggingEventPropertyColumnName {
+
+ EVENT_ID,
+ MAPPED_KEY,
+ MAPPED_VALUE
+
+}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/db/names/TableName.java b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/TableName.java
new file mode 100644
index 0000000..9995361
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/db/names/TableName.java
@@ -0,0 +1,13 @@
+package ch.qos.logback.classic.db.names;
+
+/**
+ * @author Tomasz Nurkiewicz
+ * @since 2010-03-15
+ */
+public enum TableName {
+
+ LOGGING_EVENT,
+ LOGGING_EVENT_PROPERTY,
+ LOGGING_EVENT_EXCEPTION
+
+}
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=ffeda045d43d98eeb6bb420e…
http://github.com/ceki/logback/commit/ffeda045d43d98eeb6bb420e87df9e726b9d3…
commit ffeda045d43d98eeb6bb420e87df9e726b9d34f7
Author: Tomasz Nurkiewicz <nurkiewicz(a)gmail.com>
Date: Mon Mar 15 23:48:11 2010 +0100
Ignore IntelliJ IDEA files
diff --git a/.gitignore b/.gitignore
index 6b74944..7e52e85 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,6 @@
target
.classpath
.project
-*~
\ No newline at end of file
+.idea
+*~
+*.iml
\ No newline at end of file
-----------------------------------------------------------------------
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-96-gea6065c
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via ea6065ca315b78c7e0eb40d3fe85faec6441a834 (commit)
from 821d05c90831d9f07d00bbc3f004561c37c1a0c0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=ea6065ca315b78c7e0eb40d3…
http://github.com/ceki/logback/commit/ea6065ca315b78c7e0eb40d3fe85faec6441a…
commit ea6065ca315b78c7e0eb40d3fe85faec6441a834
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 21:49:40 2010 +0100
- have all tests pass
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java
index c0321f0..268edea 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java
@@ -41,7 +41,7 @@ public class Parser<E> extends ContextAwareBase {
try {
TokenStream ts = new TokenStream(pattern, escapeUtil);
this.tokenList = ts.tokenize();
- } catch (NullPointerException npe) {
+ } catch (IllegalArgumentException npe) {
throw new ScanException("Failed to initialize Parser", npe);
}
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java
index d5080d5..b0dc881 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java
@@ -20,24 +20,29 @@ import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.pattern.util.IEscapeUtil;
import ch.qos.logback.core.pattern.util.RegularEscapeUtil;
-
-
/**
- * <p>Return a steady stream of tokens. <p/>
+ * <p>
+ * Return a steady stream of tokens.
+ * <p/>
*
- * <p>The returned tokens are one of:
- * LITERAL, '%', FORMAT_MODIFIER, KEYWWORD, OPTION, LEFT_PARENTHESIS, and
- * RIGHT_PARENTHESIS.</p>
+ * <p>
+ * The returned tokens are one of: LITERAL, '%', FORMAT_MODIFIER, KEYWWORD,
+ * OPTION, LEFT_PARENTHESIS, and RIGHT_PARENTHESIS.
+ * </p>
*
- * <p>The '\' character is used as escape. It can be used to escape '_', '%', '(' and
- * '('.<p>
+ * <p>
+ * The '\' character is used as escape. It can be used to escape '_', '%', '('
+ * and '('.
+ * <p>
*
- * <p>Note that there is no EOS token returned.</p>
+ * <p>
+ * Note that there is no EOS token returned.
+ * </p>
*/
class TokenStream {
private static final char ESCAPE_CHAR = '\\';
- private static final char PERCENT_CHAR = CoreConstants.PERCENT_CHAR;
+ private static final char PERCENT_CHAR = CoreConstants.PERCENT_CHAR;
private static final char CURLY_LEFT = '{';
private static final char CURLY_RIGHT = '}';
@@ -49,7 +54,7 @@ class TokenStream {
final String pattern;
final int patternLength;
final IEscapeUtil escapeUtil;
-
+
int state = LITERAL_STATE;
int pointer = 0;
@@ -57,10 +62,11 @@ class TokenStream {
TokenStream(String pattern) {
this(pattern, new RegularEscapeUtil());
}
-
+
TokenStream(String pattern, IEscapeUtil escapeUtil) {
- if(pattern == null || pattern.length() == 0) {
- throw new NullPointerException("null or empty pattern string not allowed");
+ if (pattern == null || pattern.length() == 0) {
+ throw new IllegalArgumentException(
+ "null or empty pattern string not allowed");
}
this.pattern = pattern;
patternLength = pattern.length();
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java
index 60457c8..826194a 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java
@@ -55,6 +55,7 @@ abstract public class AbstractAppenderTest<E> {
@Test
public void testNoStart() {
Appender<E> appender = getAppender();
+ appender.setContext(context);
appender.setName("doh");
// is null OK?
appender.doAppend(null);
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
index 74bdd80..a4e5063 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
@@ -61,9 +61,7 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
@Override
public Appender<Object> getAppender() {
- ConsoleAppender<Object> ca = new ConsoleAppender<Object>();
- ca.setContext(context);
- return ca;
+ return new ConsoleAppender<Object>();
}
protected Appender<Object> getConfiguredAppender() {
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
index 0c3f5d1..d3022ed 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
@@ -19,26 +19,23 @@ import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.List;
-import java.util.Random;
import org.junit.Test;
import ch.qos.logback.core.Appender;
-import ch.qos.logback.core.Context;
-import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.encoder.DummyEncoder;
import ch.qos.logback.core.encoder.NopEncoder;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusManager;
+import ch.qos.logback.core.testUtil.RandomUtil;
import ch.qos.logback.core.util.CoreTestConstants;
import ch.qos.logback.core.util.FileUtil;
import ch.qos.logback.core.util.StatusPrinter;
public class FileAppenderTest extends AbstractAppenderTest<Object> {
- int diff = new Random().nextInt(100);
- Context context = new ContextBase();
+ int diff = RandomUtil.getPositiveInt();
protected Appender<Object> getAppender() {
return new FileAppender<Object>();
diff --git a/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/TokenStreamTest.java b/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/TokenStreamTest.java
index 4ce47ce..d737a56 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/TokenStreamTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/TokenStreamTest.java
@@ -13,9 +13,8 @@
*/
package ch.qos.logback.core.pattern.parser;
-
-
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
@@ -24,14 +23,15 @@ import org.junit.Test;
import ch.qos.logback.core.pattern.util.AlmostAsIsEscapeUtil;
-public class TokenStreamTest {
-
+public class TokenStreamTest {
@Test
public void testEmpty() throws ScanException {
- List tl = new TokenStream("").tokenize();
- List witness = new ArrayList();
- assertEquals(witness, tl);
+ try {
+ new TokenStream("").tokenize();
+ fail("empty string not allowed");
+ } catch (IllegalArgumentException e) {
+ }
}
@Test
@@ -330,8 +330,8 @@ public class TokenStreamTest {
@Test
public void testWindowsLikeBackSlashes() throws ScanException {
{
- List tl = new TokenStream("c:\\hello\\world.%i", new AlmostAsIsEscapeUtil())
- .tokenize();
+ List tl = new TokenStream("c:\\hello\\world.%i",
+ new AlmostAsIsEscapeUtil()).tokenize();
List<Token> witness = new ArrayList<Token>();
witness.add(new Token(Token.LITERAL, "c:\\hello\\world."));
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java
index ecc934b..94e8ca5 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java
@@ -21,6 +21,7 @@ import org.junit.runners.Suite;
TimeBasedRollingTest.class, TimeBasedRollingWithArchiveRemovalTest.class,
MultiThreadedRollingTest.class,
SizeAndTimeBasedFNATP_Test.class,
+ RollingFileAppenderTest.class,
ch.qos.logback.core.rolling.helper.PackageTest.class })
public class PackageTest {
}
-----------------------------------------------------------------------
Summary of changes:
.../ch/qos/logback/core/pattern/parser/Parser.java | 2 +-
.../logback/core/pattern/parser/TokenStream.java | 34 +++++++++++--------
.../core/appender/AbstractAppenderTest.java | 1 +
.../logback/core/appender/ConsoleAppenderTest.java | 4 +--
.../logback/core/appender/FileAppenderTest.java | 7 +---
.../core/pattern/parser/TokenStreamTest.java | 18 +++++-----
.../ch/qos/logback/core/rolling/PackageTest.java | 1 +
7 files changed, 35 insertions(+), 32 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-95-g821d05c
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 821d05c90831d9f07d00bbc3f004561c37c1a0c0 (commit)
from e13257d75b2b4439c4c98b85e25a76611080a3d4 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=821d05c90831d9f07d00bbc3…
http://github.com/ceki/logback/commit/821d05c90831d9f07d00bbc3f004561c37c1a…
commit 821d05c90831d9f07d00bbc3f004561c37c1a0c0
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 21:31:57 2010 +0100
- additional tests and minor changes
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java b/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
index 99a4a58..b9785c7 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
@@ -37,14 +37,14 @@ public class EnsureExceptionHandling implements
*
*/
public void process(Converter<ILoggingEvent> head) {
+ if(head == null) {
+ // this should never happen
+ throw new IllegalArgumentException("cannot process empty chain");
+ }
if (!chainHandlesThrowable(head)) {
Converter<ILoggingEvent> tail = ConverterUtil.findTail(head);
Converter<ILoggingEvent> exConverter = new ExtendedThrowableProxyConverter();
- if (tail == null) {
- head = exConverter;
- } else {
- tail.setNext(exConverter);
- }
+ tail.setNext(exConverter);
}
}
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
index 4c8cf51..24dc122 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java
@@ -19,19 +19,17 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
-import java.util.Random;
import org.junit.Test;
import org.slf4j.MDC;
-import ch.qos.logback.classic.util.CopyOnInheritThreadLocal;
-import ch.qos.logback.classic.util.LogbackMDCAdapter;
+import ch.qos.logback.core.testUtil.RandomUtil;
public class LogbackMDCAdapterTest {
final static String A_SUFFIX = "A_SUFFIX";
- int diff = new Random().nextInt();
+ int diff = RandomUtil.getPositiveInt();
/**
* Test that CopyOnInheritThreadLocal does not barf when the
diff --git a/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java b/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java
index c163434..2e3c698 100644
--- a/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java
+++ b/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java
@@ -15,8 +15,6 @@ package org.slf4j.impl;
import static org.junit.Assert.assertEquals;
-import java.util.Random;
-
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -28,11 +26,12 @@ import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.util.ContextInitializer;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusManager;
+import ch.qos.logback.core.testUtil.RandomUtil;
import ch.qos.logback.core.util.StatusPrinter;
public class RecursiveInitializationTest {
- int diff = new Random().nextInt();
+ int diff = RandomUtil.getPositiveInt();
@Before
public void setUp() throws Exception {
diff --git a/logback-classic/src/test/java/org/slf4j/impl/RecursiveLBAppender.java b/logback-classic/src/test/java/org/slf4j/impl/RecursiveLBAppender.java
index c444d9c..7eeb7a7 100644
--- a/logback-classic/src/test/java/org/slf4j/impl/RecursiveLBAppender.java
+++ b/logback-classic/src/test/java/org/slf4j/impl/RecursiveLBAppender.java
@@ -15,7 +15,6 @@ package org.slf4j.impl;
import java.util.ArrayList;
import java.util.List;
-import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,6 +22,7 @@ import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
+import ch.qos.logback.core.testUtil.RandomUtil;
public class RecursiveLBAppender extends AppenderBase<ILoggingEvent> {
@@ -41,7 +41,7 @@ public class RecursiveLBAppender extends AppenderBase<ILoggingEvent> {
@Override
public void start() {
- int diff = new Random().nextInt();
+ int diff = RandomUtil.getPositiveInt();
Logger logger = LoggerFactory.getLogger("ResursiveLBAppender"+diff);
logger.info("testing");
super.start();
diff --git a/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java b/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
index 9946454..8b7661d 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
@@ -13,6 +13,8 @@
*/
package ch.qos.logback.core;
+import java.util.Arrays;
+
import ch.qos.logback.core.joran.spi.ConsoleTarget;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.WarnStatus;
@@ -41,6 +43,7 @@ public class ConsoleAppender<E> extends OutputStreamAppender<E> {
public void setTarget(String value) {
ConsoleTarget t = ConsoleTarget.findByName(value.trim());
if (t == null) {
+ System.out.println("**************");
targetWarn(value);
} else {
target = t;
@@ -58,8 +61,10 @@ public class ConsoleAppender<E> extends OutputStreamAppender<E> {
}
private void targetWarn(String val) {
- Status status = new WarnStatus("[" + val + " should be in " + ConsoleTarget.values(), this);
- status.add(new WarnStatus("Using previously set target, System.out by default.", this));
+ Status status = new WarnStatus("[" + val + "] should be one of "
+ + Arrays.toString(ConsoleTarget.values()), this);
+ status.add(new WarnStatus(
+ "Using previously set target, System.out by default.", this));
addStatus(status);
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/ConverterUtil.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/ConverterUtil.java
index 19c8628..03f65e8 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/ConverterUtil.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/ConverterUtil.java
@@ -36,15 +36,15 @@ public class ConverterUtil {
public static<E> Converter<E> findTail(Converter<E> head) {
- Converter<E> c = head;
- while (c != null) {
- Converter<E> next = c.getNext();
+ Converter<E> p = head;
+ while (p != null) {
+ Converter<E> next = p.getNext();
if (next == null) {
break;
} else {
- c = next;
+ p = next;
}
}
- return c;
+ return p;
}
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/FormatInfo.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/FormatInfo.java
index a424361..1f6c9a5 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/FormatInfo.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/FormatInfo.java
@@ -50,7 +50,7 @@ public class FormatInfo {
*/
public static FormatInfo valueOf(String str) throws IllegalArgumentException {
if (str == null) {
- new NullPointerException("Argument cannot be null");
+ throw new NullPointerException("Argument cannot be null");
}
FormatInfo fi = new FormatInfo();
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java
index 0210484..6a76153 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java
@@ -71,7 +71,11 @@ abstract public class PatternLayoutBase<E> extends LayoutBase<E> {
}
public void start() {
- try {
+ if(pattern == null || pattern.length() == 0) {
+ addError("Empty or null pattern.");
+ return;
+ }
+ try {
Parser<E> p = new Parser<E>(pattern);
if (getContext() != null) {
p.setContext(getContext());
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java
index 8e9abff..d5080d5 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java
@@ -59,8 +59,8 @@ class TokenStream {
}
TokenStream(String pattern, IEscapeUtil escapeUtil) {
- if(pattern == null) {
- throw new NullPointerException("null pattern string not allowed");
+ if(pattern == null || pattern.length() == 0) {
+ throw new NullPointerException("null or empty pattern string not allowed");
}
this.pattern = pattern;
patternLength = pattern.length();
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/util/RegularEscapeUtil.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/util/RegularEscapeUtil.java
index d4feaa0..b4a6295 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/util/RegularEscapeUtil.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/util/RegularEscapeUtil.java
@@ -43,7 +43,7 @@ public class RegularEscapeUtil implements IEscapeUtil {
break;
default:
String commaSeperatedEscapeChars = formatEscapeCharsForListing(escapeChars);
- new IllegalArgumentException("Illegal char '" + next + " at column "
+ throw new IllegalArgumentException("Illegal char '" + next + " at column "
+ pointer + ". Only \\\\, \\_" + commaSeperatedEscapeChars
+ ", \\t, \\n, \\r combinations are allowed as escape characters.");
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java
index 61b0826..60457c8 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java
@@ -23,6 +23,7 @@ import ch.qos.logback.core.Appender;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.status.StatusChecker;
+import ch.qos.logback.core.util.StatusPrinter;
@@ -31,7 +32,8 @@ abstract public class AbstractAppenderTest<E> {
abstract protected Appender<E> getAppender();
abstract protected Appender<E> getConfiguredAppender();
-
+ Context context = new ContextBase();
+
@Test
public void testNewAppender() {
// new appenders should be inactive
@@ -53,13 +55,11 @@ abstract public class AbstractAppenderTest<E> {
@Test
public void testNoStart() {
Appender<E> appender = getAppender();
- Context context = new ContextBase();
- appender.setContext(context);
appender.setName("doh");
// is null OK?
appender.doAppend(null);
StatusChecker checker = new StatusChecker(context.getStatusManager());
- //StatusPrinter.print(context.getStatusManager());
+ StatusPrinter.print(context);
assertTrue(checker.containsMatch("Attempted to append to non started appender \\[doh\\]."));
}
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
index e8e015c..74bdd80 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
@@ -30,14 +30,15 @@ import ch.qos.logback.core.encoder.DummyEncoder;
import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.encoder.NopEncoder;
import ch.qos.logback.core.layout.DummyLayout;
-
+import ch.qos.logback.core.status.Status;
+import ch.qos.logback.core.status.StatusChecker;
+import ch.qos.logback.core.util.StatusPrinter;
public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
XTeeOutputStream tee;
PrintStream original;
-
@Before
public void setUp() throws Exception {
original = System.out;
@@ -45,10 +46,10 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
// collect them so that the output can be compared against
// some expected output data
// tee = new TeeOutputStream(original);
-
+
// keep the console quiet
tee = new XTeeOutputStream(null);
-
+
// redirect System.out to tee
System.setOut(new PrintStream(tee));
}
@@ -60,8 +61,10 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
@Override
public Appender<Object> getAppender() {
- return new ConsoleAppender<Object>();
- }
+ ConsoleAppender<Object> ca = new ConsoleAppender<Object>();
+ ca.setContext(context);
+ return ca;
+ }
protected Appender<Object> getConfiguredAppender() {
ConsoleAppender<Object> ca = new ConsoleAppender<Object>();
@@ -78,7 +81,7 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
ca.doAppend(new Object());
assertEquals(DummyLayout.DUMMY, tee.toString());
}
-
+
@org.junit.Test
public void testOpen() {
ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
@@ -88,9 +91,10 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
ca.start();
ca.doAppend(new Object());
ca.stop();
- assertEquals("open"+CoreConstants.LINE_SEPARATOR+DummyLayout.DUMMY, tee.toString());
+ assertEquals("open" + CoreConstants.LINE_SEPARATOR + DummyLayout.DUMMY, tee
+ .toString());
}
-
+
@Test
public void testClose() {
ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
@@ -114,16 +118,15 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
ca.setEncoder(encoder);
ca.start();
ca.doAppend("a");
- assertEquals("a"+CoreConstants.LINE_SEPARATOR, tee.toString());
-
+ assertEquals("a" + CoreConstants.LINE_SEPARATOR, tee.toString());
+
XTeeOutputStream newTee = new XTeeOutputStream(null);
System.setOut(new PrintStream(newTee));
ca.doAppend("b");
- assertEquals("b"+CoreConstants.LINE_SEPARATOR, newTee.toString());
+ assertEquals("b" + CoreConstants.LINE_SEPARATOR, newTee.toString());
}
-
- @Test
+ @Test
public void testUTF16BE() throws UnsupportedEncodingException {
ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
DummyEncoder<Object> dummyEncoder = new DummyEncoder<Object>();
@@ -135,5 +138,21 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
assertEquals(DummyLayout.DUMMY, new String(tee.toByteArray(), encodingName));
}
+ @Test
+ public void wrongTarget() {
+ ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
+ EchoEncoder<Object> encoder = new EchoEncoder<Object>();
+ System.out.println("xxx");
+ ca.setTarget("foo");
+ ca.setEncoder(encoder);
+ ca.start();
+ ca.doAppend("a");
+ StatusChecker checker = new StatusChecker(context);
+ //21:28:01,246 + WARN in ch.qos.logback.core.ConsoleAppender[null] - [foo] should be one of [SystemOut, SystemErr]
+ //21:28:01,246 |-WARN in ch.qos.logback.core.ConsoleAppender[null] - Using previously set target, System.out by default.
+
+ checker.containsMatch(Status.ERROR, "\\[foo\\] should be one of \\[SystemOut, SystemErr\\]");
+
+ }
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java b/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java
index 8236b9c..a659adb 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java
@@ -79,12 +79,28 @@ abstract public class AbstractPatternLayoutBaseTest<E> {
PatternLayoutBase<E> plb = getPatternLayoutBase();
Context context = new ContextBase();
plb.setContext(context);
+ plb.setPattern(null);
plb.start();
String s = plb.doLayout(getEventObject());
assertEquals("", s);
StatusChecker checker = new StatusChecker(context.getStatusManager());
- //StatusPrinter.print(context.getStatusManager());
- assertTrue(checker.containsMatch("Failed to parse pattern \"null\""));
+ StatusPrinter.print(context);
+ assertTrue(checker.containsMatch("Empty or null pattern."));
+ }
+
+ @Test
+ public void testEmptyPattern() {
+ //System.out.println("testNullPattern");
+ PatternLayoutBase<E> plb = getPatternLayoutBase();
+ Context context = new ContextBase();
+ plb.setContext(context);
+ plb.setPattern("");
+ plb.start();
+ String s = plb.doLayout(getEventObject());
+ assertEquals("", s);
+ StatusChecker checker = new StatusChecker(context.getStatusManager());
+ StatusPrinter.print(context);
+ assertTrue(checker.containsMatch("Empty or null pattern."));
}
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/ParserTest.java b/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/ParserTest.java
index e9d01e9..26ea464 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/ParserTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/ParserTest.java
@@ -14,6 +14,7 @@
package ch.qos.logback.core.pattern.parser;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
@@ -242,4 +243,15 @@ public class ParserTest {
assertEquals(witness, t);
}
}
+
+ @Test
+ public void empty() {
+ try {
+ Parser p = new Parser("");
+ p.parse();
+ fail("");
+ } catch(ScanException e) {
+
+ }
+ }
}
\ No newline at end of file
-----------------------------------------------------------------------
Summary of changes:
.../classic/pattern/EnsureExceptionHandling.java | 10 ++--
.../classic/util/LogbackMDCAdapterTest.java | 6 +--
.../slf4j/impl/RecursiveInitializationTest.java | 5 +-
.../java/org/slf4j/impl/RecursiveLBAppender.java | 4 +-
.../java/ch/qos/logback/core/ConsoleAppender.java | 9 +++-
.../ch/qos/logback/core/pattern/ConverterUtil.java | 10 ++--
.../ch/qos/logback/core/pattern/FormatInfo.java | 2 +-
.../logback/core/pattern/PatternLayoutBase.java | 6 ++-
.../logback/core/pattern/parser/TokenStream.java | 4 +-
.../core/pattern/util/RegularEscapeUtil.java | 2 +-
.../core/appender/AbstractAppenderTest.java | 8 ++--
.../logback/core/appender/ConsoleAppenderTest.java | 47 ++++++++++++++------
.../parser/AbstractPatternLayoutBaseTest.java | 20 ++++++++-
.../logback/core/pattern/parser/ParserTest.java | 12 +++++
14 files changed, 99 insertions(+), 46 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
Hello all,
At present time, a TurboFilter cannot modify the contents of an
event. This decision was made in order to avoid the cost of
constructing a LoggingEvent (about 20 nanoseconds) which would be
later tossed out by the logger-level filter. 20 ns is not much but in
absolute terms but considering that invoking the logger-level filter
costs 3ns, 20ns is quite a steep price to pay in relative terms on
every logger printing method invocation (for disabled logger
requests).
For the case where there are no turbo filters installed, performance
would remain quasi-identical. For the case with one or more turbo
filters installed, there would be an extra cost of 20ns. However,
since invoking even the most rudimentary turbo filter costs 40ns or
more, I think the 20ns overhead is well spent considering that it
would allow turbo filters to transform events.
Unfortunately, the TurboFilter interface would need to be modified
breaking compatibility with existing turbo filters.
Comments?
--
Ceki
2
4

18 Mar '10
Example 7.5 Is Not Thread-Safe
------------------------------
Key: LBSITE-36
URL: http://jira.qos.ch/browse/LBSITE-36
Project: logback-site
Issue Type: Bug
Components: Documentation
Affects Versions: unspecified
Reporter: john jimenez
Assignee: Logback dev list
Example 7.5 in
http://logback.qos.ch/manual/mdc.html
is not thread-safe because
userRegistered
is declared as a global variable.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
3
5

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-94-ge13257d
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via e13257d75b2b4439c4c98b85e25a76611080a3d4 (commit)
from 499abbba89771332844fa84262e77277f66e8932 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=e13257d75b2b4439c4c98b85…
http://github.com/ceki/logback/commit/e13257d75b2b4439c4c98b85e25a76611080a…
commit e13257d75b2b4439c4c98b85e25a76611080a3d4
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 19:08:24 2010 +0100
Fixed http://jira.qos.ch/browse/LBSITE-36
diff --git a/logback-examples/src/main/java/chapters/mdc/UserServletFilter.java b/logback-examples/src/main/java/chapters/mdc/UserServletFilter.java
index cc9db4c..532517b 100644
--- a/logback-examples/src/main/java/chapters/mdc/UserServletFilter.java
+++ b/logback-examples/src/main/java/chapters/mdc/UserServletFilter.java
@@ -23,38 +23,21 @@ import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
import org.slf4j.MDC;
/**
* A simple servlet filter that puts the username
- * found either in the Principle or as a session attribute
- * in the MDC.
+ * found either in the Principal.
*
- * The value is removed from the MDC once the request has been
+ * <p> The value is removed from the MDC once the request has been
* fully processed.
*
- * To be used, add the following lines to a web.xml file
- *
- * <filter>
- * <filter-name>User Servlet Filter</filter-name>
- * <filter-class>
- * chapters.mdc.UserServletFilter
- * </filter-class>
- * </filter>
- * <filter-mapping>
- * <filter-name>User Servlet Filter</filter-name>
- * <url-pattern>/*</url-pattern>
- * </filter-mapping>
- *
* @author Sébastien Pennec
*/
public class UserServletFilter implements Filter {
- boolean userRegistered = false;
-
- private final String userKey = "username";
+ private final String USER_KEY = "username";
public void destroy() {
}
@@ -62,25 +45,22 @@ public class UserServletFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
+ boolean successfulRegistration = false;
HttpServletRequest req = (HttpServletRequest) request;
Principal principal = req.getUserPrincipal();
- // Please note that we could have also used a cookie to
- // retreive the user name
+ // Please note that we also could have used a cookie to
+ // retrieve the user name
if (principal != null) {
String username = principal.getName();
- registerUsername(username);
- } else {
- HttpSession session = req.getSession();
- String username = (String)session.getAttribute(userKey);
- registerUsername(username);
+ successfulRegistration = registerUsername(username);
}
try {
chain.doFilter(request, response);
} finally {
- if (userRegistered) {
- MDC.remove(userKey);
+ if (successfulRegistration) {
+ MDC.remove(USER_KEY);
}
}
}
@@ -88,11 +68,18 @@ public class UserServletFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
- private void registerUsername(String username) {
+ /**
+ * Register the user in the MDC under USER_KEY.
+ *
+ * @param username
+ * @return true id the user can be successfully registered
+ */
+ private boolean registerUsername(String username) {
if (username != null && username.trim().length() > 0) {
- MDC.put(userKey, username);
- userRegistered = true;
+ MDC.put(USER_KEY, username);
+ return true;
}
+ return false;
}
}
diff --git a/logback-site/src/site/pages/manual/mdc.html b/logback-site/src/site/pages/manual/mdc.html
index 43e0c1a..6cdfc59 100644
--- a/logback-site/src/site/pages/manual/mdc.html
+++ b/logback-site/src/site/pages/manual/mdc.html
@@ -550,9 +550,7 @@ import org.slf4j.MDC;
public class UserServletFilter implements Filter {
- boolean userRegistered = false;
-
- private final String userKey = "username";
+ private final String USER_KEY = "username";
public void destroy() {
}
@@ -560,26 +558,23 @@ public class UserServletFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
- HttpServletRequest req = (HttpServletRequest) request;
-
+ boolean successfulRegistration = false;
+
+ HttpServletRequest req = (HttpServletRequest) request;
Principal principal = req.getUserPrincipal();
// Please note that we could have also used a cookie to
// retrieve the user name
if (principal != null) {
String username = principal.getName();
- registerUsername(username);
- } else {
- HttpSession session = req.getSession();
- String username = (String)session.getAttribute(userKey);
- registerUsername(username);
- }
-
+ successfulRegistration = registerUsername(username);
+ }
+
try {
chain.doFilter(request, response);
} finally {
- if (userRegistered) {
- MDC.remove(userKey);
+ if (successfulRegistration) {
+ MDC.remove(USER_KEY);
}
}
}
@@ -587,21 +582,27 @@ public class UserServletFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
- private void registerUsername(String username) {
+
+ /**
+ * Register the user in the MDC under USER_KEY.
+ *
+ * @param username
+ * @return true id the user can be successfully registered
+ */
+ private boolean registerUsername(String username) {
if (username != null && username.trim().length() > 0) {
- MDC.put(userKey, username);
- userRegistered = true;
+ MDC.put(USER_KEY, username);
+ return true;
}
+ return false;
}
}</pre>
<p>When the filter's <code>doFilter()</code> method is called, it
first looks for a <code>java.security.Principal</code> object in the
request. This object contains the name of the currently
- authenticated user. In case the user principal is not set, the
- filter looks for a session attribute matching a given key (here
- <em>username</em>). If a user information is found, it is
- registered in the <code>MDC</code>.
+ authenticated user. If a user information is found, it is registered
+ in the <code>MDC</code>.
</p>
<p>Once the filter chain has completed, the filter removes the user
diff --git a/logback-site/src/site/pages/news.html b/logback-site/src/site/pages/news.html
index 8d5fb90..644d52a 100644
--- a/logback-site/src/site/pages/news.html
+++ b/logback-site/src/site/pages/news.html
@@ -131,6 +131,10 @@
reported by Tom SH Liu.
</p>
+ <p>Fixed <a
+ href="http://jira.qos.ch/browse/LBSITE-36">LBSITE-36</a> reported
+ by John Jimenez.</p>
+
<hr width="80%" align="center" />
<!-- ======================================================================== -->
-----------------------------------------------------------------------
Summary of changes:
.../main/java/chapters/mdc/UserServletFilter.java | 51 +++++++------------
logback-site/src/site/pages/manual/mdc.html | 43 ++++++++--------
logback-site/src/site/pages/news.html | 4 ++
3 files changed, 45 insertions(+), 53 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
FlushingPolicy
--------------
Key: LBCORE-93
URL: http://jira.qos.ch/browse/LBCORE-93
Project: logback-core
Issue Type: New Feature
Reporter: Ceki Gulcu
Assignee: Logback dev list
Let flushing be a settable policy of WriteAppender. Thus, the user would be able to set the FlushingPolicy of a WriterAppender or any
derived class which would allow you to flush the underlying output stream according to any criteria available to the shouldFlush() method
(see below), including time.
Here is the relevant interface:
interface FlushingPolicy {
booelan shouldFlush(LoggingEvent e);
}
We could easily imagine a policy flushing on every warning or error in addition to special markers. For example,
Marker FLUSH = MarkerFactory.getMarker("FLUSH");
logger.info(FLUSH, "finished serving request {}", request.getId());
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
1
1

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-93-g499abbb
by git-noreply@pixie.qos.ch 18 Mar '10
by git-noreply@pixie.qos.ch 18 Mar '10
18 Mar '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 499abbba89771332844fa84262e77277f66e8932 (commit)
from 32d669a3ab35c87a919ca47712eaef295360a46e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=499abbba89771332844fa842…
http://github.com/ceki/logback/commit/499abbba89771332844fa84262e77277f66e8…
commit 499abbba89771332844fa84262e77277f66e8932
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Mar 18 18:27:08 2010 +0100
Making SiftingAppender relient againt zero nested appenders and more than one nested appender.
diff --git a/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingJoranConfigurator.java b/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingJoranConfigurator.java
index 0e0ca00..13d00cc 100644
--- a/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingJoranConfigurator.java
+++ b/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingJoranConfigurator.java
@@ -25,21 +25,22 @@ import ch.qos.logback.core.joran.spi.Pattern;
import ch.qos.logback.core.joran.spi.RuleStore;
import ch.qos.logback.core.sift.SiftingJoranConfiguratorBase;
-public class SiftingJoranConfigurator extends SiftingJoranConfiguratorBase<AccessEvent> {
+public class SiftingJoranConfigurator extends
+ SiftingJoranConfiguratorBase<AccessEvent> {
String key;
String value;
-
+
SiftingJoranConfigurator(String key, String value) {
this.key = key;
this.value = value;
}
-
+
@Override
protected Pattern initialPattern() {
return new Pattern("configuration");
}
-
+
@Override
protected void addInstanceRules(RuleStore rs) {
rs.addRule(new Pattern("configuration/appender"), new AppenderAction());
@@ -48,7 +49,8 @@ public class SiftingJoranConfigurator extends SiftingJoranConfiguratorBase<Acce
@Override
protected void buildInterpreter() {
super.buildInterpreter();
- Map<String, Object> omap = interpreter.getInterpretationContext().getObjectMap();
+ Map<String, Object> omap = interpreter.getInterpretationContext()
+ .getObjectMap();
omap.put(ActionConst.APPENDER_BAG, new HashMap());
omap.put(ActionConst.FILTER_CHAIN_BAG, new HashMap());
Map<String, String> propertiesMap = new HashMap<String, String>();
@@ -58,9 +60,14 @@ public class SiftingJoranConfigurator extends SiftingJoranConfiguratorBase<Acce
@SuppressWarnings("unchecked")
public Appender<AccessEvent> getAppender() {
- Map<String, Object> omap = interpreter.getInterpretationContext().getObjectMap();
- HashMap map = (HashMap) omap.get(ActionConst.APPENDER_BAG);
- Collection values = map.values();
+ Map<String, Object> omap = interpreter.getInterpretationContext()
+ .getObjectMap();
+ HashMap appenderMap = (HashMap) omap.get(ActionConst.APPENDER_BAG);
+ oneAndOnlyOneCheck(appenderMap);
+ Collection values = appenderMap.values();
+ if(values.size() == 0) {
+ return null;
+ }
return (Appender<AccessEvent>) values.iterator().next();
}
}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java b/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java
index 66309cb..d831f41 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java
@@ -68,8 +68,12 @@ public class SiftingJoranConfigurator extends SiftingJoranConfiguratorBase<ILog
@SuppressWarnings("unchecked")
public Appender<ILoggingEvent> getAppender() {
Map<String, Object> omap = interpreter.getInterpretationContext().getObjectMap();
- HashMap map = (HashMap) omap.get(ActionConst.APPENDER_BAG);
- Collection values = map.values();
+ HashMap appenderMap = (HashMap) omap.get(ActionConst.APPENDER_BAG);
+ oneAndOnlyOneCheck(appenderMap);
+ Collection values = appenderMap.values();
+ if(values.size() == 0) {
+ return null;
+ }
return (Appender<ILoggingEvent>) values.iterator().next();
}
}
diff --git a/logback-classic/src/test/input/joran/sift/multipleNesting.xml b/logback-classic/src/test/input/joran/sift/multipleNesting.xml
new file mode 100644
index 0000000..2dccd19
--- /dev/null
+++ b/logback-classic/src/test/input/joran/sift/multipleNesting.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration>
+
+<configuration debug="true">
+
+ <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+
+ <discriminator>
+ <Key>userid</Key>
+ <defaultValue>smoke</defaultValue>
+ </discriminator>
+ <sift>
+ <appender name="a-${userid}"
+ class="ch.qos.logback.core.read.ListAppender" />
+ <appender name="b-${userid}"
+ class="ch.qos.logback.core.read.ListAppender" />
+ </sift>
+ </appender>
+
+ <root level="DEBUG">
+ <appender-ref ref="SIFT" />
+ </root>
+
+</configuration>
diff --git a/logback-classic/src/test/input/joran/sift/zeroNesting.xml b/logback-classic/src/test/input/joran/sift/zeroNesting.xml
new file mode 100644
index 0000000..5194291
--- /dev/null
+++ b/logback-classic/src/test/input/joran/sift/zeroNesting.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration>
+
+<configuration debug="true">
+
+ <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+
+ <discriminator>
+ <Key>userid</Key>
+ <defaultValue>smoke</defaultValue>
+ </discriminator>
+ <sift>
+ </sift>
+ </appender>
+
+ <root level="DEBUG">
+ <appender-ref ref="SIFT" />
+ </root>
+
+</configuration>
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java
index 89608a3..c6723de 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java
@@ -23,7 +23,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.turbo.NOPTurboFilter;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
-import ch.qos.logback.core.appender.NOPAppender;
+import ch.qos.logback.core.helpers.NOPAppender;
import ch.qos.logback.core.testUtil.Env;
public class LoggerPerfTest {
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java
index b7ce5da..4bf89ac 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java
@@ -16,6 +16,7 @@ package ch.qos.logback.classic.sift;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import java.util.List;
@@ -29,9 +30,12 @@ import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.helpers.NOPAppender;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.read.ListAppender;
import ch.qos.logback.core.sift.AppenderTracker;
+import ch.qos.logback.core.status.ErrorStatus;
+import ch.qos.logback.core.status.StatusChecker;
import ch.qos.logback.core.testUtil.StringListAppender;
import ch.qos.logback.core.util.StatusPrinter;
@@ -65,8 +69,6 @@ public class SiftingAppenderTest {
SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT");
ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) ha
.getAppenderTracker().get("smoke", timestamp);
-
- StatusPrinter.print(loggerContext);
assertNotNull(listAppender);
List<ILoggingEvent> eventList = listAppender.list;
assertEquals(1, listAppender.list.size());
@@ -74,6 +76,49 @@ public class SiftingAppenderTest {
}
@Test
+ public void zeroNesting() throws JoranException {
+ configure(PREFIX + "zeroNesting.xml");
+ logger.debug("hello");
+ logger.debug("hello");
+ logger.debug("hello");
+ logger.debug("hello");
+ logger.debug("hello");
+
+ long timestamp = 0;
+
+ SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
+ NOPAppender<ILoggingEvent> nopa = (NOPAppender<ILoggingEvent>) sa
+ .getAppenderTracker().get("smoke", timestamp);
+ StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
+
+ assertNotNull(nopa);
+ StatusChecker sc = new StatusChecker(loggerContext);
+ assertTrue(sc.containsMatch(ErrorStatus.ERROR, "No nested appenders found"));
+ assertTrue(sc.containsMatch(ErrorStatus.ERROR,
+ "Failed to build an appender for discriminating value \\[smoke\\]"));
+ }
+
+ @Test
+ public void multipleNesting() throws JoranException {
+ configure(PREFIX + "multipleNesting.xml");
+ logger.debug("hello");
+ logger.debug("hello");
+ logger.debug("hello");
+
+ long timestamp = 0;
+
+ SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
+ ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) sa
+ .getAppenderTracker().get("smoke", timestamp);
+ StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
+
+ assertNotNull(listAppender);
+ StatusChecker sc = new StatusChecker(loggerContext);
+ assertTrue(sc.containsMatch(ErrorStatus.ERROR,
+ "Only and only one appender can be nested"));
+ }
+
+ @Test
public void defaultLayoutRule() throws JoranException {
configure(PREFIX + "defaultLayoutRule.xml");
logger.debug("hello");
@@ -82,7 +127,6 @@ public class SiftingAppenderTest {
StringListAppender<ILoggingEvent> listAppender = (StringListAppender<ILoggingEvent>) ha
.getAppenderTracker().get("default", timestamp);
- StatusPrinter.print(loggerContext);
assertNotNull(listAppender);
List<String> strList = listAppender.strList;
assertEquals(1, strList.size());
@@ -99,8 +143,6 @@ public class SiftingAppenderTest {
SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT");
ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) ha
.getAppenderTracker().get("a", timestamp);
- StatusPrinter.print(loggerContext);
-
assertNotNull(listAppender);
List<ILoggingEvent> eventList = listAppender.list;
assertEquals(1, listAppender.list.size());
@@ -115,4 +157,5 @@ public class SiftingAppenderTest {
assertEquals(1, ha.getAppenderTracker().keyList().size());
assertEquals("cycleDefault", ha.getAppenderTracker().keyList().get(0));
}
+
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java b/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java
index 637a1b4..699483f 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java
@@ -92,7 +92,7 @@ public class CoreConstants {
public static long REFERENCE_BIPS = 9000;
- // maximum error acoutn to report
+ // the max number of times an error should be reported
static public final int MAX_ERROR_COUNT = 4;
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/NOPAppender.java b/logback-core/src/main/java/ch/qos/logback/core/helpers/NOPAppender.java
similarity index 94%
rename from logback-core/src/test/java/ch/qos/logback/core/appender/NOPAppender.java
rename to logback-core/src/main/java/ch/qos/logback/core/helpers/NOPAppender.java
index 52b4003..5fb5129 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/NOPAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/helpers/NOPAppender.java
@@ -11,7 +11,7 @@
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
-package ch.qos.logback.core.appender;
+package ch.qos.logback.core.helpers;
import ch.qos.logback.core.AppenderBase;
diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java b/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java
index 7604a5f..5c7a6a4 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java
@@ -102,8 +102,6 @@ public class AppenderAction<E> extends Action {
addWarn("The object at the of the stack is not the appender named ["
+ appender.getName() + "] pushed earlier.");
} else {
- addInfo("Popping appender named [" + appender.getName()
- + "] from the object stack");
ec.popObject();
}
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java
index dbfe217..c82ed9b 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java
@@ -14,7 +14,9 @@
package ch.qos.logback.core.sift;
import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
+import ch.qos.logback.core.helpers.NOPAppender;
import ch.qos.logback.core.joran.spi.JoranException;
/**
@@ -77,9 +79,11 @@ public abstract class SiftingAppenderBase<E> extends
if (appender == null) {
try {
appender = appenderFactory.buildAppender(context, discriminatingValue);
- if (appender != null) {
- appenderTracker.put(discriminatingValue, appender, timestamp);
+ if (appender == null) {
+ appender = buildNOPAppender(discriminatingValue);
}
+ appenderTracker.put(discriminatingValue, appender, timestamp);
+
} catch (JoranException e) {
addError("Failed to build appender for [" + discriminatingValue + "]",
e);
@@ -97,6 +101,18 @@ public abstract class SiftingAppenderBase<E> extends
public void setDiscriminator(Discriminator<E> discriminator) {
this.discriminator = discriminator;
}
+
+
+ int nopaWarningCount = 0;
+
+ NOPAppender<E> buildNOPAppender(String discriminatingValue) {
+ NOPAppender<E> nopa = new NOPAppender<E>();
+ if(nopaWarningCount < CoreConstants.MAX_ERROR_COUNT) {
+ nopaWarningCount++;
+ addError("Failed to build an appender for discriminating value ["+discriminatingValue+"]");
+ }
+ return nopa;
+ }
// sometime one needs to close a nested appender immediately
// for example when executing a command which has its own nested appender
diff --git a/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingJoranConfiguratorBase.java b/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingJoranConfiguratorBase.java
index 0524f33..7d5c96e 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingJoranConfiguratorBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingJoranConfiguratorBase.java
@@ -13,24 +13,50 @@
*/
package ch.qos.logback.core.sift;
+import java.util.Map;
+
import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.joran.GenericConfigurator;
import ch.qos.logback.core.joran.action.NestedBasicPropertyIA;
import ch.qos.logback.core.joran.action.NestedComplexPropertyIA;
import ch.qos.logback.core.joran.spi.Interpreter;
-public abstract class SiftingJoranConfiguratorBase<E> extends GenericConfigurator {
+public abstract class SiftingJoranConfiguratorBase<E> extends
+ GenericConfigurator {
+
+ final static String ONE_AND_ONLY_ONE_URL = CoreConstants.CODES_URL
+ + "#1andOnly1";
@Override
protected void addImplicitRules(Interpreter interpreter) {
NestedComplexPropertyIA nestedComplexIA = new NestedComplexPropertyIA();
nestedComplexIA.setContext(context);
interpreter.addImplicitAction(nestedComplexIA);
-
+
NestedBasicPropertyIA nestedSimpleIA = new NestedBasicPropertyIA();
nestedSimpleIA.setContext(context);
interpreter.addImplicitAction(nestedSimpleIA);
}
-
+
abstract public Appender<E> getAppender();
+
+ int errorEmmissionCount = 0;
+
+ protected void oneAndOnlyOneCheck(Map appenderMap) {
+ String errMsg = null;
+ if (appenderMap.size() == 0) {
+ errorEmmissionCount++;
+ errMsg = "No nested appenders found within the <sift> element in SiftingAppender.";
+ } else if (appenderMap.size() > 1) {
+ errorEmmissionCount++;
+ errMsg = "Only and only one appender can be nested the <sift> element in SiftingAppender. See also "
+ + ONE_AND_ONLY_ONE_URL;
+ }
+
+ if (errMsg != null && errorEmmissionCount < CoreConstants.MAX_ERROR_COUNT) {
+ addError(errMsg);
+ }
+
+ }
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java b/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java
index db91d02..40bdf11 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java
@@ -20,7 +20,7 @@ import java.util.Map;
import java.util.Random;
import ch.qos.logback.core.Appender;
-import ch.qos.logback.core.appender.NOPAppender;
+import ch.qos.logback.core.helpers.NOPAppender;
import ch.qos.logback.core.sift.tracker.AppenderTrackerTImpl;
import ch.qos.logback.core.sift.tracker.SimulationEvent;
import ch.qos.logback.core.sift.tracker.SimulationEvent.SimEventType;
diff --git a/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java b/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java
index 300fedd..05b3a4d 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java
@@ -26,7 +26,7 @@ import org.junit.Before;
import org.junit.Test;
import ch.qos.logback.core.Appender;
-import ch.qos.logback.core.appender.NOPAppender;
+import ch.qos.logback.core.helpers.NOPAppender;
/**
* This test case verifies all the methods of AppenderAttableImpl work properly.
diff --git a/logback-site/src/site/pages/codes.html b/logback-site/src/site/pages/codes.html
index 93c98de..3ab510d 100644
--- a/logback-site/src/site/pages/codes.html
+++ b/logback-site/src/site/pages/codes.html
@@ -354,6 +354,7 @@
<hr />
+ <!-- ============================================================= -->
<p><a name="syslog_layout" href="#syslog_layout"> SyslogAppender
does not admit a layout.</a>
</p>
@@ -371,9 +372,19 @@
</p>
<hr/>
+
+ <!-- ============================================================= -->
+ <p><a name="1andOnly1" href="#1andOnly1">Only and only one appender
+ can be nested the <sift> element in
+ <code>SiftingAppender</code>.</a>
+ </p>
+ <p>SiftingAppender admits one and only one nested appender.
+ </p>
+
+ <hr/>
- <script src="templates/footer.js" type="text/javascript"></script>
+ <script src="templates/footer.js" type="text/javascript"></script>
</div>
</body>
</html>
-----------------------------------------------------------------------
Summary of changes:
.../access/sift/SiftingJoranConfigurator.java | 23 ++++++---
.../classic/sift/SiftingJoranConfigurator.java | 8 ++-
.../joran/sift/{smoke.xml => multipleNesting.xml} | 4 +-
.../joran/sift/{smoke.xml => zeroNesting.xml} | 4 +-
.../ch/qos/logback/classic/LoggerPerfTest.java | 2 +-
.../logback/classic/sift/SiftingAppenderTest.java | 53 ++++++++++++++++++--
.../java/ch/qos/logback/core/CoreConstants.java | 2 +-
.../ch/qos/logback/core/helpers}/NOPAppender.java | 2 +-
.../logback/core/joran/action/AppenderAction.java | 2 -
.../qos/logback/core/sift/SiftingAppenderBase.java | 20 +++++++-
.../core/sift/SiftingJoranConfiguratorBase.java | 32 +++++++++++-
.../java/ch/qos/logback/core/sift/Simulator.java | 2 +-
.../core/spi/AppenderAttachableImplTest.java | 2 +-
logback-site/src/site/pages/codes.html | 13 +++++-
14 files changed, 137 insertions(+), 32 deletions(-)
copy logback-classic/src/test/input/joran/sift/{smoke.xml => multipleNesting.xml} (78%)
copy logback-classic/src/test/input/joran/sift/{smoke.xml => zeroNesting.xml} (78%)
rename logback-core/src/{test/java/ch/qos/logback/core/appender => main/java/ch/qos/logback/core/helpers}/NOPAppender.java (94%)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0

[JIRA] Created: (LBCORE-139) SiftingAppender should compalin if more than one appender is nested within it
by Ceki Gulcu (JIRA) 18 Mar '10
by Ceki Gulcu (JIRA) 18 Mar '10
18 Mar '10
SiftingAppender should compalin if more than one appender is nested within it
-----------------------------------------------------------------------------
Key: LBCORE-139
URL: http://jira.qos.ch/browse/LBCORE-139
Project: logback-core
Issue Type: Bug
Affects Versions: 0.9.18
Reporter: Ceki Gulcu
Assignee: Logback dev list
Priority: Critical
SiftingAppender should complain if more than one appender is nested within it.
See the getAppender() method SiftingJoranConfigurator for a possible solution.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
1
1