<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ralfhaug.de</title>
	<atom:link href="http://www.ralfhaug.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ralfhaug.de</link>
	<description>thoughts on ...</description>
	<lastBuildDate>Mon, 08 Mar 2010 14:03:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Zip &#8216;n Roll mit log4j</title>
		<link>http://www.ralfhaug.de/zip-n-roll-mit-log4j/</link>
		<comments>http://www.ralfhaug.de/zip-n-roll-mit-log4j/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 15:30:00 +0000</pubDate>
		<dc:creator>Ralf</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[log4j]]></category>

		<guid isPermaLink="false">http://www.ralfhaug.de/?p=9</guid>
		<description><![CDATA[Wer mit rotierenden Logfiles arbeitet und keinen Festplattenplatz zu verschwenden hat, kann  mit ein paar Zeilen Code Apaches log4j zur Komprimierung der rollierten Logs bewegen. Der Einsatz von rollierenden Logs ist weit verbreitet und ein wertvolles Hilfsmittel zur Analyse von Systemen und Applikationen. Logfiles können dabei nach unterschiedlichen Kriterien rolliert werden (Datum, Grösse, etc.). Allerdings [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Wer mit rotierenden Logfiles arbeitet und keinen Festplattenplatz zu verschwenden hat, kann  mit ein paar Zeilen Code Apaches <a title="Apache log4j" href="http://logging.apache.org/log4j/" target="_blank">log4j</a> zur Komprimierung der rollierten Logs bewegen.</strong></p>
<p>Der Einsatz von rollierenden Logs ist weit verbreitet und ein wertvolles Hilfsmittel zur Analyse von Systemen und Applikationen. Logfiles können dabei nach unterschiedlichen Kriterien rolliert werden (Datum, Grösse, etc.). Allerdings kann der dadurch generierte Mehrwert schnell zerstört werden, wenn die Logfiles mit der Zeit zu viel Festplattenspeicher für sich beanspruchen. Um dem entgegen zu wirken sollte man die rollierten Logs entsprechend komprimieren.</p>
<p>Für die Komprimierung der Logs können unterschiedliche Strategien verfolgt werden: Komplettlösungen wie beispielsweise <a title="Wiki zu LOGROTATE" href="http://en.gentoo-wiki.com/wiki/Logrotate" target="_blank">logrotate</a> übernehmen im Linux-Umfeld Rotation und Komprimierung der Logs. Ansonsten werden zumeist selbsterstellte Skripts genutzt. Diese Ansätze sind aber nicht immer praktikabel, da sie entweder für die eigene Plattform nicht verfügbar sind, eventuell sehr aufwendig sind oder gar mit der gewünschten Rotationsstrategie kollidieren.</p>
<p><span id="more-9"></span></p>
<p>Im Java-Umfeld erfreut sich Apaches mächtiges Logging-Framework log4j großer Beliebtheit. Neben vielen anderen gibt es auch hier sog. Appender zur Log-Rotation. Allerdings wurde hier keine Komprimierung integriert. Mit Hilfe von Java-Bordmitteln aus dem Package java.util.zip kann man das relativ unspektakulär ändern&#8230;</p>
<p>Kurz gesagt:  Der RollingFileAppender wird zum <span style="color: #333399;"><em>RollingZipAppender</em></span></p>
<p>Um das zu erreichen muss man lediglich von der Klasse RollingFileAppender ableiten, ein wenig ZIP-Funktionalität hinzufügen und die Methode <span style="color: #000080;"><em>rollOver()</em> </span>überschreiben&#8230;</p>
<pre class="brush:java; highlight: [2,18,24,26,41,42]">...
public class RollingZipAppender extends RollingFileAppender {

@Override
public void rollOver() {

  File target;
  File file;

  if (qw != null) {
    LogLog.debug("rolling over count=" + ((CountingQuietWriter) qw).getCount());
  }
  LogLog.debug("maxBackupIndex="+maxBackupIndex);

  // If maxBackups &lt;= 0, then there is no file renaming to be done.
  if(maxBackupIndex &gt; 0) {
    // Delete the oldest file, to keep Windows happy.
    file = new File(fileName + '.' + maxBackupIndex + ".zip"); //modified by me
    if (file.exists())
    file.delete();

    // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
    for (int i = maxBackupIndex - 1; i &gt;= 1; i--) {
      file = new File(fileName + "." + i + ".zip"); //modified by me
      if (file.exists()) {
        target = new File(fileName + '.' + (i + 1) + ".zip"); //modified by me
        LogLog.debug("Renaming file " + file + " to " + target);
        file.renameTo(target);
      }
    }

    // Rename fileName to fileName.1
    target = new File(fileName + "." + 1);

    this.closeFile(); // keep windows happy.

    file = new File(fileName);
    LogLog.debug("Renaming file " + file + " to " + target);
    file.renameTo(target);

    //added by me - call ZIP facility
    boolean archiveResult = archiveFile(target);

    if(archiveResult) {
      target.delete();
    }
    else {
      LogLog.error("Failed to zip file ["+target.getPath()+"].");
    }
  }

  try {
    // This will also close the file. This is OK since multiple
    // close operations are safe.
    this.setFile(fileName, false, bufferedIO, bufferSize);
  }
  catch(IOException e) {
    LogLog.error("setFile("+fileName+", false) call failed.", e);
  }

}
...</pre>
<p><span style="color: #666699;"><em>Die modifizierte Methode rollOver()</em></span></p>
<p><span style="color: #666699;"><em><br />
</em></span></p>
<p><span style="color: #666699;"><span style="color: #000000;">Die Methode <strong><em>archiveFile()</em></strong> übernimmt mithilfe des <strong><em>java.util.zip</em></strong> Package das Komprimieren der Logfiles.</span></span></p>
<p><span style="color: #666699;"><span style="color: #000000;">Der Code dafür sieht wie folgt aus&#8230;</span></span></p>
<pre class="brush:java">...
// archive log file
boolean archiveFile(File logFile) {

FileOutputStream fOut;
ZipOutputStream zOut;

// necessary because of possible IOException
try {
  fOut = new FileOutputStream(logFile.getPath()+".zip");
  zOut = new ZipOutputStream(fOut);

  FileInputStream fIn = new FileInputStream(logFile);
  BufferedInputStream bIn = new BufferedInputStream(fIn);

  // new ZipEntry to put into the archive
  ZipEntry entry = new ZipEntry(logFile.getCanonicalFile().getName());
  zOut.putNextEntry(entry);

  // create a byte array
  byte[] barray = new byte[1024];
  // byte count variable
  int bytes;

  // read the BufferedInputStream and write it entirely to the archive
  while((bytes = bIn.read(barray, 0, 1024)) &gt; -1) {
    zOut.write(barray, 0, bytes);
  }

  // clean up
  zOut.flush();
  zOut.close();
  fOut.close();

  return true;

  } catch (IOException ioE) {
    return false;
  }

}
...</pre>
<p><span style="color: #666699;"><em>Die Methode archiveFile()</em></span></p>
<p><span style="color: #666699;"><em><br />
</em></span></p>
<p><span style="color: #666699;"><span style="color: #000000;">Der Custom-Appender kann jetzt &#8211; wie vom RollingFileAppender gewohnt &#8211; konfiguriert werden&#8230;</span></span></p>
<pre class="brush:xml; highlight: [3]">...
&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";&gt;
  &lt;appender name="DefaultAppender" class="mypackage.RollingZipAppender"&gt;
    &lt;param name="File" value="mylog.log" /&gt;
    &lt;param name="Append" value="true" /&gt;
    &lt;param name="MaxFileSize" value="3000KB" /&gt;
    &lt;layout&gt;
      &lt;param name="ConversionPattern" value="%d{DATE} %-5p %-15c{1}: %m%n"/&gt;
    &lt;/layout&gt;
  &lt;/appender&gt;
...</pre>
<p><span style="color: #666699;"><em>log4j.xml Konfigurationsdatei</em></span></p>
<p><span style="color: #666699;"><span style="color: #000000;">Analog dazu kann natürlich auch der <em><span style="color: #666699;">DailyRollingFileAppender</span></em> erweitert werden.</span></span></p>
<p><span style="color: #666699;"><span style="color: #000000;">Probiert&#8217;s einfach aus<br />
</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ralfhaug.de/zip-n-roll-mit-log4j/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hallo Welt!</title>
		<link>http://www.ralfhaug.de/hallo-welt/</link>
		<comments>http://www.ralfhaug.de/hallo-welt/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 09:28:57 +0000</pubDate>
		<dc:creator>Ralf</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.ralfhaug.de/wp_ralfhaug/?p=1</guid>
		<description><![CDATA[So jetzt ist&#8217;s soweit, jetzt bin ich auch ein Blogger.]]></description>
			<content:encoded><![CDATA[<p>So jetzt ist&#8217;s soweit, jetzt bin ich auch ein Blogger.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ralfhaug.de/hallo-welt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

