在 Web 应用内以编程方式获取 tomcat 日志文件

2022-09-04 07:07:12

我正在寻找一种在Web应用程序中检索Tomcat日志的方法。过去,我在其他web应用程序中看到了此功能,通常将日志转储到Servlet中。

我使用的是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;
}

推荐