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
相关产品推荐
相关产品推荐

