在REST API上关闭FileHandler的最佳方法

问题描述 投票:0回答:1

我不知道如何在API REST上处理我的FileHandler

我在Weblogic上安装了REST API,正在使用Java日志记录,当我的应用程序启动时,启动记录器,然后打开FileHandler。就像我从不关闭FileHandler一样,创建的.lck文件保留在我的日志文件夹中。我真的不在乎该文件的存在,但是当我重新部署该应用程序时,就像FileHandler仍然打开时,我的应用程序将启动一个新的日志文件(例如:myLog.log.0myLog.log.1)。我已经读过JVM本身应该关闭FileHandler,但是那没有发生。我试图addShutodownHook关闭FileHandler,但是该代码无法正常工作,如果我重新部署该应用程序,它仍然保持打开状态。

@ApplicationPath("api")
public class GenericApplication extends Application {
    public GenericApplication() {
        initSwagger();
        initLog();

        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                CtgLogger.fileJson.close();
                // fileJson is my FileHandler, i made it public static to call him here.
            }
        });
    }

我的initLog()方法只调用下一个CtgLogger.setup() ...

public static void setup() throws IOException {
    Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
    String level = PropertiesUtil.get("ctg.log.level");
    logger.setLevel(LEVEL_MAP.get(level));

    String filePath = PropertiesUtil.get("ctg.log.path");
    String fileSize = PropertiesUtil.get("ctg.log.max.size");
    String fileCount = PropertiesUtil.get("ctg.log.max.count");
    if (StringUtils.isNotEmpty(fileSize) && StringUtils.isNotEmpty(fileSize) &&
        NumberUtils.isNumber(fileSize) && NumberUtils.isNumber(fileCount)) {
        fileJson = new FileHandler(filePath != null ? filePath : DEFAULT_LOG_NAME,
            Integer.parseInt(fileSize), Integer.parseInt(fileCount), true);
    } else {
        fileJson = new FileHandler(filePath != null ? filePath : DEFAULT_LOG_NAME);
    }
    jsonFormatter = new JsonCustomFormatter();
    fileJson.setFormatter(jsonFormatter);
    for (Handler h: logger.getHandlers())
        h.close();
    logger.addHandler(fileJson);
}

仅此而已,然后我只需呼叫端点并使用记录器即可。

我的问题是,每次调用端点时,我都应该打开和关闭FileHandler吗?还是有更好的方法来做到这一点?

java file logging weblogic filehandler
1个回答
1
投票

我的问题是,每次调用端点时,我都应该打开和关闭FileHandler吗?还是有更好的方法来做到这一点?

  1. 删除关机挂钩代码。 LogManager将在关机时为您关闭任何attached文件处理程序。
  2. logger更改为静态最终引用,因此为impossible to garbage collect。这样可以确保您的设置得到保留。
  3. 由于使用JavaEE,因此请使用javax.annotation.PostConstructjavax.annotation.PreDestroy批注来管理记录器设置。
  4. 如果手动关闭FileHandler,请确保调用Logger::remove(Handler),以便可以垃圾回收处理程序。您当前的代码仅关闭处理程序。
© www.soinside.com 2019 - 2024. All rights reserved.