Пользовательский log4j скользящий аппендер - PullRequest
4 голосов
/ 03 февраля 2012

Мой код класса, как показано ниже.

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, fileName,append);
    }

    public LogLevelFilterFileAppender(Layout layout, String fileName,
                                      boolean append) throws IOException {
        super(layout, fileName, append);
        new RollingFileAppender(layout, fileName,append);
    }

    public LogLevelFilterFileAppender(Layout 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, bufferedIO,
                    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;
    }
}

И моя конфигурация log4j.properties выглядит следующим образом.

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

Это создание журнала для разных типов, например, DEBUG, ERROR и INFO в разных файлах журнала.Но что это за ограничение?Это создает все большие и большие файлы журнала.Я хочу сделать файлы журнала, скажем, размером 5 МБ, и предыдущие журналы должны быть удалены.Как я могу это сделать?Когда я пытаюсь использовать RollingFile Appender, я получаю только следующие файлы журналов.

[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

Прокрутка файлов журналов ERROR, DEBUG не завершена, но INFO завершена.

1 Ответ

1 голос
/ 03 февраля 2012

Я предлагаю вам наследовать от RollingFileAppender вместо FileAppender. Это даст вам возможность определить, насколько большими будут расти файлы журнала и сколько «старых» файлов вы хотите сохранить. Прочтите руководство о том, как использовать его позже в вашем log4j.propertiers.

Если я правильно понимаю, вам нужен один файл на уровень журнала, это правильно? Если это так, я предлагаю вам следовать этому FAQ-Entry, а не «переходить» на собственное решение:)

Соответствие точным лог-уровням

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...