[logback-dev] svn commit: r1891 - in logback/trunk: logback-core/src/main/java/ch/qos/logback/core logback-core/src/main/java/ch/qos/logback/core/joran logback-core/src/main/java/ch/qos/logback/core/joran/action logback-core/src/main/java/ch/qos/logback/core/spi logback-core/src/test/java/ch/qos/logback/core/joran/action logback-core/src/test/resources/asResource logback-core/src/test/resources/asResource/joran logback-core/src/test/resources/input logback-examples/src/main/java/chapter3 logback-examples/src/main/resources

noreply.ceki at qos.ch noreply.ceki at qos.ch
Tue Oct 28 15:46:33 CET 2008


Author: ceki
Date: Tue Oct 28 15:46:33 2008
New Revision: 1891

Added:
   logback/trunk/logback-core/src/test/resources/asResource/
      - copied from r1859, /logback/trunk/logback-core/src/test/resources/input/
   logback/trunk/logback-core/src/test/resources/asResource/joran/propertyActionTest.properties
   logback/trunk/logback-examples/src/main/resources/resource1.properties
Removed:
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/SubstitutionPropertyAction.java
   logback/trunk/logback-core/src/test/resources/input/
Modified:
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/ContextPropertyAction.java
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/PropertyAction.java
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachableImpl.java
   logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/IncludeActionTest.java
   logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/PackageTest.java
   logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/PropertyActionTest.java
   logback/trunk/logback-examples/src/main/java/chapter3/MyApp2.java
   logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution1.xml
   logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution2.xml
   logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution3.xml
   logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution4.xml

Log:

Fixed LBCORE-43

