package railo.commons.io.log;
import java.io.IOException;
import railo.commons.io.IOUtil;
import railo.commons.io.res.Resource;
/**
* Simple Logger to log data to a file
*/
public class LogResource implements Log {
private Resource res;
/**
* maximum number of files (history of files)
*/
public static final int MAX_FILES=10;
private long maxFileSize;
private int maxFiles;
private int count=0;
private int logLevel;
private String charset;
/**
* Constructor of the Logger
* @param res resource to log to
* @param logLevel
* @throws IOException
*/
public LogResource(Resource res, int logLevel, String charset) throws IOException {
this(res,MAX_FILE_SIZE,MAX_FILES,logLevel,charset);
}
/**
* Constructor of the Logger
* @param res resource to log to
* @param maxFileSize max file size if file is greater creates a backup file of the actuell file and creates a new one.
* @param logLevel
* @throws IOException
*/
public LogResource(Resource res, long maxFileSize, int logLevel, String charset) throws IOException {
this(res,maxFileSize,MAX_FILES,logLevel,charset);
}
/**
* Constructor of the Logger
* @param res resource to log to
* @param maxFileSize max file size if file is greater creates a backup file of the actuell file and creates a new one.
* @param maxFiles max count of files
* @param logLevel
* @throws IOException
*/
public LogResource(Resource res, long maxFileSize, int maxFiles, int logLevel, String charset) throws IOException {
this.res=res;
this.maxFileSize=maxFileSize;
this.maxFiles=maxFiles;
this.logLevel=logLevel;
this.charset=charset;
checkFile();
}
/**
* check files and creates a new one if to great or not exist
* @throws IOException
*/
private void checkFile() throws IOException {
boolean writeHeader=false;
// create file
if(!res.exists()) {
res.createFile(true);
writeHeader=true;
}
else if(res.length()==0) {
writeHeader=true;
}
// creaste new file
else if(res.length()>maxFileSize) {
Resource parent = res.getParentResource();
String name = res.getName();
for(int i=maxFiles;i>0;i--) {
Resource to=parent.getRealResource(name+"."+i+".bak");
Resource from=parent.getRealResource(name+"."+(i-1)+".bak");
if(from.exists()) {
if(to.exists())to.delete();
from.renameTo(to);
}
}
res.renameTo(parent.getRealResource(name+".1.bak"));
res=parent.getRealResource(name);//new File(parent,name);
res.createNewFile();
writeHeader=true;
}
if(writeHeader) {
writeHeader=false;
write(LogUtil.getHeader());
}
}
@Override
public void log(int level, String application, String message) {
if(level<logLevel) return;
count++;
if(count++>100) {
try {
checkFile();
} catch (IOException e) {}
count=0;
}
String line=LogUtil.getLine(level,application,message);
write(line);
}
private void write(String str) {
try {
IOUtil.write(res,str,charset,true);
} catch (IOException e) {}
}
@Override
public void info(String application, String message) {
log(LEVEL_INFO,application,message);
}
@Override
public void debug(String application, String message) {
log(LEVEL_DEBUG,application,message);
}
@Override
public void warn(String application, String message) {
log(LEVEL_WARN,application,message);
}
@Override
public void error(String application, String message) {
log(LEVEL_ERROR,application,message);
}
@Override
public void fatal(String application, String message) {
log(LEVEL_FATAL,application,message);
}
/**
* @return Returns the resource.
*/
public Resource getResource() {
return res;
}
@Override
public int getLogLevel() {
return logLevel;
}
@Override
public void setLogLevel(int level) {
this.logLevel=level;
}
@Override
public String toString(){
return res.getAbsolutePath();
}
/**
* maximum file size of for a log file
*/
public static final long MAX_FILE_SIZE=1024*1024;
/**
* @return the maxFileSize
*/
public long getMaxFileSize() {
return maxFileSize;
}
/**
* @return the maxFiles
*/
public int getMaxFiles() {
return maxFiles;
}
}