/*!
* Copyright 2010 - 2015 Pentaho Corporation. All rights reserved.
*
* Licensed 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 com.pentaho.di.purge;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.apache.log4j.WriterAppender;
public class PurgeUtilityLog {
private Logger logger;
static final String FILE_KEY = "currentFile"; // Intentionally scoped as default
private OutputStream outputStream;
private String currentFilePath;
private String logName;
private String purgePath;
private Level logLevel;
private WriterAppender writeAppender;
static protected Class layoutClass = PurgeUtilityTextLayout.class;
/**
* Constructs this object when when no some method that uses the logger is executed but there is no formal log. When
* this occurs the log returned is just a simple Log4j logger.
*/
PurgeUtilityLog() {
}
/**
* Constructs an object that keeps track of additional fields for Log4j logging and writes/formats an html file to the
* output stream provided.
*
* @param outputStream
*/
PurgeUtilityLog( OutputStream outputStream, String purgePath, Level logLevel ) {
this.outputStream = outputStream;
this.purgePath = purgePath;
this.logLevel = logLevel;
init();
}
private void init() {
logName = "PurgeUtilityLog." + getThreadName();
logger = Logger.getLogger( logName );
logger.setLevel( logLevel );
IPurgeUtilityLayout layout;
if ( layoutClass == PurgeUtilityHTMLLayout.class ) {
layout = new PurgeUtilityHTMLLayout( logLevel );
} else {
layout = new PurgeUtilityTextLayout( logLevel );
}
layout.setTitle( "Purge Utility Log" );
writeAppender =
new WriterAppender( (Layout) layout, new OutputStreamWriter( outputStream, Charset.forName( "utf-8" ) ) );
logger.addAppender( writeAppender );
}
public Logger getLogger() {
if ( logger == null ) {
return Logger.getLogger( Thread.currentThread().getStackTrace()[4].getClassName() );
} else {
return logger;
}
}
/**
* @return the currentFilePath
*/
public String getCurrentFilePath() {
return currentFilePath;
}
/**
* @param currentFilePath
* the currentFilePath to set
*/
public void setCurrentFilePath( String currentFilePath ) {
this.currentFilePath = currentFilePath;
if ( currentFilePath != null ) {
MDC.put( FILE_KEY, currentFilePath );
}
}
/**
* @return the purgePath
*/
public String getPurgePath() {
return purgePath;
}
protected void endJob() {
try {
outputStream.write( writeAppender.getLayout().getFooter().getBytes() );
} catch ( Exception e ) {
System.out.println( e );
// Don't try logging a log error.
}
logger.removeAppender( logName );
}
private String getThreadName() {
return Thread.currentThread().getName();
}
}