Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java (revision 1305275) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java (working copy) @@ -80,7 +80,12 @@ private static final int STOPPED = 2; /** - * Logger. + * Audit logger. + */ + private static Logger auditLogger = LoggerFactory.getLogger("org.apache.jackrabbit.core.audit"); + + /** + * Default Logger. */ private static Logger log = LoggerFactory.getLogger(ClusterNode.class); @@ -120,6 +125,11 @@ private final Mutex syncLock = new Mutex(); /** + * Update counter, used in displaying the number of updates in audit log. + */ + private final AtomicInteger updateCount = new AtomicInteger(); + + /** * Latch used to communicate a stop request to the synchronization thread. */ private final Latch stopLatch = new Latch(); @@ -573,6 +583,11 @@ private static final String ATTRIBUTE_RECORD = "record"; /** + * Attribute name used to store the size of the update. + */ + private static final String ATTRIBUTE_UPDATE_SIZE = "updateSize"; + + /** * Workspace name. */ private final String workspace; @@ -660,9 +675,19 @@ return; } try { - record.update(); - setRevision(record.getRevision()); - log.debug("revision {} {}", record.getRevision(), path); + long journalUpdateSize = record.update(); + + long recordRevision = record.getRevision(); + setRevision(recordRevision); + + log.debug("Stored record '{}' to Journal ({})", recordRevision, journalUpdateSize); + + long updateSize = (Long)update.getAttribute(ATTRIBUTE_UPDATE_SIZE); + updateCount.compareAndSet(Integer.MAX_VALUE, 0); + + auditLogger.info("[{}] {} {} ({})", new Object[]{updateCount.incrementAndGet(), + record.getRevision(), path, updateSize}); + } catch (JournalException e) { String msg = "Unable to commit log entry."; log.error(msg, e); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (revision 1305275) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (working copy) @@ -93,6 +93,9 @@ public abstract class AbstractBundlePersistenceManager implements PersistenceManager, CachingPersistenceManager, IterablePersistenceManager, CacheAccessListener, ConsistencyChecker { + /** the audit logger */ + private static Logger auditLogger = LoggerFactory.getLogger("org.apache.jackrabbit.core.audit"); + /** the default logger */ private static Logger log = LoggerFactory.getLogger(AbstractBundlePersistenceManager.class); @@ -683,9 +686,12 @@ } // now store all modified bundles + long updateSize = 0; for (NodePropBundle bundle : modified.values()) { putBundle(bundle); + updateSize += bundle.getSize(); } + changeLog.setUpdateSize(updateSize); // store the refs for (NodeReferences refs : changeLog.modifiedRefs()) { @@ -768,6 +774,7 @@ long time = System.nanoTime(); log.debug("Storing bundle {}", bundle.getId()); storeBundle(bundle); + auditLogger.debug("Stored bundle '{}' to PM ({})", bundle.getId(), bundle.getSize()); writeDuration.addAndGet(System.nanoTime() - time); writeCounter.incrementAndGet(); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleWriter.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleWriter.java (revision 1305275) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleWriter.java (working copy) @@ -217,6 +217,7 @@ out.writeInt(BundleBinding.BINARY_IN_DATA_STORE); val.store(dataStore); writeString(val.toString()); + log.debug("Stored {} to DataStore ({})", state.getId(), size); } break; } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/ChangeLog.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/ChangeLog.java (revision 1305275) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/ChangeLog.java (working copy) @@ -53,6 +53,8 @@ @SuppressWarnings("unchecked") private final Map modifiedRefs = (Map) new LinkedMap(); + private long updateSize; + /** * Checks whether this change log contains any changes. This method is * used to avoid extra work on updates that contain no changes. @@ -369,6 +371,24 @@ } /** + * Returns the update size of the change log. + * + * @return The update size. + */ + public long getUpdateSize() { + return updateSize; + } + + /** + * Sets the update size of the change log. + * + * @param updateSize The update size. + */ + public void setUpdateSize(long updateSize) { + this.updateSize = updateSize; + } + + /** * Returns a string representation of this change log for diagnostic * purposes. * Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (revision 1305275) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (working copy) @@ -493,6 +493,11 @@ class Update implements org.apache.jackrabbit.core.cluster.Update { /** + * Attribute name used to store the size of the update. + */ + private static final String ATTRIBUTE_UPDATE_SIZE = "updateSize"; + + /** * Local change log. */ private final ChangeLog local; @@ -768,6 +773,7 @@ /* Store items in the underlying persistence manager */ long t0 = System.currentTimeMillis(); persistMgr.store(shared); + setAttribute(ATTRIBUTE_UPDATE_SIZE, shared.getUpdateSize()); succeeded = true; if (log.isDebugEnabled()) { long t1 = System.currentTimeMillis(); @@ -805,8 +811,10 @@ // always gets released, even if a post-store() exception // is thrown from the code above. See also JCR-2272. String path = events.getSession().getUserID() - + "@" + events.getCommonPath(); + + "@" + events.getSession().getWorkspace().getName() + + ":" + events.getCommonPath(); eventChannel.updateCommitted(this, path); + setAttribute(ATTRIBUTE_UPDATE_SIZE, null); if (writeLock != null) { // exception occurred before downgrading lock Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java (revision 1305275) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java (working copy) @@ -253,7 +253,7 @@ /** * {@inheritDoc} */ - public void update() throws JournalException { + public long update() throws JournalException { boolean succeeded = false; try { @@ -265,6 +265,7 @@ try { journal.append(this, in, length); succeeded = true; + return length; } finally { try { in.close(); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/ReadRecord.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/ReadRecord.java (revision 1305275) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/ReadRecord.java (working copy) @@ -271,7 +271,7 @@ throw unsupported(); } - public void update() throws JournalException { + public long update() throws JournalException { throw unsupported(); } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/Record.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/Record.java (revision 1305275) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/Record.java (working copy) @@ -277,10 +277,11 @@ * Update the changes made to an appended record. This will also update * this record's revision. * + * @returns The update size in bytes. * @throws JournalException if this record has not been appended, * or if another error occurs */ - void update() throws JournalException; + long update() throws JournalException; /** * Cancel the changes made to an appended record.