在webapp中以编程方式获取tomcat日志文件

时间:2011-05-09 11:28:19

标签: java tomcat log4j slf4j

我正在寻找一种在webapp中检索Tomcat日志的方法。在过去,我见过其他webapps中提供的这个功能,通常会将日志转储到Servlet中。

我正在使用slf4j(带有log4j)和Tomcat 6.我没有在Tomcat文档中找到任何相关内容,尽管JMX API看起来可能提供了一些有用的东西?我不太关心输出是仅代表webapp日志记录还是整个Tomcat日志,要么就足够了。

理想情况下,我希望找到一个不涉及从文件系统中抓取日志的解决方案,尽管如果这是唯一的方法,那么如果可以在运行时计算日志目录就会很棒......

2 个答案:

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