r405 - in testTopiaPostgresError/trunk: . src/main/java/org/nuiton/test/topia src/main/resources
Author: fdesbois Date: 2010-04-18 12:14:54 +0200 (Sun, 18 Apr 2010) New Revision: 405 Log: 2nd version : two thread one read and one write. Added: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/AbstractThread.java testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ReadThread.java testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TestManager.java testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/WriteThread.java Removed: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ThreadTest.java testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TopiaManager.java Modified: testTopiaPostgresError/trunk/README.txt testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/StartTest.java testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/StopTest.java testTopiaPostgresError/trunk/src/main/resources/log4j.properties Modified: testTopiaPostgresError/trunk/README.txt =================================================================== --- testTopiaPostgresError/trunk/README.txt 2010-04-16 18:57:32 UTC (rev 404) +++ testTopiaPostgresError/trunk/README.txt 2010-04-18 10:14:54 UTC (rev 405) @@ -0,0 +1,8 @@ +To run the test : +mvn clean install tomcat:run -Dtopiatest.home=/home/fdesbois/.local/topiatest + +Then open a browser to start the appli : +http://localhost:8080/test-topia-postgres-error/start + +To stop the appli : +http://localhost:8080/test-topia-postgres-error/stop Added: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/AbstractThread.java =================================================================== --- testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/AbstractThread.java (rev 0) +++ testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/AbstractThread.java 2010-04-18 10:14:54 UTC (rev 405) @@ -0,0 +1,82 @@ + +package org.nuiton.test.topia; + +import org.apache.commons.lang.time.DurationFormatUtils; +import org.nuiton.topia.TopiaException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * AbstractThread + * + * Created: 16 avr. 2010 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public abstract class AbstractThread implements Runnable { + + private static final Logger logger = + LoggerFactory.getLogger(AbstractThread.class); + + + protected TestManager manager = TestManager.getInstance(); + + protected volatile boolean stop; + + protected long startTime; + + protected long startMilliseconds; + + protected String name; + + public AbstractThread(long startMilliseconds, String name) { + this.startMilliseconds = startMilliseconds; + this.name = name; + } + + public synchronized void stop() { + stop = true; + } + + @Override + public void run() { + + if (logger.isInfoEnabled()) { + logger.info("Start " + name + " in " + startMilliseconds + "ms"); + } + + startTime = System.currentTimeMillis(); + try { + Thread.sleep(startMilliseconds); + } catch (InterruptedException eee) { + if (logger.isErrorEnabled()) { + logger.error("Thread interrupted during sleep", eee); + } + } + + while(!stop) { + try { + execute(); + } catch (TopiaException eee) { + long stopTime = System.currentTimeMillis(); + if (logger.isErrorEnabled()) { + logger.error("ERROR after " + + DurationFormatUtils.formatDurationHMS( + stopTime - startTime), eee); + } + // Will stop the application + manager.stopTest(); + } + } + + if (logger.isInfoEnabled()) { + logger.info("Stop " + name); + } + } + + protected abstract void execute() throws TopiaException; +} Property changes on: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/AbstractThread.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Added: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ReadThread.java =================================================================== --- testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ReadThread.java (rev 0) +++ testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ReadThread.java 2010-04-18 10:14:54 UTC (rev 405) @@ -0,0 +1,70 @@ + +package org.nuiton.test.topia; + +import java.util.List; +import org.apache.commons.lang.time.DurationFormatUtils; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.migration.MigrationServiceDAOHelper; +import org.nuiton.topia.migration.TMSVersion; +import org.nuiton.topia.migration.TMSVersionDAO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ThreadTest + * + * Created: 16 avr. 2010 + * + * @author fdesbois + */ +public class ReadThread extends AbstractThread { + + private static final Logger logger = + LoggerFactory.getLogger(ReadThread.class); + + protected int tic; + + public ReadThread() { + super(1000, ReadThread.class.getName()); + } + + @Override + protected synchronized void execute() throws TopiaException { + TopiaContext transaction = null; + try { + transaction = manager.getRootContext().beginTransaction(); + + TMSVersionDAO dao = + MigrationServiceDAOHelper.getTMSVersionDAO(transaction); + + List<TMSVersion> versions = dao.findAll(); + + if (logger.isDebugEnabled()) { + logger.debug("Reading " + versions.size() + " entries"); + } + + Thread.sleep(500); + + tic++; + + if ((tic % 100 == 0) && logger.isInfoEnabled()) { + long stopTime = System.currentTimeMillis(); + long time = stopTime - startTime; + + logger.info(versions.size() + " values read after " + + DurationFormatUtils.formatDurationHMS(time)); + } + + } catch (InterruptedException eee) { + if (logger.isErrorEnabled()) { + logger.error("Thread interrupted during sleep", eee); + } + } finally { + if (transaction != null) { + transaction.closeContext(); + } + } + } + +} Property changes on: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ReadThread.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/StartTest.java =================================================================== --- testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/StartTest.java 2010-04-16 18:57:32 UTC (rev 404) +++ testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/StartTest.java 2010-04-18 10:14:54 UTC (rev 405) @@ -50,7 +50,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - TopiaManager.getInstance().startTest(); + TestManager.getInstance().startTest(); } /** Modified: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/StopTest.java =================================================================== --- testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/StopTest.java 2010-04-16 18:57:32 UTC (rev 404) +++ testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/StopTest.java 2010-04-18 10:14:54 UTC (rev 405) @@ -32,7 +32,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - TopiaManager.getInstance().stopTest(); + TestManager.getInstance().stopTest(); } /** Copied: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TestManager.java (from rev 404, testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TopiaManager.java) =================================================================== --- testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TestManager.java (rev 0) +++ testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TestManager.java 2010-04-18 10:14:54 UTC (rev 405) @@ -0,0 +1,141 @@ + +package org.nuiton.test.topia; + +import java.util.Locale; +import java.util.Properties; +import java.util.logging.Level; +import org.nuiton.i18n.I18n; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaContextFactory; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.TopiaNotFoundException; +import org.nuiton.topia.migration.MigrationServiceDAOHelper; +import org.nuiton.topia.migration.TMSVersion; +import org.nuiton.topia.migration.TMSVersionDAO; +import org.nuiton.topia.migration.TMSVersionImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * TopiaManager + * + * Created: 16 avr. 2010 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class TestManager { + + private static final Logger logger = + LoggerFactory.getLogger(TestManager.class); + +// protected ApplicationConfig configuration; + + protected static TestManager instance; + + protected Properties configuration; + + protected WriteThread writeThread; + + protected ReadThread readThread; + + public static TestManager getInstance() { + if (instance == null) { + instance = new TestManager(); + } + return instance; + } + + private TestManager() { + configuration = new Properties(); + // Config for Postgres + configuration.put("hibernate.hbm2ddl.auto", "create"); + configuration.put("hibernate.show_sql", "false"); + configuration.put("hibernate.dialect", + "org.hibernate.dialect.PostgreSQLDialect"); + configuration.put("hibernate.connection.username","topia"); + configuration.put("hibernate.connection.password",""); + configuration.put("hibernate.connection.driver_class", + "org.postgresql.Driver"); + configuration.put("hibernate.connection.url", + "jdbc:postgresql:topiatest"); + + // Config for Topia service Migration + configuration.put("topia.persistence.classes", + TMSVersionImpl.class.getName()); + + I18n.init(Locale.FRANCE); + + // Create first entry +// TopiaContext transaction = null; +// try { +// if (logger.isInfoEnabled()) { +// logger.info("Open first transaction to create main entry"); +// } +// transaction = TopiaContextFactory.getContext(configuration). +// beginTransaction(); +// TMSVersionDAO dao = +// MigrationServiceDAOHelper.getTMSVersionDAO(transaction); +// +// TMSVersion entry = dao.create(TMSVersion.VERSION, "1"); +// +// mainTopiaId = entry.getTopiaId(); +// if (logger.isInfoEnabled()) { +// logger.info("Save the entry with id = " + mainTopiaId); +// } +// transaction.commitTransaction(); +// +// } catch (TopiaException eee) { +// if (logger.isErrorEnabled()) { +// logger.error("Error when create the first entry : ", eee); +// } +// } finally { +// if (transaction != null) { +// try { +// transaction.closeContext(); +// } catch (TopiaException eee) { +// if (logger.isErrorEnabled()) { +// logger.error("Error on closeContext : ", eee); +// } +// } +// } +// } + } + + public TopiaContext getRootContext() throws TopiaNotFoundException { + return TopiaContextFactory.getContext(configuration); + } + + public void startTest() { + if (writeThread == null) { + writeThread = new WriteThread(); + new Thread(writeThread).start(); + } + if (readThread == null) { + readThread = new ReadThread(); + new Thread(readThread).start(); + } + } + + public void stopTest() { + if (writeThread != null) { + writeThread.stop(); + writeThread = null; + } + if (readThread != null) { + readThread.stop(); + readThread = null; + } + try { + getRootContext().closeContext(); + } catch (TopiaException eee) { + if (logger.isErrorEnabled()) { + logger.error("Error on close root context : ", eee); + } + } + } + +} Property changes on: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TestManager.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Added: svn:mergeinfo + Deleted: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ThreadTest.java =================================================================== --- testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ThreadTest.java 2010-04-16 18:57:32 UTC (rev 404) +++ testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ThreadTest.java 2010-04-18 10:14:54 UTC (rev 405) @@ -1,96 +0,0 @@ - -package org.nuiton.test.topia; - -import org.apache.commons.lang.time.DurationFormatUtils; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaException; -import org.nuiton.topia.migration.MigrationServiceDAOHelper; -import org.nuiton.topia.migration.TMSVersion; -import org.nuiton.topia.migration.TMSVersionDAO; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * ThreadTest - * - * Created: 16 avr. 2010 - * - * @author fdesbois - */ -public class ThreadTest implements Runnable { - - private static final Logger logger = - LoggerFactory.getLogger(ThreadTest.class); - - protected TopiaManager manager = TopiaManager.getInstance(); - - protected volatile boolean stop; - - protected long startTime; - - public synchronized void stop() { - stop = true; - } - - @Override - public void run() { - - if (logger.isInfoEnabled()) { - logger.info("Start Thread"); - } - - startTime = System.currentTimeMillis(); - - while(!stop) { - try { - execute(); - } catch (TopiaException eee) { - long stopTime = System.currentTimeMillis(); - if (logger.isErrorEnabled()) { - logger.error("ERROR after " + - DurationFormatUtils.formatDurationHMS( - stopTime - startTime), eee); - } - manager.stopTest(); - } - } - - if (logger.isInfoEnabled()) { - logger.info("Stop Thread"); - } - } - - protected synchronized void execute() throws TopiaException { - TopiaContext transaction = null; - try { - transaction = manager.getRootContext().beginTransaction(); - - TMSVersionDAO dao = - MigrationServiceDAOHelper.getTMSVersionDAO(transaction); - - TMSVersion version = dao.findByTopiaId(manager.getMainTopiaId()); - - Thread.sleep(100); - - int value = Integer.parseInt(version.getVersion()); - version.setVersion(String.valueOf(value + 1)); - - if ((value % 500 == 0) && logger.isInfoEnabled()) { - long stopTime = System.currentTimeMillis(); - logger.info("Value is " + version.getVersion() + " after " + - DurationFormatUtils.formatDurationHMS(stopTime - startTime)); - } - - transaction.commitTransaction(); - } catch (InterruptedException eee) { - if (logger.isErrorEnabled()) { - logger.error("Thread interrupted during sleep", eee); - } - } finally { - if (transaction != null) { - transaction.closeContext(); - } - } - } - -} Deleted: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TopiaManager.java =================================================================== --- testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TopiaManager.java 2010-04-16 18:57:32 UTC (rev 404) +++ testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/TopiaManager.java 2010-04-18 10:14:54 UTC (rev 405) @@ -1,136 +0,0 @@ - -package org.nuiton.test.topia; - -import java.util.Locale; -import java.util.Properties; -import java.util.logging.Level; -import org.nuiton.i18n.I18n; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaContextFactory; -import org.nuiton.topia.TopiaException; -import org.nuiton.topia.TopiaNotFoundException; -import org.nuiton.topia.migration.MigrationServiceDAOHelper; -import org.nuiton.topia.migration.TMSVersion; -import org.nuiton.topia.migration.TMSVersionDAO; -import org.nuiton.topia.migration.TMSVersionImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * TopiaManager - * - * Created: 16 avr. 2010 - * - * @author fdesbois - * @version $Revision$ - * - * Mise a jour: $Date$ - * par : $Author$ - */ -public class TopiaManager { - - private static final Logger logger = - LoggerFactory.getLogger(TopiaManager.class); - -// protected ApplicationConfig configuration; - - protected static TopiaManager instance; - - protected Properties configuration; - - protected String mainTopiaId; - - protected ThreadTest thread; - - public static TopiaManager getInstance() { - if (instance == null) { - instance = new TopiaManager(); - } - return instance; - } - - private TopiaManager() { - configuration = new Properties(); - // Config for Postgres - configuration.put("hibernate.hbm2ddl.auto", "create"); - configuration.put("hibernate.show_sql", "false"); - configuration.put("hibernate.dialect", - "org.hibernate.dialect.PostgreSQLDialect"); - configuration.put("hibernate.connection.username","topia"); - configuration.put("hibernate.connection.password",""); - configuration.put("hibernate.connection.driver_class", - "org.postgresql.Driver"); - configuration.put("hibernate.connection.url", - "jdbc:postgresql:topiatest"); - - // Config for Topia service Migration - configuration.put("topia.persistence.classes", - TMSVersionImpl.class.getName()); - - I18n.init(Locale.FRANCE); - - // Create first entry - TopiaContext transaction = null; - try { - if (logger.isInfoEnabled()) { - logger.info("Open first transaction to create main entry"); - } - transaction = TopiaContextFactory.getContext(configuration). - beginTransaction(); - TMSVersionDAO dao = - MigrationServiceDAOHelper.getTMSVersionDAO(transaction); - - TMSVersion entry = dao.create(TMSVersion.VERSION, "1"); - - mainTopiaId = entry.getTopiaId(); - if (logger.isInfoEnabled()) { - logger.info("Save the entry with id = " + mainTopiaId); - } - transaction.commitTransaction(); - - } catch (TopiaException eee) { - if (logger.isErrorEnabled()) { - logger.error("Error when create the first entry : ", eee); - } - } finally { - if (transaction != null) { - try { - transaction.closeContext(); - } catch (TopiaException eee) { - if (logger.isErrorEnabled()) { - logger.error("Error on closeContext : ", eee); - } - } - } - } - } - - public TopiaContext getRootContext() throws TopiaNotFoundException { - return TopiaContextFactory.getContext(configuration); - } - - public String getMainTopiaId() { - return mainTopiaId; - } - - public void startTest() { - if (thread == null) { - thread = new ThreadTest(); - new Thread(thread).start(); - } - } - - public void stopTest() { - if (thread != null) { - thread.stop(); - try { - getRootContext().closeContext(); - } catch (TopiaException eee) { - if (logger.isErrorEnabled()) { - logger.error("Error on close root context : ", eee); - } - } - } - } - -} Copied: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/WriteThread.java (from rev 404, testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/ThreadTest.java) =================================================================== --- testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/WriteThread.java (rev 0) +++ testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/WriteThread.java 2010-04-18 10:14:54 UTC (rev 405) @@ -0,0 +1,141 @@ + +package org.nuiton.test.topia; + +import java.util.Random; +import org.apache.commons.lang.time.DurationFormatUtils; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.framework.TopiaQuery; +import org.nuiton.topia.migration.MigrationServiceDAOHelper; +import org.nuiton.topia.migration.TMSVersion; +import org.nuiton.topia.migration.TMSVersionDAO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ThreadTest + * + * Created: 16 avr. 2010 + * + * @author fdesbois + */ +public class WriteThread extends AbstractThread { + + private static final Logger logger = + LoggerFactory.getLogger(WriteThread.class); + + protected int increment; + + protected int tic; + + public WriteThread() { + super(0, WriteThread.class.getName()); + } + + /** + * Create an entry at random over 10, update an existing one over 20 + * and delete one over 100. + * The field version is used to save the increment global (total number + * of saved). + * + * @throws TopiaException + */ + @Override + protected synchronized void execute() throws TopiaException { + TopiaContext transaction = null; + try { + transaction = manager.getRootContext().beginTransaction(); + + TMSVersionDAO dao = + MigrationServiceDAOHelper.getTMSVersionDAO(transaction); + + Random random = new Random(); + // Create an alea between 0 and 1000 + int alea = (int)(random.nextFloat() * 1000); + + boolean actionDone = false; + + // DELETE if alea is divided by 100 + if (alea % 100 == 0) { + // Alea number over number of existing entries + int alea2 = (int)(random.nextFloat() * dao.size()); + + // Only one row will be return + TopiaQuery query = dao.createQuery().setLimit(alea2, alea2 + 1); + TMSVersion exist = dao.findByQuery(query); + + if (exist == null && logger.isWarnEnabled()) { + logger.warn("the entry doesn't exist in position " + + alea2 + " ?!?"); + } else { + if (logger.isDebugEnabled()) { + logger.debug("delete the " + increment + " entry id = " + + exist.getTopiaId()); + } + dao.delete(exist); + increment++; + transaction.commitTransaction(); + actionDone = true; + } + // UPDATE if alea is divided by 20 + } else if (alea % 20 == 0) { + + // Alea number over number of existing entries + int alea2 = (int)(random.nextFloat() * dao.size()); + + // Only one row will be return + TopiaQuery query = dao.createQuery().setLimit(alea2, alea2 + 1); + TMSVersion exist = dao.findByQuery(query); + + if (exist == null && logger.isWarnEnabled()) { + logger.warn("the entry doesn't exist in position " + + alea2 + " ?!?"); + } else { + if (logger.isDebugEnabled()) { + logger.debug("update the " + increment + " entry id = " + + exist.getTopiaId()); + } + exist.setVersion(String.valueOf(increment)); + increment++; + transaction.commitTransaction(); + actionDone = true; + } + // CREATE if alea is divided by 10 + } else if (alea % 10 == 0) { + + TMSVersion create = dao.create(TMSVersion.VERSION, + String.valueOf(increment)); + + if (logger.isDebugEnabled()) { + logger.debug("create the " + increment + " entry id = " + + create.getTopiaId()); + } + + increment ++; + transaction.commitTransaction(); + actionDone = true; + } + + Thread.sleep(100); + + tic++; + + if ((tic % 600 == 0) && logger.isInfoEnabled()) { + long stopTime = System.currentTimeMillis(); + long time = stopTime - startTime; + + logger.info(increment + " create/update or delete actions" + + " after " + DurationFormatUtils.formatDurationHMS(time)); + } + } catch (InterruptedException eee) { + if (logger.isErrorEnabled()) { + logger.error("Thread interrupted during sleep", eee); + } + } finally { + if (transaction != null) { + transaction.closeContext(); + } + } + } + +} Property changes on: testTopiaPostgresError/trunk/src/main/java/org/nuiton/test/topia/WriteThread.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Added: svn:mergeinfo + Modified: testTopiaPostgresError/trunk/src/main/resources/log4j.properties =================================================================== --- testTopiaPostgresError/trunk/src/main/resources/log4j.properties 2010-04-16 18:57:32 UTC (rev 404) +++ testTopiaPostgresError/trunk/src/main/resources/log4j.properties 2010-04-18 10:14:54 UTC (rev 405) @@ -1,12 +1,17 @@ # Global logging configuration -log4j.rootLogger=INFO, stdout, file +log4j.rootLogger=DEBUG, stdout, file # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.Threshold=INFO log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%c:%L) %M - %m%n -log4j.appender.file=org.apache.log4j.FileAppender -log4j.appender.file.file=${topiatest.log.home}/topiatest.log +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.file=${topiatest.home}/topiatest.log +log4j.appender.file.MaxFileSize=10MB +log4j.appender.file.Append=true +log4j.appender.file.Threshold=DEBUG +log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss} %5p [%t] (%c:%L) %M - %m%n
participants (1)
-
fdesbois@users.nuiton.org