diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiLogManager.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiLogManager.java index ed8f0a3ff..ed6512a5d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiLogManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiLogManager.java @@ -10,18 +10,25 @@ package io.ebeaninternal.api; public interface SpiLogManager { /** - * Return the SQL logger. + * Enable bind logging. + */ + boolean enableBindLog(); + + /** + * Logger used for general transactions. + */ + SpiTxnLogger logger(); + + /** + * Logger used for read only transactions. + */ + SpiTxnLogger readOnlyLogger(); + + /** + * Hmmmm, return the SQL logger for logging truncate statements. + *

+ * Maybe we should get rid of this */ SpiLogger sql(); - /** - * Return the TXN logger. - */ - SpiLogger txn(); - - /** - * Return the Summary logger. - */ - SpiLogger sum(); - } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiLogger.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiLogger.java index 8e6d5e71c..b3507cd19 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiLogger.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiLogger.java @@ -14,18 +14,9 @@ public interface SpiLogger { */ boolean isDebug(); - /** - * Is trace logging enabled. - */ - boolean isTrace(); - /** * Log a debug level message. */ - void debug(String msg); + void debug(String msg, Object... args); - /** - * Log a trace level message. - */ - void trace(String msg); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransaction.java index 6708d1a45..a8acdb45a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransaction.java @@ -27,10 +27,6 @@ public interface SpiTransaction extends Transaction { */ String getLabel(); - /** - * Return the string prefix with the transaction id and label used in logging. - */ - String getLogPrefix(); /** * Return true if generated SQL and Bind values should be logged to the @@ -47,12 +43,17 @@ public interface SpiTransaction extends Transaction { /** * Log a message to the SQL logger. */ - void logSql(String msg); + void logSql(String msg, Object... args); /** - * Log a message to the SUMMARY logger. + * Log a summary message to the SUMMARY logger. */ - void logSummary(String msg); + void logSummary(String msg, Object... args); + + /** + * Log a transaction message to the transaction logger. + */ + void logTxn(String msg, Object... args); /** * Register a "Deferred Relationship" that requires an additional update later. diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java index a46bf033f..87c2f606a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java @@ -137,10 +137,6 @@ public abstract class SpiTransactionProxy implements SpiTransaction { transaction.setDocStoreBatchSize(batchSize); } - @Override - public String getLogPrefix() { - return transaction.getLogPrefix(); - } @Override public boolean isLogSql() { @@ -153,13 +149,18 @@ public abstract class SpiTransactionProxy implements SpiTransaction { } @Override - public void logSql(String msg) { - transaction.logSql(msg); + public void logSql(String msg, Object... args) { + transaction.logSql(msg, args); } @Override - public void logSummary(String msg) { - transaction.logSummary(msg); + public void logSummary(String msg, Object... args) { + transaction.logSummary(msg, args); + } + + @Override + public void logTxn(String msg, Object... args) { + transaction.logTxn(msg, args); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTxnLogger.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTxnLogger.java new file mode 100644 index 000000000..62fd51169 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTxnLogger.java @@ -0,0 +1,49 @@ +package io.ebeaninternal.api; + +/** + * Per Transaction logging of SQL, TXN and Summary messages. + */ +public interface SpiTxnLogger { + + String id(); + + /** + * Is debug logging enabled. + */ + boolean isLogSql(); + + /** + * Is summary logging enabled. + */ + boolean isLogSummary(); + + /** + * Log a SQL message. + */ + void sql(String msg, Object... args); + + /** + * Log a Summary message. + */ + void sum(String msg, Object... args); + + /** + * Log a Transaction message. + */ + void txn(String msg, Object... args); + + /** + * Transaction Committed. + */ + void notifyCommit(); + + /** + * Query only transaction completed. + */ + void notifyQueryOnly(); + + /** + * Transaction Rolled back. + */ + void notifyRollback(Throwable cause); +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java index 2424dd2b3..b4a0c5b20 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java @@ -4,7 +4,6 @@ import io.ebean.CancelableQuery; import io.ebean.Transaction; import io.ebean.util.JdbcClose; import io.ebeaninternal.api.*; -import io.ebeaninternal.server.util.Str; import io.ebeaninternal.server.persist.Binder; import io.ebeaninternal.server.persist.TrimLogSql; import io.ebeaninternal.server.util.BindParamsParser; @@ -151,7 +150,7 @@ public abstract class AbstractSqlQueryRequest implements CancelableQuery { } if (isLogSql()) { long micros = (System.nanoTime() - startNano) / 1000L; - transaction.logSql(Str.add(TrimLogSql.trim(sql), "; --bind(", bindLog, ") --micros(", micros + ")")); + transaction.logSql("{0}; --bind({1}) --micros({2})", TrimLogSql.trim(sql), bindLog, micros); } } finally { lock.unlock(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java index abe149942..75b3cbf72 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java @@ -701,8 +701,8 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery /** * Log the SQL if the logLevel is appropriate. */ - public void logSql(String sql) { - transaction.logSql(sql); + public void logSql(String msg, Object... args) { + transaction.logSql(msg, args); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index 4016596f0..c176c3e90 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -928,20 +928,20 @@ public final class PersistRequestBean extends PersistRequest implements BeanP } private void logSummaryMessage() { - String draft = (beanDescriptor.isDraftable() && !publish) ? "] draft[true]" : "]"; + String draft = (beanDescriptor.isDraftable() && !publish) ? " draft[true]" : ""; String name = beanDescriptor.name(); switch (type) { case INSERT: - transaction.logSummary("Inserted [" + name + "] [" + (idValue == null ? "" : idValue) + draft); + transaction.logSummary("Inserted [{0}] [{1}]{2}", name, (idValue == null ? "" : idValue), draft); break; case UPDATE: - transaction.logSummary("Updated [" + name + "] [" + idValue + draft); + transaction.logSummary("Updated [{0}] [{1}]{2}", name, idValue , draft); break; case DELETE: - transaction.logSummary("Deleted [" + name + "] [" + idValue + draft); + transaction.logSummary("Deleted [{0}] [{1}]{2}", name, idValue , draft); break; case DELETE_SOFT: - transaction.logSummary("SoftDelete [" + name + "] [" + idValue + draft); + transaction.logSummary("SoftDelete [{0}] [{1}]{2}", name, idValue , draft); break; default: break; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestCallableSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestCallableSql.java index 70eebd927..217bb0e5c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestCallableSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestCallableSql.java @@ -1,12 +1,8 @@ package io.ebeaninternal.server.core; import io.ebean.CallableSql; -import io.ebeaninternal.api.BindParams; +import io.ebeaninternal.api.*; import io.ebeaninternal.api.BindParams.Param; -import io.ebeaninternal.api.SpiCallableSql; -import io.ebeaninternal.api.SpiEbeanServer; -import io.ebeaninternal.api.SpiTransaction; -import io.ebeaninternal.api.TransactionEventTable; import io.ebeaninternal.server.persist.PersistExecute; import java.sql.CallableStatement; @@ -86,7 +82,7 @@ public final class PersistRequestCallableSql extends PersistRequest { persistExecute.collectSqlCall(label, startNanos); } if (transaction.isLogSummary()) { - transaction.logSummary("CallableSql label[" + callableSql.getLabel() + "]" + " rows[" + rowCount + "]" + " bind[" + bindLog + "]"); + transaction.logSummary("CallableSql label[{0}] rows[{1}] bind[{2}]", callableSql.getLabel(), rowCount, bindLog); } // register table modifications with the transaction event diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestOrmUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestOrmUpdate.java index eb865a0bd..7707be1db 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestOrmUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestOrmUpdate.java @@ -83,7 +83,7 @@ public final class PersistRequestOrmUpdate extends PersistRequest { OrmUpdateType ormUpdateType = ormUpdate.getOrmUpdateType(); String tableName = ormUpdate.getBaseTable(); if (transaction.isLogSummary()) { - transaction.logSummary(ormUpdateType + " table[" + tableName + "] rows[" + rowCount + "] bind[" + bindLog + "]"); + transaction.logSummary("{0} table[{1}] rows[{2}] bind[{3}]", ormUpdateType, tableName, rowCount, bindLog); } if (ormUpdate.isNotifyCache()) { // add the modification info to the TransactionEvent diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java index e2f898e3c..f0b5f31fa 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java @@ -3,7 +3,6 @@ package io.ebeaninternal.server.core; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiSqlUpdate; import io.ebeaninternal.api.SpiTransaction; -import io.ebeaninternal.server.util.Str; import io.ebeaninternal.server.persist.BatchControl; import io.ebeaninternal.server.persist.PersistExecute; import io.ebeaninternal.server.persist.TrimLogSql; @@ -148,7 +147,7 @@ public final class PersistRequestUpdateSql extends PersistRequest { */ public void logSqlBatchBind() { if (transaction.isLogSql()) { - transaction.logSql(Str.add(" -- bind(", bindLog, ")")); + transaction.logSql(" -- bind({0})", bindLog); } } @@ -161,7 +160,7 @@ public final class PersistRequestUpdateSql extends PersistRequest { persistExecute.collectSqlUpdate(label, startNanos); } if (transaction.isLogSql() && !batchThisRequest) { - transaction.logSql(Str.add(TrimLogSql.trim(updateSql.getGeneratedSql()), "; -- bind(", bindLog, ") rows(", String.valueOf(rowCount), ")")); + transaction.logSql("{0}; -- bind({1}) rows({2})", TrimLogSql.trim(updateSql.getGeneratedSql()), bindLog, rowCount); } if (updateSql.isAutoTableMod()) { // add the modification info to the TransactionEvent diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java index 1b25a56a6..8b5002b45 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java @@ -123,7 +123,7 @@ public final class RelationalQueryRequest extends AbstractSqlQueryRequest { public void logSummary() { if (transaction.isLogSummary()) { long micros = (System.nanoTime() - startNano) / 1000L; - transaction.logSummary("SqlQuery rows[" + rows + "] micros[" + micros + "] bind[" + bindLog + "]"); + transaction.logSummary("SqlQuery rows[{0}] micros[{1}] bind[{2}]", rows, micros, bindLog); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLogManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLogManager.java index 31c42f2fd..ed45dd08a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLogManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLogManager.java @@ -2,22 +2,30 @@ package io.ebeaninternal.server.logger; import io.ebeaninternal.api.SpiLogManager; import io.ebeaninternal.api.SpiLogger; +import io.ebeaninternal.api.SpiTxnLogger; + +import java.util.concurrent.atomic.AtomicLong; public final class DLogManager implements SpiLogManager { private final SpiLogger sql; private final SpiLogger summary; private final SpiLogger txn; + private final boolean useIds; + private final AtomicLong counter = new AtomicLong(1000); + private final DTxnLogger readOnly; public DLogManager(SpiLogger sql, SpiLogger summary, SpiLogger txn) { this.sql = sql; this.summary = summary; this.txn = txn; + this.useIds = txn.isDebug(); + this.readOnly = new DTxnLogger(null, sql, summary, txn); } @Override - public SpiLogger txn() { - return txn; + public boolean enableBindLog() { + return sql.isDebug(); } @Override @@ -26,8 +34,13 @@ public final class DLogManager implements SpiLogManager { } @Override - public SpiLogger sum() { - return summary; + public SpiTxnLogger logger() { + String id = useIds ? Long.toString(counter.incrementAndGet()) : ""; + return new DTxnLogger(id, sql, summary, txn); } + @Override + public SpiTxnLogger readOnlyLogger() { + return readOnly; + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DSpiLogger.java b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DSpiLogger.java index 922667037..f9713b407 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DSpiLogger.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DSpiLogger.java @@ -3,7 +3,6 @@ package io.ebeaninternal.server.logger; import io.ebeaninternal.api.SpiLogger; import static java.lang.System.Logger.Level.DEBUG; -import static java.lang.System.Logger.Level.TRACE; final class DSpiLogger implements SpiLogger { @@ -19,17 +18,7 @@ final class DSpiLogger implements SpiLogger { } @Override - public boolean isTrace() { - return logger.isLoggable(TRACE); - } - - @Override - public void debug(String msg) { - logger.log(DEBUG, msg); - } - - @Override - public void trace(String msg) { - logger.log(TRACE, msg); + public void debug(String msg, Object... args) { + logger.log(DEBUG, msg, args); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DTxnLogger.java b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DTxnLogger.java new file mode 100644 index 000000000..5e498cae8 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DTxnLogger.java @@ -0,0 +1,96 @@ +package io.ebeaninternal.server.logger; + +import io.ebeaninternal.api.SpiLogger; +import io.ebeaninternal.api.SpiTxnLogger; +import io.ebeaninternal.server.util.Str; + +final class DTxnLogger implements SpiTxnLogger { + + private final String id; + private final String logPrefix; + private final SpiLogger sql; + private final SpiLogger sum; + private final SpiLogger txn; + + DTxnLogger(String id, SpiLogger sql, SpiLogger sum, SpiLogger txn) { + this.id = id; + this.logPrefix = id == null ? "" : "txn[" + id + "] "; + this.sql = sql; + this.sum = sum; + this.txn = txn; + } + + @Override + public String id() { + return id; + } + + @Override + public boolean isLogSql() { + return sql.isDebug(); + } + + @Override + public boolean isLogSummary() { + return sum.isDebug(); + } + + @Override + public void sql(String msg, Object... args) { + sql.debug(Str.add(logPrefix, msg), args); + } + + @Override + public void sum(String msg, Object... args) { + sum.debug(Str.add(logPrefix, msg), args); + } + + @Override + public void txn(String msg, Object... args) { + txn.debug(Str.add(logPrefix, msg), args); + } + + @Override + public void notifyCommit() { + txn.debug(Str.add(logPrefix, "Commit")); + } + + @Override + public void notifyQueryOnly() { + // do nothing + } + + @Override + public void notifyRollback(Throwable cause) { + if (txn.isDebug()) { + String msg = logPrefix + "Rollback"; + if (cause != null) { + msg += " error: " + formatThrowable(cause); + } + txn.debug(msg); + } + } + + private String formatThrowable(Throwable e) { + if (e == null) { + return ""; + } + StringBuilder sb = new StringBuilder(); + formatThrowable(e, sb); + return sb.toString(); + } + + private void formatThrowable(Throwable e, StringBuilder sb) { + sb.append(e.toString()); + StackTraceElement[] stackTrace = e.getStackTrace(); + if (stackTrace.length > 0) { + sb.append(" stack0: "); + sb.append(stackTrace[0]); + } + Throwable cause = e.getCause(); + if (cause != null) { + sb.append(" cause: "); + formatThrowable(cause, sb); + } + } +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchControl.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchControl.java index b17dfb1be..10cd8f519 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchControl.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchControl.java @@ -313,7 +313,7 @@ public final class BatchControl { BatchedBeanHolder[] bsArray = beanHolderArray(); Arrays.sort(bsArray, depthComparator); if (transaction.isLogSummary()) { - transaction.logSummary("BatchControl flush " + Arrays.toString(bsArray)); + transaction.logSummary("BatchControl flush {0}", Arrays.toString(bsArray)); } for (BatchedBeanHolder beanHolder : bsArray) { beanHolder.executeNow(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java index 008163c30..c63f32674 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java @@ -44,7 +44,7 @@ public final class Binder { this.dbExpressionHandler = dbExpressionHandler; this.dataTimeZone = dataTimeZone; this.multiValueBind = multiValueBind; - this.enableBindLog = logManager.sql().isDebug(); + this.enableBindLog = logManager.enableBindLog(); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java index f8b1f3381..90ee38f32 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java @@ -672,7 +672,7 @@ public final class DefaultPersister implements Persister { if (idList != null) { q.where().idIn(idList); if (t.isLogSummary()) { - t.logSummary("-- DeleteById of " + descriptor.name() + " ids[" + idList + "] requires fetch of foreign key values"); + t.logSummary("-- DeleteById of {0} ids[{1}] requires fetch of foreign key values", descriptor.name(), idList); } List beanList = server.findList(q, t); deleteCascade(beanList, t, deleteMode, false); @@ -681,7 +681,7 @@ public final class DefaultPersister implements Persister { } else { q.where().idEq(id); if (t.isLogSummary()) { - t.logSummary("-- DeleteById of " + descriptor.name() + " id[" + id + "] requires fetch of foreign key values"); + t.logSummary("-- DeleteById of {0} id[{1}] requires fetch of foreign key values", descriptor.name(), id); } EntityBean bean = (EntityBean) server.findOne(q, t); if (bean == null) { @@ -741,7 +741,7 @@ public final class DefaultPersister implements Persister { for (BeanPropertyAssocMany many : manys) { SqlUpdate sqlDelete = many.deleteByParentId(id, idList); if (t.isLogSummary()) { - t.logSummary("-- Deleting intersection table entries: " + many.fullName()); + t.logSummary("-- Deleting intersection table entries: {0}", many.fullName()); } executeSqlUpdate(sqlDelete, t); } @@ -751,9 +751,9 @@ public final class DefaultPersister implements Persister { SqlUpdate deleteById = descriptor.deleteById(id, idList, deleteMode); if (t.isLogSummary()) { if (idList != null) { - t.logSummary("-- Deleting " + descriptor.name() + " Ids: " + idList); + t.logSummary("-- Deleting {0} Ids: {1}", descriptor.name(), idList); } else { - t.logSummary("-- Deleting " + descriptor.name() + " Id: " + id); + t.logSummary("-- Deleting {0} Id: {1}", descriptor.name(), id); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java index ad16a3fa8..ab935a09e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java @@ -69,7 +69,7 @@ final class DeleteUnloadedForeignKeys { SpiTransaction t = request.transaction(); if (t.isLogSummary()) { - t.logSummary("-- Ebean fetching foreign key values for delete of " + descriptor.name() + " id:" + id); + t.logSummary("-- Ebean fetching foreign key values for delete of {0} id:{1}", descriptor.name(), id); } beanWithForeignKeys = (EntityBean) server.findOne(q, t); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java index 58ec931fc..54d318a0a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java @@ -8,7 +8,6 @@ import io.ebeaninternal.server.persist.BatchedPstmt; import io.ebeaninternal.server.persist.BatchedPstmtHolder; import io.ebeaninternal.server.persist.dmlbind.BindableRequest; import io.ebeaninternal.server.bind.DataBind; -import io.ebeaninternal.server.util.Str; import javax.persistence.OptimisticLockException; import java.sql.Connection; @@ -102,7 +101,7 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { } catch (OptimisticLockException e) { // add the SQL and bind values to error message final String m = e.getMessage() + " sql[" + sql + "] bind[" + bindLog + "]"; - persistRequest.transaction().logSummary("OptimisticLockException:" + m); + persistRequest.transaction().logSummary("OptimisticLockException:{0}", m); throw new OptimisticLockException(m, null, e.getEntity()); } } @@ -146,15 +145,15 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { switch (batchedStatus) { case BATCHED_FIRST: { transaction.logSql(sql); - transaction.logSql(Str.add(" -- bind(", bindLog.toString(), ")")); + transaction.logSql(" -- bind({0})", bindLog); return; } case BATCHED: { - transaction.logSql(Str.add(" -- bind(", bindLog.toString(), ")")); + transaction.logSql(" -- bind({0})", bindLog); return; } default: { - transaction.logSql(Str.add(sql, "; -- bind(", bindLog.toString(), ")")); + transaction.logSql("{0}; -- bind({1})", sql, bindLog); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java index 4a2686f16..8a3307b8f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java @@ -18,7 +18,6 @@ import io.ebeaninternal.server.core.OrmQueryRequest; import io.ebeaninternal.server.core.SpiResultSet; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.persist.Binder; -import io.ebeaninternal.server.util.Str; import javax.persistence.PersistenceException; import java.sql.ResultSet; @@ -73,7 +72,7 @@ public final class CQueryEngine { try { int rows = query.execute(); if (request.logSql()) { - request.logSql(Str.add(query.generatedSql(), "; --bind(", query.bindLog(), ") --micros(", query.micros() + ") --rows(", rows + ")")); + request.logSql("{0}; --bind({1}) --micros({2}) --rows({3})", query.generatedSql(), query.bindLog(), query.micros(), rows); } return rows; } catch (SQLException e) { @@ -129,7 +128,7 @@ public final class CQueryEngine { SpiTransaction t = request.transaction(); if (t.isLogSummary()) { // log the error to the transaction log - t.logSummary("ERROR executing query, bindLog[" + bindLog + "] error:" + StringHelper.removeNewLines(e.getMessage())); + t.logSummary("ERROR executing query, bindLog[{0}] error:{1}", bindLog, StringHelper.removeNewLines(e.getMessage())); } // ensure 'rollback' is logged if queryOnly transaction t.connection(); @@ -147,7 +146,7 @@ public final class CQueryEngine { } private void logGeneratedSql(OrmQueryRequest request, String sql, String bindLog, long micros) { - request.logSql(Str.add(sql, "; --bind(", bindLog, ") --micros(", micros + ")")); + request.logSql("{0}; --bind({1}) --micros({2})", sql, bindLog, micros); } /** @@ -403,7 +402,7 @@ public final class CQueryEngine { * Log the generated SQL to the transaction log. */ private void logSql(CQuery query) { - query.transaction().logSql(Str.add(query.generatedSql(), "; --bind(", query.bindLog(), ") --micros(", query.micros() + ")")); + query.transaction().logSql("{0}; --bind({1}) --micros({2})", query.generatedSql(), query.bindLog(), query.micros()); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreOnlyTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreOnlyTransaction.java index 9ff36d545..55e4eb0f5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreOnlyTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreOnlyTransaction.java @@ -10,8 +10,8 @@ public final class DocStoreOnlyTransaction extends JdbcTransaction { /** * Create a new DocStore only Transaction. */ - public DocStoreOnlyTransaction(String id, boolean explicit, TransactionManager manager) { - super(id, explicit, null, manager); + public DocStoreOnlyTransaction(boolean explicit, TransactionManager manager) { + super(explicit, null, manager); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java index d23476c25..a6f58c228 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java @@ -25,11 +25,11 @@ public final class DocStoreTransactionManager extends TransactionManager { @Override public SpiTransaction createReadOnlyTransaction(Object tenantId) { - return new DocStoreOnlyTransaction("", false, this); + return new DocStoreOnlyTransaction(false, this); } @Override protected SpiTransaction createTransaction(boolean explicit, Connection c) { - return new DocStoreOnlyTransaction(nextTxnId(), explicit, this); + return new DocStoreOnlyTransaction(explicit, this); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ExternalJdbcTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ExternalJdbcTransaction.java index 867472be6..c40a83a12 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ExternalJdbcTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ExternalJdbcTransaction.java @@ -25,14 +25,14 @@ public class ExternalJdbcTransaction extends JdbcTransaction { *

*/ public ExternalJdbcTransaction(Connection connection) { - super(null, true, connection, null); + super(true, connection, null); } /** * Construct will all explicit parameters. */ - public ExternalJdbcTransaction(String id, boolean explicit, Connection connection, TransactionManager manager) { - super(id, explicit, connection, manager); + public ExternalJdbcTransaction(boolean explicit, Connection connection, TransactionManager manager) { + super(explicit, connection, manager); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java index 7ffa36f8d..f665662f6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java @@ -33,6 +33,7 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve private static final String notExpectedMessage = "Not expected on read only transaction"; private final TransactionManager manager; + private final SpiTxnLogger logger; private final boolean logSql; private final boolean logSummary; @@ -61,8 +62,9 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve */ ImplicitReadOnlyTransaction(TransactionManager manager, Connection connection) { this.manager = manager; - this.logSql = manager.isLogSql(); - this.logSummary = manager.isLogSummary(); + this.logger = manager.loggerReadOnly(); + this.logSql = logger.isLogSql(); + this.logSummary = logger.isLogSummary(); this.active = true; this.connection = connection; this.persistenceContext = new DefaultPersistenceContext(); @@ -147,11 +149,6 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve public void setSkipCache(boolean skipCache) { } - @Override - public String getLogPrefix() { - return null; - } - @Override public void addBeanChange(BeanChange beanChange) { throw new IllegalStateException(notExpectedMessage); @@ -433,13 +430,18 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve } @Override - public void logSql(String msg) { - manager.log().sql().debug(msg); + public void logSql(String msg, Object... args) { + logger.sql(msg, args); } @Override - public void logSummary(String msg) { - manager.log().sum().debug(msg); + public void logSummary(String msg, Object... args) { + logger.sum(msg, args); + } + + @Override + public void logTxn(String msg, Object... args) { + // never called } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java index 4b8408c27..a432a54d4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java @@ -11,7 +11,6 @@ import io.ebeaninternal.server.core.PersistDeferredRelationship; import io.ebeaninternal.server.core.PersistRequestBean; import io.ebeaninternal.server.persist.BatchControl; import io.ebeaninternal.server.persist.BatchedSqlException; -import io.ebeaninternal.server.util.Str; import io.ebeanservice.docstore.api.DocStoreTransaction; import javax.persistence.PersistenceException; @@ -33,8 +32,8 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { private static final String illegalStateMessage = "Transaction is Inactive"; final TransactionManager manager; + private final SpiTxnLogger logger; private final String id; - private final String logPrefix; private final boolean logSql; private final boolean logSummary; private final boolean explicit; @@ -95,17 +94,17 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { private final long startNanos; private boolean autoPersistUpdates; - JdbcTransaction(String id, boolean explicit, Connection connection, TransactionManager manager) { + JdbcTransaction(boolean explicit, Connection connection, TransactionManager manager) { try { this.active = true; - this.id = id; - this.logPrefix = deriveLogPrefix(id); this.explicit = explicit; this.manager = manager; this.connection = connection; this.persistenceContext = new DefaultPersistenceContext(); this.startNanos = System.nanoTime(); if (manager == null) { + this.logger = null; + this.id = ""; this.logSql = false; this.logSummary = false; this.skipCacheAfterWrite = true; @@ -113,9 +112,11 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { this.batchOnCascadeMode = false; this.onQueryOnlyCommit = false; } else { + this.logger = manager.logger(); + this.id = logger.id(); this.autoPersistUpdates = explicit && manager.isAutoPersistUpdates(); - this.logSql = manager.isLogSql(); - this.logSummary = manager.isLogSummary(); + this.logSql = logger.isLogSql(); + this.logSummary = logger.isLogSummary(); this.skipCacheAfterWrite = manager.isSkipCacheAfterWrite(); this.batchMode = manager.isPersistBatch(); this.batchOnCascadeMode = manager.isPersistBatchOnCascade(); @@ -188,16 +189,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } } - private static String deriveLogPrefix(String id) { - StringBuilder sb = new StringBuilder(); - sb.append("txn["); - if (id != null) { - sb.append(id); - } - sb.append("] "); - return sb.toString(); - } @Override public final void setAutoPersistUpdates(boolean autoPersistUpdates) { @@ -226,17 +218,13 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { this.skipCache = skipCache; } - @Override - public final String getLogPrefix() { - return logPrefix; - } @Override public String toString() { if (active) { - return logPrefix; + return id; } else { - return logPrefix + "(inactive)"; + return id + "(inactive)"; } } @@ -726,13 +714,18 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public final void logSql(String msg) { - manager.log().sql().debug(Str.add(logPrefix, msg)); + public void logSql(String msg, Object... args) { + logger.sql(msg, args); } @Override - public final void logSummary(String msg) { - manager.log().sum().debug(Str.add(logPrefix, msg)); + public final void logSummary(String msg, Object... args) { + logger.sum(msg, args); + } + + @Override + public void logTxn(String msg, Object... args) { + logger.txn(msg, args); } /** @@ -805,9 +798,11 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { final void notifyCommit() { if (manager != null) { if (queryOnly) { + logger.notifyQueryOnly(); manager.notifyOfQueryOnly(this); } else { manager.notifyOfCommit(this); + logger.notifyCommit(); } } } @@ -966,6 +961,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { manager.notifyOfQueryOnly(this); } else { manager.notifyOfRollback(this, cause); + logger.notifyRollback(cause); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java index cfd76c581..66f1a1c78 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java @@ -20,8 +20,8 @@ public final class JtaTransaction extends JdbcTransaction { /** * Create the JtaTransaction. */ - public JtaTransaction(String id, boolean explicit, UserTransaction utx, DataSource ds, TransactionManager manager) { - super(id, explicit, null, manager); + public JtaTransaction(boolean explicit, UserTransaction utx, DataSource ds, TransactionManager manager) { + super(explicit, null, manager); userTransaction = utx; try { newTransaction = userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java index 73bc98981..c4027ff04 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java @@ -105,8 +105,7 @@ public final class JtaTransactionManager implements ExternalTransactionManager { // This is a transaction that Ebean has not seen before. // "wrap" it in a Ebean specific JtaTransaction - String txnId = String.valueOf(System.currentTimeMillis()); - JtaTransaction newTrans = new JtaTransaction(txnId, true, ut, dataSource(), transactionManager); + JtaTransaction newTrans = new JtaTransaction( true, ut, dataSource(), transactionManager); // create and register transaction listener JtaTxnListener txnListener = createJtaTxnListener(newTrans); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java index ff094b643..b0ee596df 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java @@ -117,10 +117,6 @@ final class NoTransaction implements SpiTransaction { // do nothing } - @Override - public String getLogPrefix() { - return null; - } @Override public boolean isLogSql() { @@ -133,12 +129,17 @@ final class NoTransaction implements SpiTransaction { } @Override - public void logSql(String msg) { + public void logSql(String msg, Object... args) { } @Override - public void logSummary(String msg) { + public void logSummary(String msg, Object... args) { + + } + + @Override + public void logTxn(String msg, Object... args) { } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/SavepointTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/SavepointTransaction.java index e35a8c30f..b9e3f8b8a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/SavepointTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/SavepointTransaction.java @@ -21,7 +21,6 @@ final class SavepointTransaction extends SpiTransactionProxy { private final TransactionManager manager; private final Savepoint savepoint; private final Connection connection; - private final String logPrefix; private final String spPrefix; private boolean rollbackOnly; @@ -33,13 +32,12 @@ final class SavepointTransaction extends SpiTransactionProxy { this.transaction = transaction; this.connection = transaction.getInternalConnection(); this.savepoint = connection.setSavepoint(); - if (manager.isTxnDebug()) { + if (transaction.isLogSql()) { int savepointId = manager.isSupportsSavepointId() ? savepoint.getSavepointId() : 0; this.spPrefix = "sp[" + savepointId + "] "; } else { this.spPrefix = "sp[] "; } - this.logPrefix = transaction.getLogPrefix() + spPrefix; } @Override @@ -51,18 +49,13 @@ final class SavepointTransaction extends SpiTransactionProxy { } @Override - public String getLogPrefix() { - return logPrefix; + public void logSql(String msg, Object... args) { + transaction.logSql(Str.add(spPrefix, msg), args); } @Override - public void logSql(String msg) { - transaction.logSql(Str.add(spPrefix, msg)); - } - - @Override - public void logSummary(String msg) { - transaction.logSummary(Str.add(spPrefix, msg)); + public void logSummary(String msg, Object... args) { + transaction.logSummary(Str.add(spPrefix, msg), args); } @Override @@ -99,6 +92,7 @@ final class SavepointTransaction extends SpiTransactionProxy { connection.releaseSavepoint(savepoint); state = STATE_COMMITTED; manager.notifyOfCommit(this); + transaction.logTxn(spPrefix + "commit"); } catch (SQLException e) { throw new PersistenceException("Error trying to commit/release Savepoint", e); } @@ -109,6 +103,7 @@ final class SavepointTransaction extends SpiTransactionProxy { connection.rollback(savepoint); state = STATE_ROLLED_BACK; manager.notifyOfRollback(this, cause); + transaction.logTxn(spPrefix + "rollback");//TODO: Pass the cause } catch (SQLException e) { throw new PersistenceException("Error trying to rollback Savepoint", e); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java index cf8f4591b..dcd6e73ea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java @@ -43,9 +43,6 @@ abstract class TransactionFactory { throw new PersistenceException(e); } } - if (explicit && manager.log().txn().isTrace()) { - manager.log().txn().trace(t.getLogPrefix() + "Begin"); - } return t; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java index 0a306640d..442a25ff8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java @@ -36,7 +36,6 @@ import java.sql.SQLException; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; import static java.lang.System.Logger.Level.DEBUG; import static java.lang.System.Logger.Level.ERROR; @@ -63,8 +62,6 @@ public class TransactionManager implements SpiTransactionManager { * Prefix for transaction id's (logging). */ final String prefix; - private final String externalTransPrefix; - private final AtomicLong counter = new AtomicLong(1000L); /** * The dataSource of connections. @@ -96,8 +93,6 @@ public class TransactionManager implements SpiTransactionManager { private final boolean skipCacheAfterWrite; private final TransactionFactory transactionFactory; private final SpiLogManager logManager; - private final SpiLogger txnLogger; - private final boolean txnDebug; private final DatabasePlatform databasePlatform; private final SpiProfileHandler profileHandler; private final TimedMetric txnMain; @@ -115,8 +110,6 @@ public class TransactionManager implements SpiTransactionManager { public TransactionManager(TransactionManagerOptions options) { this.server = options.server; this.logManager = options.logManager; - this.txnLogger = logManager.txn(); - this.txnDebug = txnLogger.isDebug(); this.databasePlatform = options.config.getDatabasePlatform(); this.supportsSavepointId = databasePlatform.supportsSavepointId(); this.skipCacheAfterWrite = options.config.isSkipCacheAfterWrite(); @@ -142,7 +135,6 @@ public class TransactionManager implements SpiTransactionManager { this.profileHandler = options.profileHandler; this.bulkEventListenerMap = new BulkEventListenerMap(options.config.getBulkTableEventListeners()); this.prefix = ""; - this.externalTransPrefix = "e"; CurrentTenantProvider tenantProvider = options.config.getCurrentTenantProvider(); this.transactionFactory = TransactionFactoryBuilder.build(this, dataSourceSupplier, tenantProvider); @@ -273,14 +265,7 @@ public class TransactionManager implements SpiTransactionManager { * Wrap the externally supplied Connection. */ public SpiTransaction wrapExternalConnection(Connection c) { - return wrapExternalConnection(externalTransPrefix + c.hashCode(), c); - } - - /** - * Wrap an externally supplied Connection with a known transaction id. - */ - private SpiTransaction wrapExternalConnection(String id, Connection c) { - ExternalJdbcTransaction t = new ExternalJdbcTransaction(id, true, c, this); + ExternalJdbcTransaction t = new ExternalJdbcTransaction(true, c, this); // set the default batch mode t.setBatchMode(persistBatch); t.setBatchOnCascade(persistBatchOnCascade); @@ -313,14 +298,7 @@ public class TransactionManager implements SpiTransactionManager { * Create a new transaction. */ SpiTransaction createTransaction(boolean explicit, Connection c) { - return new JdbcTransaction(nextTxnId(), explicit, c, this); - } - - /** - * Return the next transaction id. - */ - String nextTxnId() { - return txnDebug ? prefix + counter.incrementAndGet() : prefix; + return new JdbcTransaction(explicit, c, this); } /** @@ -328,17 +306,7 @@ public class TransactionManager implements SpiTransactionManager { */ @Override public final void notifyOfRollback(SpiTransaction transaction, Throwable cause) { - try { - if (txnLogger.isDebug()) { - String msg = transaction.getLogPrefix() + "Rollback"; - if (cause != null) { - msg += " error: " + formatThrowable(cause); - } - txnLogger.debug(msg); - } - } catch (Exception ex) { - log.log(ERROR, "Error while notifying TransactionEventListener of rollback event", ex); - } + // Do nothing now } /** @@ -347,32 +315,6 @@ public class TransactionManager implements SpiTransactionManager { @Override public final void notifyOfQueryOnly(SpiTransaction transaction) { // Nothing that interesting here - if (txnLogger.isTrace()) { - txnLogger.trace(transaction.getLogPrefix() + "Commit - query only"); - } - } - - private String formatThrowable(Throwable e) { - if (e == null) { - return ""; - } - StringBuilder sb = new StringBuilder(); - formatThrowable(e, sb); - return sb.toString(); - } - - private void formatThrowable(Throwable e, StringBuilder sb) { - sb.append(e.toString()); - StackTraceElement[] stackTrace = e.getStackTrace(); - if (stackTrace.length > 0) { - sb.append(" stack0: "); - sb.append(stackTrace[0]); - } - Throwable cause = e.getCause(); - if (cause != null) { - sb.append(" cause: "); - formatThrowable(cause, sb); - } } /** @@ -381,9 +323,6 @@ public class TransactionManager implements SpiTransactionManager { @Override public final void notifyOfCommit(SpiTransaction transaction) { try { - if (txnLogger.isDebug()) { - txnLogger.debug(transaction.getLogPrefix() + "Commit"); - } PostCommitProcessing postCommit = new PostCommitProcessing(clusterManager, this, transaction); postCommit.notifyLocalCache(); backgroundExecutor.execute(postCommit.backgroundNotify()); @@ -676,25 +615,18 @@ public class TransactionManager implements SpiTransactionManager { } } - /** - * Return true if Transaction debug is on. - */ - public final boolean isTxnDebug() { - return txnDebug; + public SpiTxnLogger logger() { + return logManager.logger(); + } + + public SpiTxnLogger loggerReadOnly() { + return logManager.readOnlyLogger(); } public final SpiLogManager log() { return logManager; } - public final boolean isLogSql() { - return logManager.sql().isDebug(); - } - - public final boolean isLogSummary() { - return logManager.sum().isDebug(); - } - /** * Experimental - find dirty beans in the persistence context and persist them. */ @@ -704,4 +636,5 @@ public class TransactionManager implements SpiTransactionManager { server.updateAll(dirtyBeans, transaction); } } + } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/util/Str.java b/ebean-core/src/main/java/io/ebeaninternal/server/util/Str.java index c49032c86..31d21bc5e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/util/Str.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/util/Str.java @@ -43,4 +43,24 @@ public final class Str { return sb.append(s0).append(s1).toString(); } + public static String add(String s0, String[] s1) { + if (s1 == null || s1.length == 0) { + return s0; + } + int len = s0.length(); + for (String s : s1) { + if (s != null) { + len += s.length(); + } + } + StringBuilder sb = new StringBuilder(len); + sb.append(s0); + for (String s : s1) { + if (s != null) { + sb.append(s); + } + } + return sb.toString(); + } + } diff --git a/ebean-test/src/main/java/io/ebean/test/CaptureLogger.java b/ebean-test/src/main/java/io/ebean/test/CaptureLogger.java index f76368f6c..b02413f91 100644 --- a/ebean-test/src/main/java/io/ebean/test/CaptureLogger.java +++ b/ebean-test/src/main/java/io/ebean/test/CaptureLogger.java @@ -2,6 +2,7 @@ package io.ebean.test; import io.ebeaninternal.api.SpiLogger; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; @@ -24,24 +25,11 @@ final class CaptureLogger implements SpiLogger { } @Override - public boolean isTrace() { - return true; - } - - @Override - public void debug(String msg) { + public void debug(String msg, Object... args) { if (active) { - messages.add(msg); + messages.add(MessageFormat.format(msg, args)); } - wrapped.debug(msg); - } - - @Override - public void trace(String msg) { - if (active) { - messages.add(msg); - } - wrapped.trace(msg); + wrapped.debug(msg, args); } List start() { diff --git a/ebean-test/src/main/java/io/ebean/test/CapturingLoggerFactory.java b/ebean-test/src/main/java/io/ebean/test/CapturingLoggerFactory.java index c7887dd75..25cce8abb 100644 --- a/ebean-test/src/main/java/io/ebean/test/CapturingLoggerFactory.java +++ b/ebean-test/src/main/java/io/ebean/test/CapturingLoggerFactory.java @@ -5,7 +5,6 @@ import io.ebeaninternal.api.SpiLogger; import io.ebeaninternal.api.SpiLoggerFactory; import static java.lang.System.Logger.Level.DEBUG; -import static java.lang.System.Logger.Level.TRACE; /** * Create a logger that captures the SQL and register it for later access in tests. @@ -38,18 +37,8 @@ public class CapturingLoggerFactory implements SpiLoggerFactory { } @Override - public boolean isTrace() { - return logger.isLoggable(TRACE); - } - - @Override - public void debug(String msg) { - logger.log(DEBUG, msg); - } - - @Override - public void trace(String msg) { - logger.log(TRACE, msg); + public void debug(String msg, Object... args) { + logger.log(DEBUG, msg, args); } } } diff --git a/ebean-test/src/test/java/io/ebean/xtest/base/EbeanServerFactory_ServerConfigStart_Test.java b/ebean-test/src/test/java/io/ebean/xtest/base/EbeanServerFactory_ServerConfigStart_Test.java index 113596331..841a552fa 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/base/EbeanServerFactory_ServerConfigStart_Test.java +++ b/ebean-test/src/test/java/io/ebean/xtest/base/EbeanServerFactory_ServerConfigStart_Test.java @@ -35,16 +35,7 @@ public class EbeanServerFactory_ServerConfigStart_Test { } @Override - public boolean isTrace() { - return false; - } - - @Override - public void debug(String msg) { - } - - @Override - public void trace(String msg) { + public void debug(String msg, Object... args) { } }; diff --git a/ebean-test/src/test/java/io/ebean/xtest/internal/server/transaction/TransactionManagerTest.java b/ebean-test/src/test/java/io/ebean/xtest/internal/server/transaction/TransactionManagerTest.java index 0229250b7..5b97c8b0c 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/internal/server/transaction/TransactionManagerTest.java +++ b/ebean-test/src/test/java/io/ebean/xtest/internal/server/transaction/TransactionManagerTest.java @@ -34,7 +34,7 @@ public class TransactionManagerTest extends BaseTestCase { DataSource dataSource = transactionManager.dataSource(); Connection connection = dataSource.getConnection(); try { - SpiTransaction externalTxn = new ExternalJdbcTransaction("external0", true, connection, null); + SpiTransaction externalTxn = new ExternalJdbcTransaction(true, connection, null); // push an externally managed transaction onto scope ScopedTransaction scopedTransaction = transactionManager.externalBeginTransaction(externalTxn, TxScope.required());