Log4j не воссоздает файлы при удалении - PullRequest
5 голосов
/ 30 марта 2012

У меня есть веб-приложение в Tomcat, которое использует log4j для ведения журнала.
Если я удаляю файлы журнала во время работы веб-приложения, файлы не воссоздаются?
Как настроить log4j для воссоздания файлов при удалении без перезапуска Tomcat?

Ответы [ 4 ]

3 голосов
/ 30 марта 2012

Если ваш tomcat находится на сервере linux и вы запускаете его с определенным пользователем, у которого нет прав на выполнение для папки журнала, ваш log4j не будет воссоздавать ваши журналы, потому что, вероятно, он имеет только права на чтение / запись.

Если это так, попробуйте:

chmod 755 в папке с содержимым

EDIT:

Вторая возможность заключается в том, что некоторые операционные системы завершают операцию «удаления» только тогда, когда файл больше не используется. Если это так, ваш кот все еще может «видеть» журнал, как там.

EDIT2:

В этом случае выполните задание cron, которое каждые несколько минут проверяет наличие файла. Если не просто воссоздать его. Я предоставлю решение в течение нескольких минут.

Так что bash, который должен быть в вашем crontab, будет выглядеть примерно так:

if [ ! -f /tomcat_dir/log4j.log ]
then
  `touch /tomcat_dir/log4j.log`;
fi
1 голос
/ 30 марта 2012

В log4j.properties настройте RollingFileAppender

#------------------------------------------------------------------------------
#
#  Rolling File Appender
#
#------------------------------------------------------------------------------
log4j.appender.rfile = org.apache.log4j.RollingFileAppender
log4j.appender.rfile.File = logs/server.log
log4j.appender.rfile.Append = false
log4j.appender.rfile.MaxFileSize=10240KB
log4j.appender.rfile.MaxBackupIndex=10
log4j.appender.rfile.layout = org.apache.log4j.PatternLayout
log4j.appender.rfile.layout.ConversionPattern = %d %-5p [%C] (%t) %m (%F:%L)%n

Настройка ежедневного задания cron (скрипт sh в /etc/crond.daily/), которое очищает журналы за $ DAYS old

find $LOG_ROOT/log/server.log* -mtime +$DAYS -exec rm {} \;
0 голосов
/ 04 октября 2018

Я нашел решение для Log4j2.

Short:
Мы можем вручную инициализировать процесс ролловера при обнаружении удаления файла.

Ролловер можно инициализировать с помощью RollingFileManager:

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
// You should know only appender name.
RollingFileAppender appender = (RollingFileAppender) ctx.getConfiguration().getAppenders().get(appenderName);

if (appender != null) {
    // Manually start rollover logic.
    appender.getManager().rollover();
}

Больше здесь .

0 голосов
/ 31 июля 2018

Я прошел исходный код log4j. При инициализации FileAppender / RollingFileAppender создается экземпляр FileOutputStream, указывающий на файл. Новый объект FileDescriptor создается для представления этого файлового соединения. По этой причине другие решения, такие как «Мониторинг файла через Cron» и «Создание файла в методе добавления путем переопределения», не работали для меня, потому что новый файловый дескриптор был назначен новому файлу. Log4j Writer по-прежнему указывает на старый FileDescriptor.

Решением было проверить, присутствует ли файл и, если нет, вызвать метод activeOptions, присутствующий в классе FileAppender.

package org.apache.log4j;

import java.io.File;
import org.apache.log4j.spi.LoggingEvent;

public class ModifiedRollingFileAppender extends RollingFileAppender {

    @Override 
    public void append(LoggingEvent event) {
        checkLogFileExist();
        super.append(event);
    }

    private void checkLogFileExist(){
        File logFile = new File(super.fileName);
        if (!logFile.exists()) {
            this.activateOptions();
        }
    }
}

Наконец добавьте это в файл log4j.properties:

log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ModifiedRollingFileAppender
log4j.appender.A1.File=/path/to/file
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss,SSS} %p %c{1}: %m%n

//Skip the below lines for FileAppender
log4j.appender.A1.MaxFileSize=10MB
log4j.appender.A1.MaxBackupIndex=2

Примечание : я проверил это для log4j 1.2.17

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