在同一个servlet容器中为不同的webapp分离日志文件

时间:2016-01-26 08:32:33

标签: java servlets logging web-applications

假设我有2个Web应用程序(A& B)托管在同一个weblogic服务器中。我在每个Web应用程序中的/ WEB-INF下定义了logging.properties文件。属性文件定义了一组不同类的日志级别和一个文件处理程序,webapp A将日志写入A.log,而webapp B写入日志B.log。标准java.util.logging包用于记录。

定义servlet上下文侦听器,以便在上下文初始化时读取logging.properties文件。代码片段如下:

        InputStream is = sCtx.getResourceAsStream("/WEB-INF/logging.properties");
        LogManager logManager = LogManager.getLogManager();
        logManager.readConfiguration(is);

        Logger rootLogger = Logger.getLogger("");

        SysLogFileHandler fileHandler;
        try
        {
            String location = SysLogFileHandler.getSysLogFilePath();
            String fileName = SysLogFileHandler.LOG_FILE_PREFIX + "%d.log";

            fileHandler = new SysLogFileHandler(location + File.separator + fileName, true);
            fileHandler.setEncoding(Constant.DEFAULT_CHARSET);

            fileHandler.setLevel(Level.ALL);
            rootLogger.addHandler(fileHandler);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

我希望来自webapp A的日志只能写入A.log,而webapp B只能写入B.log。但是,结果并不像预期的那样。来自A& A的所有日志B只写入1个日志文件,取决于最后启动的webapp。

请问在webapp环境中使用单独的日志文件的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您使用的是默认的LogManager类,则调用readConfiguration将重置日志记录配置。

一种解决方案是使用或构建对Web类加载器敏感的新LogManager,如org.apache.juli.ClassLoaderLogManager,并使用该日志管理器启动服务器。