You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by dp...@apache.org on 2008/10/07 15:54:23 UTC
svn commit: r702482 - in /jackrabbit/sandbox/jackrabbit-journalwalker: ./
src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/jackrabbit/
src/main/java/org/apache/jackrabbit/journalwalker/ src/main/resour...
Author: dpfister
Date: Tue Oct 7 06:54:23 2008
New Revision: 702482
URL: http://svn.apache.org/viewvc?rev=702482&view=rev
Log:
JCR-1791 - New utility: Journal walker for journal files
Added:
jackrabbit/sandbox/jackrabbit-journalwalker/
jackrabbit/sandbox/jackrabbit-journalwalker/README.txt (with props)
jackrabbit/sandbox/jackrabbit-journalwalker/pom.xml (with props)
jackrabbit/sandbox/jackrabbit-journalwalker/src/
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/journalwalker/
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/journalwalker/JournalWalker.java (with props)
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/resources/
jackrabbit/sandbox/jackrabbit-journalwalker/src/main/resources/log4j.properties (with props)
Added: jackrabbit/sandbox/jackrabbit-journalwalker/README.txt
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-journalwalker/README.txt?rev=702482&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-journalwalker/README.txt (added)
+++ jackrabbit/sandbox/jackrabbit-journalwalker/README.txt Tue Oct 7 06:54:23 2008
@@ -0,0 +1,79 @@
+=============================================
+Welcome to the Jackrabbit Journal Walker Tool
+=============================================
+
+This is the Jackrabbit Journal Walker Tool that provides
+command-line functionality to walk the records contained
+in a file journal created by a clustered instance and
+display their contents.
+
+See the Apache Jackrabbit web site (http://jackrabbit.apache.org/)
+for documentation and other information. You are welcome to join the
+Jackrabbit mailing lists (http://jackrabbit.apache.org/mail-lists.html)
+to discuss this compoment and to use the Jackrabbit issue tracker
+(http://issues.apache.org/jira/browse/JCR) to report issues or request
+new features.
+
+Apache Jackrabbit is a project of the Apache Software Foundation
+(http://www.apache.org).
+
+
+License (see also LICENSE.txt)
+==============================
+
+Collective work: Copyright 20088888888 The Apache Software Foundation.
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Getting Started
+===============
+
+This compoment uses a Maven 2 (http://maven.apache.org/) build
+environment. If you have Maven 2 installed, you can compile and
+package the jacrabbit-api jar using the following command:
+
+ mvn package
+
+See the Maven 2 documentation for other build features.
+
+The latest source code for this compoment is available in the
+Subversion (http://subversion.tigris.org/) source repository of
+the Apache Software Foundation. If you have Subversion installed,
+you can checkout the latest source using the following command:
+
+ svn checkout http://svn.apache.org/repos/asf/jackrabbit/sandbox/jackrabbit-journalwalker
+
+See the Subversion documentation for other source control features.
+
+
+Installation
+============
+
+After building, the created jar file in the target/ directory can
+be "installed" by unpacking it's lib directory which contains libraries.
+
+ jar xf jackrabbit-journalwalker-<version>.jar lib/
+
+
+Displaying journal contents
+===========================
+
+Usage: directory [revision]
+
+directory: is the directory where journal files are located
+revision: is an optional argument specifying the revision to start with
+
Propchange: jackrabbit/sandbox/jackrabbit-journalwalker/README.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/sandbox/jackrabbit-journalwalker/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-journalwalker/pom.xml?rev=702482&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-journalwalker/pom.xml (added)
+++ jackrabbit/sandbox/jackrabbit-journalwalker/pom.xml Tue Oct 7 06:54:23 2008
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+ http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <prerequisites>
+ <maven>2.0.4</maven>
+ </prerequisites>
+ <groupId>org.apache.jackrabbit</groupId>
+ <parent>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>jackrabbit</artifactId>
+ <version>1.5-SNAPSHOT</version>
+ </parent>
+ <artifactId>jackrabbit-journalwalker</artifactId>
+ <version>1.5-SNAPSHOT</version>
+ <packaging>jar</packaging>
+ <name>Jackrabbit Journal Walker</name>
+ <description>Jackrabbit Journal Walker</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>jackrabbit-core</artifactId>
+ <version>1.5-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.jcr</groupId>
+ <artifactId>jcr</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </dependency>
+ </dependencies>
+ <build>
+ <defaultGoal>package</defaultGoal>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <index>true</index>
+ <manifest>
+ <addClasspath>true</addClasspath>
+ <classpathPrefix>lib</classpathPrefix>
+ </manifest>
+ <manifestEntries>
+ <Main-Class>
+ org.apache.jackrabbit.journalwalker.JournalWalker
+ </Main-Class>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-dependencies</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <outputDirectory>
+ ${project.build.directory}/classes/lib
+ </outputDirectory>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
Propchange: jackrabbit/sandbox/jackrabbit-journalwalker/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/journalwalker/JournalWalker.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/journalwalker/JournalWalker.java?rev=702482&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/journalwalker/JournalWalker.java (added)
+++ jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/journalwalker/JournalWalker.java Tue Oct 7 06:54:23 2008
@@ -0,0 +1,405 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.journalwalker;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.jcr.NamespaceException;
+
+import org.apache.commons.collections.BidiMap;
+import org.apache.commons.collections.bidimap.DualHashBidiMap;
+import org.apache.jackrabbit.core.ItemId;
+import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.PropertyId;
+import org.apache.jackrabbit.core.cluster.ChangeLogRecord;
+import org.apache.jackrabbit.core.cluster.ClusterRecordDeserializer;
+import org.apache.jackrabbit.core.cluster.ClusterRecordProcessor;
+import org.apache.jackrabbit.core.cluster.LockRecord;
+import org.apache.jackrabbit.core.cluster.NamespaceRecord;
+import org.apache.jackrabbit.core.cluster.NodeTypeRecord;
+import org.apache.jackrabbit.core.journal.FileJournal;
+import org.apache.jackrabbit.core.journal.JournalException;
+import org.apache.jackrabbit.core.journal.Record;
+import org.apache.jackrabbit.core.journal.RecordConsumer;
+import org.apache.jackrabbit.core.nodetype.NodeTypeDef;
+import org.apache.jackrabbit.core.observation.EventState;
+import org.apache.jackrabbit.core.state.ChangeLog;
+import org.apache.jackrabbit.core.state.ItemState;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
+import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Walks over file journal records, showing their contents in a human readable
+ * form.
+ */
+public class JournalWalker implements RecordConsumer, NamespaceResolver,
+ ClusterRecordProcessor {
+
+ /**
+ * Default record producer.
+ */
+ private static final String DEFAULT_PRODUCER = "JR";
+
+ /**
+ * Logger.
+ */
+ private static Logger log = LoggerFactory.getLogger(JournalWalker.class);
+
+ /**
+ * Record deserializer.
+ */
+ private ClusterRecordDeserializer deserializer = new ClusterRecordDeserializer();
+
+ /**
+ * Id.
+ */
+ private String id;
+
+ /**
+ * Revision.
+ */
+ private long revision;
+
+ /**
+ * Map of registered name spaces.
+ */
+ private BidiMap namespaces = new DualHashBidiMap();
+
+ /**
+ * Id to Path translations.
+ */
+ private Map pathMap = new HashMap();
+
+ /**
+ * Create a new instance of this class.
+ */
+ public JournalWalker(String id, long revision) {
+ this.id = id;
+ this.revision = revision;
+ }
+
+ /**
+ * Log an operation.
+ *
+ * @param op operation identifier
+ * @param workspace workspace name
+ * @param id item id
+ */
+ public void log(char op, String workspace, ItemId id) {
+ StringBuffer buf = new StringBuffer();
+ buf.append(op);
+ buf.append(" ");
+ buf.append(workspace);
+ buf.append(':');
+ buf.append(lookupPath(id));
+ log(buf.toString());
+ }
+
+ /**
+ * Log a message.
+ *
+ * @param msg
+ */
+ public void log(String msg) {
+ System.out.println(msg);
+ }
+
+ //----------------------------------------------------------- RecordConsumer
+
+ /**
+ * {@inheritDoc}
+ */
+ public void consume(Record record) {
+ long recordRevision = record.getRevision();
+
+ try {
+ deserializer.deserialize(record).process(this);
+ } catch (JournalException e) {
+ String msg = "Unable to read revision '" + record.getRevision() + "'.";
+ log.error(msg, e);
+ return;
+ }
+
+ log("Updated to revision " + recordRevision + ".");
+ log("");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getRevision() {
+ return revision;
+ }
+
+ //--------------------------------------------------- ClusterRecordProcessor
+
+ /**
+ * {@inheritDoc}
+ */
+ public void process(ChangeLogRecord record) {
+ Iterator iter = record.getEvents().iterator();
+ while (iter.hasNext()) {
+ EventState event = (EventState) iter.next();
+ eventGenerated(event.getType(), event.getParentId(),
+ event.getParentPath(), event.getChildId(),
+ event.getChildRelPath(), event.getNodeType(),
+ event.getMixinNames(), event.getUserId());
+ }
+
+ ChangeLog changes = record.getChanges();
+ iter = changes.deletedStates();
+ while (iter.hasNext()) {
+ ItemState state = (ItemState) iter.next();
+ log('D', record.getWorkspace(), state.getId());
+ }
+ iter = changes.modifiedStates();
+ while (iter.hasNext()) {
+ ItemState state = (ItemState) iter.next();
+ log('U', record.getWorkspace(), state.getId());
+ }
+ iter = changes.addedStates();
+ while (iter.hasNext()) {
+ ItemState state = (ItemState) iter.next();
+ log('A', record.getWorkspace(), state.getId());
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void process(LockRecord record) {
+ log(record.isLock() ? 'L' : 'l', record.getWorkspace(), record.getNodeId());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void process(NamespaceRecord record) {
+ String oldPrefix = record.getOldPrefix();
+ String newPrefix = record.getNewPrefix();
+ String uri = record.getUri();
+
+ if (oldPrefix != null) {
+ namespaces.remove(oldPrefix);
+ }
+ if (newPrefix != null) {
+ namespaces.put(newPrefix, uri);
+ }
+
+ StringBuffer buf = new StringBuffer();
+ buf.append("S ");
+ buf.append(newPrefix);
+ buf.append("=");
+ buf.append(uri);
+ log(buf.toString());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void process(NodeTypeRecord record) {
+ Iterator iter;
+
+ switch (record.getOperation()) {
+ case NodeTypeRecord.REGISTER:
+ case NodeTypeRecord.REREGISTER:
+ iter = record.getCollection().iterator();
+ while (iter.hasNext()) {
+ NodeTypeDef ntd = (NodeTypeDef) iter.next();
+ StringBuffer buf = new StringBuffer();
+ buf.append("R ");
+ buf.append(nameToString(ntd.getName()));
+ log(buf.toString());
+ }
+ break;
+ case NodeTypeRecord.UNREGISTER:
+ iter = record.getCollection().iterator();
+ while (iter.hasNext()) {
+ Name name = (Name) iter.next();
+ StringBuffer buf = new StringBuffer();
+ buf.append("r ");
+ buf.append(nameToString(name));
+ log(buf.toString());
+ }
+ break;
+ }
+ }
+
+ //-------------------------------------------------------- NamespaceResolver
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setRevision(long revision) {
+ this.revision = revision;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getPrefix(String uri) throws NamespaceException {
+ String prefix = (String) namespaces.getKey(uri);
+ return prefix != null ? prefix : uri;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getURI(String prefix) throws NamespaceException {
+ String uri = (String) namespaces.get(prefix);
+ return uri != null ? uri : prefix;
+ }
+
+ //----------------------------------------------------------- implementation
+
+ /**
+ * Process an event. Populates an internal path map.
+ */
+ private void eventGenerated(int type, NodeId parentId, Path parentPath,
+ NodeId childId, Path.Element childRelPath,
+ Name ntName, Set mixins, String userId) {
+
+ if (!pathMap.containsKey(parentId)) {
+ pathMap.put(parentId, pathToString(parentPath));
+ }
+ if (childId != null && !pathMap.containsKey(childId)) {
+ Path childPath = combinePath(parentPath, childRelPath);
+ pathMap.put(childId, pathToString(childPath));
+ }
+ }
+
+ /**
+ * Return string representation of the path associated with a given id.
+ *
+ * @param id item id
+ * @return path
+ */
+ private final String lookupPath(ItemId id) {
+ NodeId nodeId = null;
+ Name relName = null;
+ if (id instanceof NodeId) {
+ nodeId = (NodeId) id;
+ } else {
+ nodeId = ((PropertyId) id).getParentId();
+ relName = ((PropertyId) id).getName();
+ }
+ StringBuffer buf = new StringBuffer();
+ String path = (String) pathMap.get(nodeId);
+ buf.append(path != null ? path : nodeId.toString());
+ if (relName != null) {
+ buf.append('/');
+ buf.append(nameToString(relName));
+ }
+ return buf.length() == 0 ? "/" : buf.toString();
+ }
+
+ /**
+ * Convert a <code>Path</code> into a simple string representation.
+ *
+ * @param path path
+ * @return simple string representation
+ */
+ private String pathToString(Path path) {
+ StringBuffer buf = new StringBuffer();
+
+ Path.Element[] elements = path.getElements();
+ for (int i = 1; i < elements.length; i++) {
+ buf.append('/');
+ buf.append(nameToString(elements[i].getName()));
+ }
+ return buf.length() == 0 ? "" : buf.toString();
+ }
+
+ /**
+ * Convert a <code>Name</code> into a simple string representation.
+ *
+ * @param name name
+ * @return simple string representation
+ */
+ private String nameToString(Name name) {
+ String nsURI = name.getNamespaceURI();
+ if (nsURI.equals("")) {
+ return name.getLocalName();
+ } else if (nsURI.startsWith("http://")) {
+ String prefix = (String) namespaces.getKey(nsURI);
+ if (prefix != null) {
+ nsURI = prefix;
+ }
+ }
+ StringBuffer buf = new StringBuffer();
+ buf.append(nsURI);
+ buf.append(':');
+ buf.append(name.getLocalName());
+ return buf.toString();
+ }
+
+ /**
+ * Combine a parent path and a child relative path.
+ *
+ * @param parent parent path
+ * @param childRelPath child relative path
+ * @return combined path
+ */
+ private static Path combinePath(Path parent, Path.Element childRelPath) {
+ Path.Element[] elements = parent.getElements();
+ Path.Element[] result = new Path.Element[elements.length + 1];
+ System.arraycopy(elements, 0, result, 0, elements.length);
+ result[result.length - 1] = childRelPath;
+ return PathFactoryImpl.getInstance().create(elements);
+ }
+
+ /**
+ * Main entry point
+ * @param args program arguments
+ */
+ public static void main(String[] args) throws Exception {
+ if (args.length == 0) {
+ System.err.println("args: directory [revision]");
+ System.exit(1);
+ return;
+ }
+
+ FileJournal journal = new FileJournal();
+ journal.setRevision("revision.log");
+ journal.setDirectory(args[0]);
+
+ long revision = 0L;
+
+ if (args.length > 1) {
+ revision = Long.parseLong(args[1]);
+ }
+ JournalWalker walker = new JournalWalker(DEFAULT_PRODUCER, revision);
+ journal.init("", walker);
+ journal.register(walker);
+ journal.sync();
+ }
+}
+
Propchange: jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/journalwalker/JournalWalker.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/sandbox/jackrabbit-journalwalker/src/main/java/org/apache/jackrabbit/journalwalker/JournalWalker.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev Url
Added: jackrabbit/sandbox/jackrabbit-journalwalker/src/main/resources/log4j.properties
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-journalwalker/src/main/resources/log4j.properties?rev=702482&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-journalwalker/src/main/resources/log4j.properties (added)
+++ jackrabbit/sandbox/jackrabbit-journalwalker/src/main/resources/log4j.properties Tue Oct 7 06:54:23 2008
@@ -0,0 +1,36 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Set root logger level to DEBUG and its only appender to A1.
+log4j.rootLogger=INFO, file
+#log4j.rootLogger=DEBUG, stdout, file
+#log4j.rootLogger=ERROR, stdout, file
+
+log4j.logger.org.apache.jackrabbit.test=DEBUG
+
+# 'stdout' is set to be a ConsoleAppender.
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+
+# 'stdout' uses PatternLayout
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} *%-5p* [%t] %c{1}: %m (%F, line %L)\n
+
+# 'file' is set to be a FileAppender.
+log4j.appender.file=org.apache.log4j.FileAppender
+log4j.appender.file.File=target/jcr.log
+
+# 'file' uses PatternLayout.
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} *%-5p* [%t] %c{1}: %m (%F, line %L)\n
Propchange: jackrabbit/sandbox/jackrabbit-journalwalker/src/main/resources/log4j.properties
------------------------------------------------------------------------------
svn:eol-style = native