Java – Custom log4j scrolling appender
My class code is as follows
public class LogLevelFilterFileAppender extends FileAppender implements Cloneable{ private final static String DOT = "."; private final static String DASH = "-"; private static final String ORIGINAL_FILE_NAME = "OrginalLogFileName"; public LogLevelFilterFileAppender() {} public LogLevelFilterFileAppender(Layout layout,String fileName,boolean append,boolean bufferedio,int bufferSize) throws IOException { new FileAppender(layout,fileName,append,bufferedio,10); new RollingFileAppender(layout,append); } public LogLevelFilterFileAppender(Layout layout,boolean append) throws IOException { super(layout,append); new RollingFileAppender(layout,String fileName) throws IOException { super(layout,fileName); new RollingFileAppender(layout,fileName); } @Override public void activateOptions() { MDC.put(ORIGINAL_FILE_NAME,fileName); super.activateOptions(); } @Override public void append(LoggingEvent event) { try { setFile(appendLevelToFileName((String) MDC.get(ORIGINAL_FILE_NAME),event.getLevel().toString()),fileAppend,bufferSize); } catch (IOException ie) { errorHandler .error( "Error occured while setting file for the log level " + event.getLevel(),ie,ErrorCode.FILE_OPEN_FAILURE); } super.append(event); } private String appendLevelToFileName(String oldLogFileName,String level) { if (oldLogFileName != null) { final File logFile = new File(oldLogFileName); String newFileName = ""; final String fn = logFile.getName(); final int dotIndex = fn.indexOf(DOT); if (dotIndex != -1) { newFileName = fn.substring(0,dotIndex) + DASH + level + DOT + fn.substring(dotIndex + 1); } else { newFileName = fn + DASH + level; } return logFile.getParent() + File.separator + newFileName; } return null; } }
My log4j The properties configuration is as follows
log4j.rootLogger = DEBUG,fileout log4j.appender.fileout = com.elitecore.mediation.util.log.LogLevelFilterFileAppender log4j.appender.fileout.layout.ConversionPattern = %d{MMMMM dd,yyyy HH:mm:ss} %-5p [ %C{1} - %M() - %L ] - %m%n # log4j.appender.fileout.layout.ConversionPattern = %d{MMMMM dd,yyyy HH:mm:ss} %-5p %c %M():%L - %m%n # %r [%t] %-5p %c %x - %m%n # %d{MMMMM dd HH:mm:ss} %-5p %c %M():%L - %m%n #%d{MMMMM dd HH:mm:ss} %6p %c %M() : %m%n log4j.appender.fileout.layout = org.apache.log4j.PatternLayout log4j.appender.fileout.File = /usr/local/mediation/logs/mediation-logs.log
This is to create logs for different types, such as debug, error and info in different log files But what are its limitations? It is creating larger and larger log files I want to create a 5 MB log file and delete the previous log How can I do this? When I try to use rollingfile appender, I only get the following log files
[root@manage logs]# ls -1 mediation-logs-DEBUG.log mediation-logs-ERROR.log mediation-logs-INFO.log mediation-logs-INFO.log.1 mediation-logs-INFO.log.2 mediation-logs.log
Rolling log file error, debug is not completed, but info is completed
Solution
I suggest you derive from rollingfileappender instead of fileappender This will allow you to define the growth of log files and the number of "old" files to keep About how to in log4j To use it in properties, please check the manual
If I understand correctly, you need one file for each log level. Is this correct? If so, I suggest you follow this FAQ entry instead of "scrolling" your own solution:)
Matching exact log-levels