You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by ca...@apache.org on 2007/02/22 22:43:36 UTC
svn commit: r510660 - in /logging/log4j/branches/v1_2-branch:
src/java/org/apache/log4j/helpers/SyslogWriter.java
src/java/org/apache/log4j/net/SyslogAppender.java
tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java
Author: carnold
Date: Thu Feb 22 13:43:36 2007
New Revision: 510660
URL: http://svn.apache.org/viewvc?view=rev&rev=510660
Log:
Bug 41040: SyslogAppender should prefix message with TIMESTAMP and local hostname
Modified:
logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java
logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java
logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java
Modified: logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java?view=diff&rev=510660&r1=510659&r2=510660
==============================================================================
--- logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java (original)
+++ logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java Thu Feb 22 13:43:36 2007
@@ -56,7 +56,7 @@
*/
public
SyslogWriter(final String syslogHost) {
- this.syslogHost = syslogHost;
+ SyslogWriter.syslogHost = syslogHost;
if (syslogHost == null) {
throw new NullPointerException("syslogHost");
}
Modified: logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java?view=diff&rev=510660&r1=510659&r2=510660
==============================================================================
--- logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java (original)
+++ logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java Thu Feb 22 13:43:36 2007
@@ -17,10 +17,16 @@
package org.apache.log4j.net;
import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.Layout;
-import org.apache.log4j.helpers.SyslogWriter;
import org.apache.log4j.helpers.SyslogQuietWriter;
+import org.apache.log4j.helpers.SyslogWriter;
+import org.apache.log4j.spi.LoggingEvent;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
// Contributors: Yves Bossel <yb...@opengets.cl>
// Christopher Taylor <cs...@pacbell.net>
@@ -94,6 +100,23 @@
SyslogQuietWriter sqw;
String syslogHost;
+ /**
+ * If true, the appender will generate the HEADER (timestamp and host name)
+ * part of the syslog packet.
+ * @since 1.2.15
+ */
+ private boolean header = false;
+ /**
+ * Date format used if header = true.
+ * @since 1.2.15
+ */
+ private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd HH:mm:ss ", Locale.ENGLISH);
+ /**
+ * Host name used to identify messages from this appender.
+ * @since 1.2.15
+ */
+ private String localHostname;
+
public
SyslogAppender() {
this.initSyslogFacilityStr();
@@ -252,20 +275,28 @@
return;
}
- String buffer = (facilityPrinting? facilityStr : "") +
- layout.format(event);
+ String hdr = getPacketHeader(event.timeStamp);
+ String packet = layout.format(event);
+ if(facilityPrinting || hdr.length() > 0) {
+ StringBuffer buf = new StringBuffer(hdr);
+ if(facilityPrinting) {
+ buf.append(facilityStr);
+ }
+ buf.append(packet);
+ packet = buf.toString();
+ }
sqw.setLevel(event.getLevel().getSyslogEquivalent());
- sqw.write(buffer);
+ sqw.write(packet);
if (layout.ignoresThrowable()) {
String[] s = event.getThrowableStrRep();
if (s != null) {
for(int i = 0; i < s.length; i++) {
if (s[i].startsWith("\t")) {
- sqw.write(TAB+s[i].substring(1));
+ sqw.write(hdr+TAB+s[i].substring(1));
} else {
- sqw.write(s[i]);
+ sqw.write(hdr+s[i]);
}
}
}
@@ -278,6 +309,9 @@
*/
public
void activateOptions() {
+ if (header) {
+ getLocalHostname();
+ }
}
/**
@@ -368,5 +402,61 @@
public
boolean getFacilityPrinting() {
return facilityPrinting;
+ }
+
+ /**
+ * If true, the appender will generate the HEADER part (that is, timestamp and host name)
+ * of the syslog packet. Default value is false for compatibility with existing behavior,
+ * however should be true unless there is a specific justification.
+ * @since 1.2.15
+ */
+ public final boolean getHeader() {
+ return header;
+ }
+
+ /**
+ * Returns whether the appender produces the HEADER part (that is, timestamp and host name)
+ * of the syslog packet.
+ * @since 1.2.15
+ */
+ public final void setHeader(final boolean val) {
+ header = val;
+ }
+
+ /**
+ * Get the host name used to identify this appender.
+ * @return local host name
+ * @since 1.2.15
+ */
+ private String getLocalHostname() {
+ if (localHostname == null) {
+ try {
+ InetAddress addr = InetAddress.getLocalHost();
+ localHostname = addr.getHostName();
+ } catch (UnknownHostException uhe) {
+ localHostname = "UNKNOWN_HOST";
+ }
+ }
+ return localHostname;
+ }
+
+ /**
+ * Gets HEADER portion of packet.
+ * @param timeStamp number of milliseconds after the standard base time.
+ * @return HEADER portion of packet, will be zero-length string if header is false.
+ * @since 1.2.15
+ */
+ private String getPacketHeader(final long timeStamp) {
+ if (header) {
+ StringBuffer buf = new StringBuffer(dateFormat.format(new Date(timeStamp)));
+ // RFC 3164 says leading space, not leading zero on days 1-9
+ if (buf.charAt(4) == '0') {
+ buf.setCharAt(4, ' ');
+ }
+ buf.append(getLocalHostname());
+ buf.append(' ');
+ return buf.toString();
+ }
+ return "";
}
}
Modified: logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java?view=diff&rev=510660&r1=510659&r2=510660
==============================================================================
--- logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java (original)
+++ logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java Thu Feb 22 13:43:36 2007
@@ -29,13 +29,17 @@
import java.util.StringTokenizer;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+import java.util.Date;
+import java.util.Calendar;
/**
* Tests for SyslogAppender
*
- * @author Curt Arnold
- **/
+ *
+ * */
public class SyslogAppenderTest extends TestCase {
/**
* Create new instance of SyslogAppenderTest.
@@ -387,7 +391,8 @@
appender.setSyslogHost("127.0.0.1:1514");
}
- private static String[] log(final String msg,
+ private static String[] log(final boolean header,
+ final String msg,
final Exception ex,
final int packets) throws Exception {
DatagramSocket ds = new DatagramSocket();
@@ -397,6 +402,7 @@
SyslogAppender appender = new SyslogAppender();
appender.setSyslogHost("localhost:" + ds.getLocalPort());
appender.setName("name");
+ appender.setHeader(header);
PatternLayout pl = new PatternLayout("%m");
appender.setLayout(pl);
appender.activateOptions();
@@ -419,7 +425,7 @@
}
public void testActualLogging() throws Exception {
- String s = log("greetings", null, 1)[0];
+ String s = log(false, "greetings", null, 1)[0];
StringTokenizer st = new StringTokenizer(s, "<>() ");
assertEquals("14", st.nextToken());
assertEquals("greetings", st.nextToken());
@@ -444,6 +450,7 @@
w.println("");
w.println("No tab here");
w.println("\ttab here");
+ w.println("\t");
}
}
@@ -452,7 +459,7 @@
* @throws Exception on IOException.
*/
public void testBadTabbing() throws Exception {
- String[] s = log("greetings", new MishandledException(), 5);
+ String[] s = log(false, "greetings", new MishandledException(), 6);
StringTokenizer st = new StringTokenizer(s[0], "<>() ");
assertEquals("11", st.nextToken());
assertEquals("greetings", st.nextToken());
@@ -460,6 +467,46 @@
assertEquals("<11>", s[2]);
assertEquals("<11>No tab here", s[3]);
assertEquals("<11>" + SyslogAppender.TAB + "tab here", s[4]);
+ assertEquals("<11>" + SyslogAppender.TAB, s[5]);
+ }
+
+ /**
+ * Tests presence of timestamp if header = true.
+ *
+ * @throws Exception if IOException.
+ */
+ public void testHeaderLogging() throws Exception {
+ Date preDate = new Date();
+ String s = log(true, "greetings", null, 1)[0];
+ Date postDate = new Date();
+ assertEquals("<14>", s.substring(0, 4));
+
+ String syslogDateStr = s.substring(4, 20);
+ SimpleDateFormat fmt = new SimpleDateFormat("MMM dd HH:mm:ss ", Locale.ENGLISH);
+ Date syslogDate = fmt.parse(syslogDateStr);
+ Calendar cal = Calendar.getInstance(Locale.ENGLISH);
+ cal.setTime(syslogDate);
+ int syslogMonth = cal.get(Calendar.MONTH);
+ int syslogDay = cal.get(Calendar.DATE);
+ if (syslogDay < 10) {
+ assertEquals(' ', syslogDateStr.charAt(4));
+ }
+ cal.setTime(preDate);
+ int preMonth = cal.get(Calendar.MONTH);
+ cal.set(Calendar.MILLISECOND, 0);
+ preDate = cal.getTime();
+ int syslogYear;
+ if (preMonth == syslogMonth) {
+ syslogYear = cal.get(Calendar.YEAR);
+ } else {
+ cal.setTime(postDate);
+ syslogYear = cal.get(Calendar.YEAR);
+ }
+ cal.setTime(syslogDate);
+ cal.set(Calendar.YEAR, syslogYear);
+ syslogDate = cal.getTime();
+ assertTrue(syslogDate.compareTo(preDate) >= 0);
+ assertTrue(syslogDate.compareTo(postDate) <= 0);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org