001 package net.sf.logdistiller.plugins;
002
003 /*
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 import java.io.*;
018
019 import net.sf.logdistiller.LogDistillation;
020 import net.sf.logdistiller.LogDistiller;
021 import net.sf.logdistiller.LogEvent;
022 import net.sf.logdistiller.Plugin;
023 import net.sf.logdistiller.ReportFormat;
024 import net.sf.logdistiller.util.FormatUtil;
025
026 /**
027 * <b>Log sampling</b> plugin: works like FreqPlugin, but saves some log events to a log file.
028 * <p>
029 * Parameters (added to FreqPlugin's parameters):
030 * </p>
031 * <ul>
032 * <li><code>sampling.filename</code> (default: <code>[id]-sampling.log</code>): name of the file to save the sample of
033 * log events for each attribute's value.</li>
034 * <li><code>sampling.maxCount</code> (default: 10, -1 = no limit): number of log events to save for each attribute's
035 * value.</li>
036 * <li><code>sampling.maxSize</code> (default: -1 = no limit): maximum size (in kb) of the sample file</li>
037 * </ul>
038 *
039 * @see FreqPlugin
040 * @since 0.7
041 */
042 public class SamplingPlugin
043 extends FreqPlugin
044 {
045 private static final long serialVersionUID = -2960554427849032861L;
046
047 public final static String ID = "sampling";
048
049 public final static Plugin TYPE = new Type();
050
051 private final int samplingMaxCount;
052
053 private final long samplingMaxSize;
054
055 private final String samplingFilename;
056
057 private File samplingLogFile;
058
059 private transient PrintStream samplingLogStream;
060
061 public SamplingPlugin( LogDistiller.Plugin definition )
062 {
063 super( definition, false );
064
065 samplingMaxCount = Integer.parseInt( definition.getParam( "sampling.maxCount", "10" ) );
066 samplingMaxSize = Long.parseLong( definition.getParam( "sampling.maxSize", "-1" ) ) * 1024;
067 samplingFilename = definition.getParam( "sampling.filename", definition.getGroup().getId() + "-sampling.log" );
068 }
069
070 public void begin( File destinationDirectory )
071 throws FileNotFoundException
072 {
073 super.begin( destinationDirectory );
074 samplingLogFile = new File( destinationDirectory, samplingFilename );
075 samplingLogStream = new PrintStream( new FileOutputStream( samplingLogFile ) );
076 }
077
078 public void addLogEventToFreq( LogEvent logEvent, Freq freq )
079 throws IOException
080 {
081 super.addLogEventToFreq( logEvent, freq );
082
083 if ( ( ( samplingMaxCount < 0 ) || ( ( samplingMaxCount > 0 ) && ( freq.count <= samplingMaxCount ) ) )
084 && ( ( samplingMaxSize < 0 ) || ( ( samplingMaxSize > 0 ) && ( freq.bytes <= samplingMaxSize ) ) ) )
085 {
086 samplingLogStream.println( logEvent.getRawLog() );
087 }
088 }
089
090 public void end()
091 throws IOException
092 {
093 samplingLogStream.close();
094 super.end();
095 }
096
097 protected void appendLinkToFreqReport( ReportFormat.PluginReport report )
098 {
099 report.addLink( samplingLogFile.getName(), "sampling log file (max count = "
100 + ( ( samplingMaxCount < 0 ) ? "none" : String.valueOf( samplingMaxCount ) ) + ", max size = "
101 + ( ( samplingMaxSize < 0 ) ? "none" : FormatUtil.formatSize( samplingMaxSize ) ) + ")" );
102 }
103
104 private static class Type
105 extends Plugin
106 {
107 public Type()
108 {
109 super( ID );
110 }
111
112 public LogDistillation.Plugin newInstance( LogDistiller.Plugin conf )
113 {
114 return new SamplingPlugin( conf );
115 }
116 }
117 }