Как избежать и контролировать приращение файлов app.log.X в JAVA LOGGIN

Я борюсь с чем-то со вчерашнего дня.

Я хочу войти в веб-приложение (WAR) в Java.

Я создаю журнал, добавляю FileHandler и отправляю сообщения журнала. Но, как все мы знаем, обработчик файлов сохраняет блокировку над новым файлом до тех пор, пока я не вызову fush() и close(), поэтому, когда я повторно развертываю войну (или если я запускаю ее в разработке, и я постоянно развертываю приложение) создает один файл за развертывание (безобразно).

Итак, я пытался избежать этого поведения (я не уверен, что это делается с помощью производительности, может быть, открывать и закрывать файл каждый раз дорого, я не уверен), но я хочу подключить обработчик и очистить / закрывать каждый раз, когда Logger регистрирует сообщение. (Так что у меня есть только один файл).

Но я не могу найти способ сделать это. Я пытаюсь расширить класс java.util.Logger, и это очень сложно... (и против этого некоторые люди).

Кто-то знает, как я могу подойти к этой ситуации?

Заранее спасибо!

public class LogUtil {

public static String name = "app%g.log";

public static Logger obtenerLogger(String eid, String path, Level levelToLog) {
    Logger logger = Logger.getLogger(eid);
    if (levelToLog != null) {
        logger.setLevel(levelToLog);
    }

    //I create the folder if not exist
    File dirFile = new File(path);
    if (!dirFile.exists()) {
        dirFile.mkdirs();
    }

    //I remove the handlers and close after each logg call (doing this i can use the same file lof after log)
    for (Handler handler : logger.getHandlers()) {
        logger.removeHandler(handler);
        handler.close();
        handler.flush();
    }

    //I Create the FileHandler 
    FileHandler f;
    try {
        f = new FileHandler(
                path + name, //pattern
                10485760, //limit
                3, // count
                true); //append
        //f.setFormatter(new SimpleFormatter());
        f.setFormatter(new MyFormatter());
        f.setLevel(levelToLog);
    } catch (Exception ex) {
        return null;
    }

    logger.addHandler(new ConsoleHandler());
    logger.addHandler(f);

    return logger;
}

PD1: Но при повторном развертывании войны я вызываю класс логгеров, он создает нового логгера, но последний остается открытым. И это то, что беспокоит меня (я думаю)

2 ответа

Ответ здесь: Как создать файл журнала для каждой записи в определенном формате, используя среду ведения журнала утилит Java

Я должен расширить обработчик и переопределить метод публикации. (Я пытался реализовать класс Logger для закрытия после каждого вызова журнала. НЕ ДЕЛАЙТЕ ЭТО! Jeje).

Спасибо за ваш интерес!

Я создаю журнал, добавляю FileHandler и отправляю сообщения журнала. Но, как все мы знаем, обработчик файлов сохраняет блокировку над новым файлом до тех пор, пока я не вызову fush() и close(), поэтому, когда я повторно развертываю войну (или если я запускаю ее в разработке, и я постоянно развертываю приложение) создает один файл за развертывание (безобразно).

Если вы программно настраиваете дерево логгеров и обработчик, вы должны реализовать собственный ServletContextListener и зарегистрировать его в своем веб-приложении. Вот пример.

Также убедитесь, что вы держите сильную ссылку на ваши регистраторы

Другие вопросы по тегам