Получить лог-файл Tomcat программно в веб-приложении

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

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

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

12 голосов | спросил seanhodges 9 Maypm11 2011, 15:28:18

2 ответа


0

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

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

ответил sourcedelica 9 Maypm11 2011, 17:13:11
0

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

    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;
}
ответил Jesse Barnum 31 PM00000060000000531 2012, 18:42:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132