我正在寻找一种在webapp中检索Tomcat日志的方法。在过去,我见过其他webapps中提供的这个功能,通常会将日志转储到Servlet中。
我正在使用slf4j(带有log4j)和Tomcat 6.我没有在Tomcat文档中找到任何相关内容,尽管JMX API看起来可能提供了一些有用的东西?我不太关心输出是仅代表webapp日志记录还是整个Tomcat日志,要么就足够了。
理想情况下,我希望找到一个不涉及从文件系统中抓取日志的解决方案,尽管如果这是唯一的方法,那么如果可以在运行时计算日志目录就会很棒......
答案 0 :(得分:19)
从文件系统中抓取日志可能是最简单的方法。您可以使用System.getProperty("catalina.base") + "/logs"
以编程方式直接获取日志。
否则你可以在你的log4j配置中设置一个额外的appender来记录JDBC,JMS,Writer等等。对你的应用程序有什么意义。
答案 1 :(得分:6)
此函数将获取与给定前缀匹配的最新日志文件。您无需知道日志写入的目录。
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;
}