Properties can be read from a resource as well as file or "key/value" pairs.

Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java	(original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java	Tue Oct 28 15:46:33 2008
@@ -87,6 +87,8 @@
   public void start() {
     int errors = 0;
     if (fileName != null) {
+      addInfo("filename set to ["+fileName+"]");
+      
       // In case both bufferedIO and immediateFlush are set, the former
       // takes priority because 'immediateFlush' is set to true by default.
       // If the user explicitly set bufferedIO, then we should follow her

Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java	(original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java	Tue Oct 28 15:46:33 2008
@@ -23,8 +23,8 @@
 import ch.qos.logback.core.joran.action.NestedComplexPropertyIA;
 import ch.qos.logback.core.joran.action.NewRuleAction;
 import ch.qos.logback.core.joran.action.ParamAction;
+import ch.qos.logback.core.joran.action.PropertyAction;
 import ch.qos.logback.core.joran.action.StatusListenerAction;
-import ch.qos.logback.core.joran.action.SubstitutionPropertyAction;
 import ch.qos.logback.core.joran.spi.InterpretationContext;
 import ch.qos.logback.core.joran.spi.Interpreter;
 import ch.qos.logback.core.joran.spi.Pattern;
@@ -52,10 +52,18 @@
 
   @Override
   protected void addInstanceRules(RuleStore rs) {
+   
+    rs.addRule(new Pattern("configuration/property"),
+        new PropertyAction());
+    
     rs.addRule(new Pattern("configuration/substitutionProperty"),
-        new SubstitutionPropertyAction());
+        new PropertyAction());
+    
+    // the contextProperty pattern is deprecated. It is undocumented
+    // and will be dropped in future versions of logback
     rs.addRule(new Pattern("configuration/contextProperty"),
         new ContextPropertyAction());
+    
     rs.addRule(new Pattern("configuration/conversionRule"),
         new ConversionRuleAction());
 

Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/ContextPropertyAction.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/ContextPropertyAction.java	(original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/ContextPropertyAction.java	Tue Oct 28 15:46:33 2008
@@ -1,28 +1,23 @@
-
 package ch.qos.logback.core.joran.action;
 
-import java.util.Properties;
+import org.xml.sax.Attributes;
 
+import ch.qos.logback.core.joran.spi.ActionException;
 import ch.qos.logback.core.joran.spi.InterpretationContext;
 
-
 /**
  * @author Ceki Gulcu
  */
-public class ContextPropertyAction extends PropertyAction {
-  
-  /**
-   * Add all the properties found in the argument named 'props' to an InterpretationContext.
-   */
-  public void setProperties(InterpretationContext ec, Properties props) {
-    // TODO : test this method
-    for(Object o: props.keySet()) {
-      String key = (String) o;
-      this.context.putProperty(key, props.getProperty(key));
-    }
+public class ContextPropertyAction extends Action {
+
+  @Override
+  public void begin(InterpretationContext ec, String name, Attributes attributes)
+      throws ActionException {
+    addError("The [contextProperty] element has been removed. Please use [substitutionProperty] element instead");
   }
-  
-  public void setProperty(InterpretationContext ec, String key, String value) {
-    this.context.putProperty(key, value);
+
+  @Override
+  public void end(InterpretationContext ec, String name) throws ActionException {
   }
+
 }

Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/PropertyAction.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/PropertyAction.java	(original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/PropertyAction.java	Tue Oct 28 15:46:33 2008
@@ -1,7 +1,7 @@
 /**
- * LOGBack: the generic, reliable, fast and flexible logging framework.
+ * Logback: the generic, reliable, fast and flexible logging framework.
  * 
- * Copyright (C) 1999-2006, QOS.ch
+ * Copyright (C) 2000-2008, QOS.ch
  * 
  * This library is free software, you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License as published by the Free
@@ -13,68 +13,135 @@
 
 import ch.qos.logback.core.joran.spi.InterpretationContext;
 import ch.qos.logback.core.pattern.util.RegularEscapeUtil;
+import ch.qos.logback.core.util.Loader;
 import ch.qos.logback.core.util.OptionHelper;
 
-
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
 
 import java.util.Properties;
 
 /**
- * This class serves as a base for other actions, which similar to the ANT 
+ * This class serves as a base for other actions, which similar to the ANT
  * <property> task which add/set properties of a given object.
  * 
+ * This action sets new substitution properties in the logging context by name,
+ * value pair, or adds all the properties passed in "file" or "resource"
+ * attribute.
+ * 
  * @author Ceki G&uuml;lc&uuml;
  */
-abstract public class PropertyAction extends Action {
-  static String INVALID_ATTRIBUTES =
-    "In <property> element, either the \"file\" attribute or both the \"name\" and \"value\" attributes must be set.";
-
-  
-  abstract void setProperties(InterpretationContext ec, Properties props);
-  abstract void setProperty(InterpretationContext ec, String key, String value);
-  
+public class PropertyAction extends Action {
+
+  static final String RESOURCE_ATTRIBUTE = "resource";
+
+  static String INVALID_ATTRIBUTES = "In <substitutionProperty> element, either the \"file\" attribute alone, or "
+      + "the \"resource\" element alone, or both the \"name\" and \"value\" attributes must be set.";
+
+  /**
+   * Add all the properties found in the argument named 'props' to an
+   * InterpretationContext.
+   */
+  public void setProperties(InterpretationContext ec, Properties props) {
+    ec.addSubstitutionProperties(props);
+  }
+
+  public void setProperty(InterpretationContext ec, String key, String value) {
+    ec.addSubstitutionProperty(key, value);
+  }
+
   /**
    * Set a new property for the execution context by name, value pair, or adds
    * all the properties found in the given file.
-   *
+   * 
    */
-  public void begin(
-    InterpretationContext ec, String localName, Attributes attributes) {
+  public void begin(InterpretationContext ec, String localName,
+      Attributes attributes) {
+
+    if ("substitutionProperty".equals(localName)) {
+      addWarn("[substitutionProperty] element has been deprecated. Plase use the [property] element instead.");
+    }
+
     String name = attributes.getValue(NAME_ATTRIBUTE);
     String value = attributes.getValue(VALUE_ATTRIBUTE);
-    String fileName = attributes.getValue(FILE_ATTRIBUTE);
-
-    if (
-      !OptionHelper.isEmpty(fileName)
-        && (OptionHelper.isEmpty(name) && OptionHelper.isEmpty(value))) {
-      Properties props = new Properties();
 
+    if (checkFileAttributeSanity(attributes)) {
+      String file = attributes.getValue(FILE_ATTRIBUTE);
+      file = ec.subst(file);
       try {
-        FileInputStream istream = new FileInputStream(fileName);
-        props.load(istream);
-        istream.close();
-        setProperties(ec, props);
+        FileInputStream istream = new FileInputStream(file);
+        loadAndSetProperties(ec, istream);
       } catch (IOException e) {
-        String errMsg = "Could not read properties file [" + fileName + "].";
-        addError(errMsg, e);
-        addError("Ignoring configuration file [" + fileName + "].");
-    
+        addError("Could not read properties file [" + file + "].", e);
       }
-    } else if (
-      !(OptionHelper.isEmpty(name) || OptionHelper.isEmpty(value))
-        && OptionHelper.isEmpty(fileName)) {
+    } else if (checkResourceAttributeSanity(attributes)) {
+      String resource = attributes.getValue(RESOURCE_ATTRIBUTE);
+      resource = ec.subst(resource);
+      URL resourceURL = Loader.getResourceBySelfClassLoader(resource);
+      if (resourceURL == null) {
+        addError("Could not find resource [" + resource + "].");
+      } else {
+        try {
+          InputStream istream = resourceURL.openStream();
+          loadAndSetProperties(ec, istream);
+        } catch (IOException e) {
+          addError("Could not read resource file [" + resource + "].", e);
+        }
+      }
+    } else if (checkValueNameAttributesSanity(attributes)) {
       value = RegularEscapeUtil.basicEscape(value);
       // now remove both leading and trailing spaces
       value = value.trim();
+      value = ec.subst(value);
       setProperty(ec, name, value);
+
     } else {
-      
       addError(INVALID_ATTRIBUTES);
     }
   }
 
+  void loadAndSetProperties(InterpretationContext ec, InputStream istream)
+      throws IOException {
+    Properties props = new Properties();
+    props.load(istream);
+    istream.close();
+    setProperties(ec, props);
+  }
+
+  boolean checkFileAttributeSanity(Attributes attributes) {
+    String file = attributes.getValue(FILE_ATTRIBUTE);
+    String name = attributes.getValue(NAME_ATTRIBUTE);
+    String value = attributes.getValue(VALUE_ATTRIBUTE);
+    String resource = attributes.getValue(RESOURCE_ATTRIBUTE);
+
+    return !(OptionHelper.isEmpty(file))
+        && (OptionHelper.isEmpty(name) && OptionHelper.isEmpty(value) && OptionHelper
+            .isEmpty(resource));
+  }
+
+  boolean checkResourceAttributeSanity(Attributes attributes) {
+    String file = attributes.getValue(FILE_ATTRIBUTE);
+    String name = attributes.getValue(NAME_ATTRIBUTE);
+    String value = attributes.getValue(VALUE_ATTRIBUTE);
+    String resource = attributes.getValue(RESOURCE_ATTRIBUTE);
+
+    return !(OptionHelper.isEmpty(resource))
+        && (OptionHelper.isEmpty(name) && OptionHelper.isEmpty(value) && OptionHelper
+            .isEmpty(file));
+  }
+
+  boolean checkValueNameAttributesSanity(Attributes attributes) {
+    String file = attributes.getValue(FILE_ATTRIBUTE);
+    String name = attributes.getValue(NAME_ATTRIBUTE);
+    String value = attributes.getValue(VALUE_ATTRIBUTE);
+    String resource = attributes.getValue(RESOURCE_ATTRIBUTE);
+
+    return (!(OptionHelper.isEmpty(name) || OptionHelper.isEmpty(value)) && (OptionHelper
+        .isEmpty(file) && OptionHelper.isEmpty(resource)));
+  }
+
   public void end(InterpretationContext ec, String name) {
   }
 

Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachableImpl.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachableImpl.java	(original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachableImpl.java	Tue Oct 28 15:46:33 2008
@@ -43,7 +43,6 @@
       appenderList.add(newAppender);
     }
     w.unlock();
-
   }
 
   /**

Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/IncludeActionTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/IncludeActionTest.java	(original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/IncludeActionTest.java	Tue Oct 28 15:46:33 2008
@@ -53,7 +53,7 @@
 
   static final String INVALID = INCLUSION_DIR_PREFIX + "invalid.xml";
 
-  static final String INCLUDED_AS_RESOURCE = "input/joran/inclusion/includedAsResource.xml";
+  static final String INCLUDED_AS_RESOURCE = "asResource/joran/inclusion/includedAsResource.xml";
 
   public IncludeActionTest() {
     HashMap<Pattern, Action> rulesMap = new HashMap<Pattern, Action>();

Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/PackageTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/PackageTest.java	(original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/PackageTest.java	Tue Oct 28 15:46:33 2008
@@ -18,7 +18,7 @@
 
   public static Test suite() {
     TestSuite suite = new TestSuite();
-    suite.addTestSuite(PropertyActionTest.class);
+    suite.addTest(new JUnit4TestAdapter(PropertyActionTest.class));
     suite.addTest(new JUnit4TestAdapter(IncludeActionTest.class));
     
     return suite;

Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/PropertyActionTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/PropertyActionTest.java	(original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/action/PropertyActionTest.java	Tue Oct 28 15:46:33 2008
@@ -1,38 +1,43 @@
 package ch.qos.logback.core.joran.action;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import java.util.Iterator;
 
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
 import ch.qos.logback.core.Context;
 import ch.qos.logback.core.ContextBase;
 import ch.qos.logback.core.joran.spi.InterpretationContext;
 import ch.qos.logback.core.status.ErrorStatus;
 import ch.qos.logback.core.util.Constants;
 
-public class PropertyActionTest extends TestCase {
+public class PropertyActionTest  {
 
   Context context;
   InterpretationContext ec;
-  SubstitutionPropertyAction spAction;
+  PropertyAction spAction;
   DummyAttributes atts = new DummyAttributes();
   
-  @Override
-  protected void setUp() throws Exception {
+  @Before
+  public void setUp() throws Exception {
     context = new ContextBase();
     ec = new InterpretationContext(context, null);
-    spAction = new SubstitutionPropertyAction();
+    spAction = new PropertyAction();
     spAction.setContext(context);
-    super.setUp();
   }
 
-  @Override
-  protected void tearDown() throws Exception {
+  @After
+  public void tearDown() throws Exception {
     context = null; 
     spAction = null;
     atts = null;
-    super.tearDown();
   }
   
+  @Test
   public void testBegin() {
     atts.setValue("name", "v1");
     atts.setValue("value", "work");
@@ -40,6 +45,7 @@
     assertEquals("work", ec.getSubstitutionProperty("v1"));
   }
   
+  @Test
   public void testBeginNoValue() {
     atts.setValue("name", "v1");
     spAction.begin(ec, null, atts);
@@ -47,6 +53,7 @@
     assertTrue(checkError());
   }
 
+  @Test
   public void testBeginNoName() {
     atts.setValue("value", "v1");
     spAction.begin(ec, null, atts);
@@ -54,12 +61,14 @@
     assertTrue(checkError());
   }
   
+  @Test
   public void testBeginNothing() {
     spAction.begin(ec, null, atts);
     assertEquals(1, context.getStatusManager().getCount());
     assertTrue(checkError());
   } 
   
+  @Test
   public void testFileNotLoaded() {
     atts.setValue("file", "toto");
     atts.setValue("value", "work");
@@ -68,17 +77,45 @@
     assertTrue(checkError());
   }
   
+  @Test
+  public void testLoadFileWithPrerequisiteSubsitution() {
+    context.putProperty("STEM", Constants.TEST_DIR_PREFIX + "input/joran");
+    atts.setValue("file", "${STEM}/propertyActionTest.properties");
+    spAction.begin(ec, null, atts);
+    assertEquals("tata", ec.getSubstitutionProperty("v1"));
+    assertEquals("toto", ec.getSubstitutionProperty("v2"));
+  }
+
+  @Test
   public void testLoadFile() {
     atts.setValue("file", Constants.TEST_DIR_PREFIX + "input/joran/propertyActionTest.properties");
     spAction.begin(ec, null, atts);
     assertEquals("tata", ec.getSubstitutionProperty("v1"));
     assertEquals("toto", ec.getSubstitutionProperty("v2"));
   }
+
+  @Test
+  public void testLoadResource() {
+    atts.setValue("resource", "asResource/joran/propertyActionTest.properties");
+    spAction.begin(ec, null, atts);
+    assertEquals("tata", ec.getSubstitutionProperty("r1"));
+    assertEquals("toto", ec.getSubstitutionProperty("r2"));
+  }
   
+  @Test
+  public void testLoadResourceWithPrerequisiteSubsitution() {
+    context.putProperty("STEM", "asResource/joran");
+    atts.setValue("resource", "${STEM}/propertyActionTest.properties");
+    spAction.begin(ec, null, atts);
+    assertEquals("tata", ec.getSubstitutionProperty("r1"));
+    assertEquals("toto", ec.getSubstitutionProperty("r2"));
+  }
+  
+  @Test
   public void testLoadNotPossible() {
     atts.setValue("file", "toto");
     spAction.begin(ec, null, atts);
-    assertEquals(2, context.getStatusManager().getCount());
+    assertEquals(1, context.getStatusManager().getCount());
     assertTrue(checkFileErrors());
   }
   
@@ -91,9 +128,6 @@
   private boolean checkFileErrors() {
     Iterator it = context.getStatusManager().getCopyOfStatusList().iterator();
     ErrorStatus es1 = (ErrorStatus)it.next();
-    boolean result1 = "Could not read properties file [toto].".equals(es1.getMessage());
-    ErrorStatus es2 = (ErrorStatus)it.next();
-    boolean result2 = "Ignoring configuration file [toto].".equals(es2.getMessage());
-    return result1 && result2;
+    return "Could not read properties file [toto].".equals(es1.getMessage());
   }
 }

Added: logback/trunk/logback-core/src/test/resources/asResource/joran/propertyActionTest.properties
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/test/resources/asResource/joran/propertyActionTest.properties	Tue Oct 28 15:46:33 2008
@@ -0,0 +1,2 @@
+r1=tata
+r2=toto
\ No newline at end of file

Modified: logback/trunk/logback-examples/src/main/java/chapter3/MyApp2.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/MyApp2.java	(original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/MyApp2.java	Tue Oct 28 15:46:33 2008
@@ -1,7 +1,7 @@
 /**
- * Logback: the reliable, generic, fast and flexible logging framework.
+ * Logback: the generic, reliable, fast and flexible logging framework.
  * 
- * Copyright (C) 1999-2006, QOS.ch
+ * Copyright (C) 2000-2008, QOS.ch
  * 
  * This library is free software, you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License as published by the Free

Modified: logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution1.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution1.xml	(original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution1.xml	Tue Oct 28 15:46:33 2008
@@ -1,6 +1,6 @@
 <configuration>
 
-	<substitutionProperty name="USER_HOME" value="/home/sebastien" />
+	<property name="USER_HOME" value="/home/sebastien" />
 
 	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
 		<file>${USER_HOME}/myApp.log</file>
@@ -9,8 +9,7 @@
 		</layout>
 	</appender>
 
-	<root>
-		<level value="debug" />
+	<root level="debug">
 		<appender-ref ref="FILE" />
 	</root>
 </configuration>
\ No newline at end of file

Modified: logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution2.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution2.xml	(original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution2.xml	Tue Oct 28 15:46:33 2008
@@ -7,8 +7,7 @@
 		</layout>
 	</appender>
 
-	<root>
-		<level value="debug" />
+	<root level="debug">
 		<appender-ref ref="FILE" />
 	</root>
 </configuration>
\ No newline at end of file

Modified: logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution3.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution3.xml	(original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution3.xml	Tue Oct 28 15:46:33 2008
@@ -1,6 +1,6 @@
 <configuration>
 
-	<substitutionProperty file="variables1.properties" />
+	<property file="src/main/java/chapter3/variables1.properties" />
 
 	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
 		<file>${USER_HOME}/myApp.log</file>
@@ -9,8 +9,7 @@
 		</layout>
 	</appender>
 
-	<root>
-		<level value="debug" />
+	<root level="debug">
 		<appender-ref ref="FILE" />
 	</root>
 </configuration>
\ No newline at end of file

Modified: logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution4.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution4.xml	(original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/variableSubstitution4.xml	Tue Oct 28 15:46:33 2008
@@ -1,6 +1,6 @@
 <configuration>
 
-	<substitutionProperty file="variables2.properties" />
+	<property file="src/main/java/chapter3/variables2.properties" />
 
 	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
 		<file>${destination}/myApp.log</file>
@@ -9,8 +9,7 @@
 		</layout>
 	</appender>
 
-	<root>
-		<level value="debug" />
+	<root level="debug">
 		<appender-ref ref="FILE" />
 	</root>
 </configuration>
\ No newline at end of file

Added: logback/trunk/logback-examples/src/main/resources/resource1.properties
==============================================================================
--- (empty file)
+++ logback/trunk/logback-examples/src/main/resources/resource1.properties	Tue Oct 28 15:46:33 2008
@@ -0,0 +1 @@
+USER_HOME=/home/sebastien
\ No newline at end of file


More information about the logback-dev mailing list