You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java日志循环生成冗余文件求助:如何阻止Logs.txt.n及.lck文件创建?

兄弟,我一眼就瞅出问题所在了——你在while循环里每次都重复创建Logger和FileHandler实例,还从来不关闭资源!这就是为啥会冒出一堆Logs.txt.1、Logs.txt.2,还有烦人的.lck锁文件的原因。

问题根源拆解

你每次循环都在做这些重复且错误的操作:

  • 反复调用Logger.getLogger("MyLog"):虽然Logger是单例模式,但你每次都给它添加新的FileHandler,导致多个Handler同时往文件写
  • 每次都新建FileHandler:旧的Handler没被关闭,文件句柄一直被占用,新的Handler只能生成带序号的新文件来规避冲突
  • 锁文件.lck:这是Java日志框架用来防止多进程写入的机制,因为你的Handler没关闭,锁一直没被释放,所以会残留下来
解决方案:初始化一次资源,循环内只打日志

正确的做法是把日志相关的初始化逻辑放到while循环外面,只执行一次;循环里只负责根据outcome输出日志;最后循环结束后关闭Handler释放资源。

修改后的代码示例

// 日志资源初始化,放在循环外只执行一次
Logger logger = Logger.getLogger("MyLog");
FileHandler fh = null;
try {
    // 初始化FileHandler,指定追加模式
    fh = new FileHandler("C:\\Temp\\Dice_Roll_J\\Logs.txt", true);
    logger.addHandler(fh);
    logger.setLevel(Level.ALL);
    
    // 设置日志格式
    SimpleFormatter formatter = new SimpleFormatter();
    fh.setFormatter(formatter);

    // 你的while循环逻辑
    while (/* 这里填你的循环条件,比如true表示无限循环 */) {
        // 生成骰子结果的业务逻辑
        int outcome = /* 这里替换成你生成outcome的代码 */;

        // 循环内只做日志输出,不重复初始化资源
        if (outcome == 1) {
            logger.log(Level.INFO, "Outcome 1.");
        } else if (outcome == 2) {
            logger.log(Level.INFO, "Outcome 2");
        }
        // 可以继续添加其他outcome的判断
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 循环结束后必须关闭FileHandler,释放文件资源、清除锁文件
    if (fh != null) {
        fh.close();
    }
}

额外优化小建议

  • 用else if代替多个独立的if,逻辑更清晰也更高效
  • 如果是长期运行的服务,不需要每次循环都关闭Handler,但一定要确保程序退出时执行关闭操作;如果是短周期循环,用完就关闭是最佳实践
  • 永远不要重复调用logger.addHandler(fh),否则同一条日志会被多次写入

这样调整后,就不会再生成一堆带序号的日志文件,也不会残留.lck锁文件啦!

内容的提问来源于stack exchange,提问作者MasterHackerLOIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:27:49