Author: markt
Date: Mon Dec  1 05:15:37 2008
New Revision: 722064

URL: http://svn.apache.org/viewvc?rev=722064&view=rev
Log:
Add log formatter that outputs on a single line (except stack traces)

Added:
    tomcat/trunk/java/org/apache/juli/OneLineFormatter.java   (with props)
Modified:
    tomcat/trunk/webapps/docs/changelog.xml

Added: tomcat/trunk/java/org/apache/juli/OneLineFormatter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/juli/OneLineFormatter.java?rev=722064&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/juli/OneLineFormatter.java (added)
+++ tomcat/trunk/java/org/apache/juli/OneLineFormatter.java Mon Dec  1 05:15:37 
2008
@@ -0,0 +1,127 @@
+/*
+ * 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.juli;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.logging.Formatter;
+import java.util.logging.LogRecord;
+
+/**
+ * Provides same information as default log format but on a single line to make
+ * it easier to grep the logs. The only excpetion is stacktraces which are
+ * always preceeded by whitespace to make it simple to skip them.
+ */
+/*
+ * Date processing based on AccessLogValve.
+ */
+public class OneLineFormatter extends Formatter {
+
+    /**
+     * The set of month abbreviations for log messages.
+     */
+    private static final String months[] = {"Jan", "Feb", "Mar", "Apr", "May",
+        "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+    private static final String LINE_SEP = 
System.getProperty("line.separator");
+    private static final String ST_SEP = LINE_SEP + " ";
+
+    private final SimpleDateFormat dayFormatter = new SimpleDateFormat("dd");
+    private final SimpleDateFormat monthFormatter = new SimpleDateFormat("MM");
+    private final SimpleDateFormat yearFormatter = new 
SimpleDateFormat("yyyy");
+    private final SimpleDateFormat timeFormatter =
+        new SimpleDateFormat("hh:mm:ss");
+    
+    private Date currentDate;
+    private String currentDateString;
+
+    @Override
+    public String format(LogRecord record) {
+        StringBuffer sb = new StringBuffer();
+        
+        // Timestamp
+        addTimestamp(sb, new Date(record.getMillis()));
+        
+        // Severity
+        sb.append(' ');
+        sb.append(record.getLevel());
+        
+        // Source
+        sb.append(' ');
+        sb.append(record.getSourceClassName());
+        sb.append('.');
+        sb.append(record.getSourceMethodName());
+        
+        // Message
+        sb.append(' ');
+        sb.append(record.getMessage());
+        
+        // Stack trace
+        if (record.getThrown() != null) {
+            sb.append(ST_SEP);
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            record.getThrown().printStackTrace(pw);
+            pw.close();
+            sb.append(sw.getBuffer());
+        }
+
+        // New line for next record
+        sb.append(LINE_SEP);
+
+        return sb.toString();
+    }
+
+    public void addTimestamp(StringBuffer buf, Date date) {
+        if (currentDate != date) {
+            synchronized (this) {
+                if (currentDate != date) {
+                    StringBuffer current = new StringBuffer(32);
+                    current.append(dayFormatter.format(date)); // Day
+                    current.append('-');
+                    current.append(lookup(monthFormatter.format(date))); // 
Month
+                    current.append('-');
+                    current.append(yearFormatter.format(date)); // Year
+                    current.append(' ');
+                    current.append(timeFormatter.format(date)); // Time
+                    currentDateString = current.toString();
+                    currentDate = date;
+                }
+            }
+        }
+        buf.append(currentDateString);
+    }
+
+    /**
+     * Return the month abbreviation for the specified month, which must
+     * be a two-digit String.
+     *
+     * @param month Month number ("01" .. "12").
+     */
+    private String lookup(String month) {
+        int index;
+        try {
+            index = Integer.parseInt(month) - 1;
+        } catch (Throwable t) {
+            index = 0;  // Can not happen, in theory
+        }
+        return (months[index]);
+    }
+}

Propchange: tomcat/trunk/java/org/apache/juli/OneLineFormatter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=722064&r1=722063&r2=722064&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon Dec  1 05:15:37 2008
@@ -38,7 +38,7 @@
         David Jecks with modifications by Remy. (remm/fhanik)
       </update>
       <update>
-        <rev>620845</rev> and <rev>669119</rev>. Make shutdwn address
+        <rev>620845</rev> and <rev>669119</rev>. Make shutdown address
         configurable. (jfclere)
       </update>
       <fix>
@@ -90,6 +90,10 @@
       <add>
         Expose thisAccessedTime via Session interface. (rjung)
       </add>
+      <add>
+        Provide a log format for JULI that provides the same information as the
+        default but on a single line. (markt)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to