Подтвердить что ты не робот

Получить файл журнала tomcat программно в webapp

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

    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;
}