Получить файл журнала tomcat программно в webapp
Я ищу способ получить журнал Tomcat в webapp. Раньше я видел эту функцию, предоставляемую в других веб-папках, обычно сбрасывая журнал в сервлет.
Я использую slf4j (с log4j) и Tomcat 6. Я не нашел ничего подходящего в документах Tomcat, хотя JMX API выглядит так, будто он может предоставить что-то полезное? Я не слишком обеспокоен тем, будет ли результат представлять только ведение журнала Webapp или весь журнал Tomcat, либо будет достаточно.
В идеале я надеюсь на решение, которое не связано с очисткой журнала от файловой системы, хотя, если это единственный способ, было бы здорово, если бы каталог журнала мог быть рассчитан во время выполнения...
Ответы
Ответ 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;
}