Add support for a group property in LogFilePatternReceiver in order to allow logs from multiple cluster nodes to be combined in a single table by using GROUP as the event routing, and add support for the 'chainsaw' group for chainsaw-generated logs.  Also updated the valid characters in the filereceiver timestampformat for java 7.

git-svn-id: https://svn.apache.org/repos/asf/logging/chainsaw/trunk@1593840 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogUI.java b/src/main/java/org/apache/log4j/chainsaw/LogUI.java
index e99760e..d9adec1 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogUI.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogUI.java
@@ -367,10 +367,10 @@
     logUI.ensureChainsawAppenderHandlerAdded();
     logger = LogManager.getLogger(LogUI.class);
 
-    //set hostname & application properties which will cause Chainsaw and other apache-generated
+    //set hostname, application and group properties which will cause Chainsaw and other apache-generated
     //logging events to route (by default) to a tab named 'chainsaw-log'
     PropertyRewritePolicy policy = new PropertyRewritePolicy();
-    policy.setProperties("hostname=chainsaw,application=log");
+    policy.setProperties("hostname=chainsaw,application=log,group=chainsaw");
     
     RewriteAppender rewriteAppender = new RewriteAppender();
     rewriteAppender.setRewritePolicy(policy);
diff --git a/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java b/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java
index 949965a..a99d248 100644
--- a/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java
+++ b/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java
@@ -46,6 +46,7 @@
           "filterExpression", VFSLogFilePatternReceiver.class),
           new PropertyDescriptor(
                   "promptForUserInfo", VFSLogFilePatternReceiver.class),
+        new PropertyDescriptor("group", VFSLogFilePatternReceiver.class),
       };
     } catch (Exception e) {
     }
diff --git a/src/main/java/org/apache/log4j/helpers/Constants.java b/src/main/java/org/apache/log4j/helpers/Constants.java
index dbbbe59..2e181fa 100644
--- a/src/main/java/org/apache/log4j/helpers/Constants.java
+++ b/src/main/java/org/apache/log4j/helpers/Constants.java
@@ -47,6 +47,10 @@
      */

   String RECEIVER_NAME_KEY = "receiver";

     /**

+     * group string literal.

+     */

+  String GROUP_KEY = "group";

+    /**

      * log4jid string literal.

      */

   String LOG4J_ID_KEY = "log4jid";

diff --git a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
index f8f12eb..df91332 100644
--- a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
+++ b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
@@ -65,6 +65,7 @@
  * - supports the parsing of multi-line messages and exceptions
  * - 'hostname' property set to URL host (or 'file' if not available)
  * - 'application' property set to URL path (or value of fileURL if not available) 
+ * - 'group' property can be set to associate multiple log file receivers
  *<p>
  * <b>Keywords:</b><br>
  * TIMESTAMP<br>
@@ -181,8 +182,9 @@
   private boolean tailing;
   private String filterExpression;
   private long waitMillis = 2000; //default 2 seconds
+  private String group;
 
-  private static final String VALID_DATEFORMAT_CHARS = "GyMwWDdFEaHkKhmsSzZ";
+  private static final String VALID_DATEFORMAT_CHARS = "GyYMwWDdFEuaHkKhmsSzZX";
   private static final String VALID_DATEFORMAT_CHAR_PATTERN = "[" + VALID_DATEFORMAT_CHARS + "]";
 
   private Rule expressionRule;
@@ -347,6 +349,19 @@
   }
 
     /**
+   * Mutator
+   */
+  public void setGroup(String group) { this.group = group; }
+
+
+    /**
+   * Accessor
+   *
+   * @return timestamp format
+   */
+  public String getGroup() { return group; }
+    
+    /**
    * Mutator.  Specify a pattern from {@link java.text.SimpleDateFormat}
    *
    * @param timestampFormat
@@ -960,6 +975,9 @@
     properties.put(Constants.HOSTNAME_KEY, host);
     properties.put(Constants.APPLICATION_KEY, path);
     properties.put(Constants.RECEIVER_NAME_KEY, getName());
+    if (group != null) {
+        properties.put(Constants.GROUP_KEY, group);
+    }
 
     //all remaining entries in fieldmap are properties
     properties.putAll(fieldMap);
diff --git a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiverBeanInfo.java b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiverBeanInfo.java
index f99f289..d7f0a8e 100644
--- a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiverBeanInfo.java
+++ b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiverBeanInfo.java
@@ -44,6 +44,7 @@
         new PropertyDescriptor("appendNonMatches", LogFilePatternReceiver.class),
         new PropertyDescriptor("customLevelDefinitions", LogFilePatternReceiver.class),
         new PropertyDescriptor("useCurrentThread", LogFilePatternReceiver.class),
+        new PropertyDescriptor("group", LogFilePatternReceiver.class),
       };
     } catch (Exception e) {
     }