Получить лог-файл Tomcat программно в веб-приложении - PullRequest
12 голосов
/ 09 мая 2011

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

Я использую slf4j (с log4j) и Tomcat 6. Я не нашел ничего подходящего в документах Tomcat, хотя JMX API выглядит так, как будто он может предоставить что-то полезное? Меня не слишком беспокоит, будет ли вывод представлять только журнал веб-приложения или весь журнал Tomcat, либо этого будет достаточно.

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

Ответы [ 2 ]

20 голосов
/ 09 мая 2011

Очистка журнала от файловой системы, вероятно, самый простой способ. Вы можете получить журнал напрямую программно, используя System.getProperty("catalina.base") + "/logs".

В противном случае вы можете настроить дополнительный appender в вашей конфигурации log4j для регистрации чего-то вроде JDBC, JMS, Writer и т. Д. Что бы ни имело смысл для вашего приложения.

7 голосов
/ 31 августа 2012

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

    public static File locateLogFile( final String prefixToMatch ) {
    File result = null;
    Handler[] handlers = LogManager.getLogManager().getLogger( "" ).getHandlers();
    try {
        for( Handler handler : handlers ) {

            Field directoryField;
            Field prefixField;
            try {
                //These are private fields in the juli FileHandler class
                directoryField = handler.getClass().getDeclaredField( "directory" );
                prefixField = handler.getClass().getDeclaredField( "prefix" );
                directoryField.setAccessible( true );
                prefixField.setAccessible( true );
            } catch( NoSuchFieldException e ) {
                continue;
            }

            String directory = (String)directoryField.get( handler );
            if( prefixToMatch.equals( prefixField.get( handler ) ) ) {
                File logDirectory = new File(  directory );
                File[] logFiles = logDirectory.listFiles( new FileFilter() {
                    public boolean accept( File pathname ) {
                        return pathname.getName().startsWith( prefixToMatch );
                    }
                } );
                if( logFiles.length == 0 ) continue;
                Arrays.sort( logFiles );
                result = logFiles[ logFiles.length - 1 ];
                break;
            }
        }
    } catch( IllegalAccessException e ) {
        log.log( Level.WARNING, "Couldn't get log file", e );
    }
    return result;
}
...