Java中如何在方法调用前后打印日志并减少重复代码?
最佳方案:封装通用计时日志工具方法
针对这种重复的“日志-执行-日志”模式,最简洁且易维护的方案是封装一个通用的计时日志工具方法,把日志逻辑和任务执行解耦,彻底消除重复代码。
实现步骤
- 编写工具类统一处理日志与任务执行:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.function.Consumer; import com.microsoft.playwright.Page; public class LogTiming { private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 适配接收Page参数的任务方法 public static void withTiming(String taskName, Page page, Consumer<Page> task) { LocalDateTime startTime = LocalDateTime.now(); System.out.printf("[+] - %s (start) %s%n", taskName, dtf.format(startTime)); try { task.accept(page); } finally { LocalDateTime endTime = LocalDateTime.now(); System.out.printf("[+] - %s (end) %s%n", taskName, dtf.format(endTime)); } } }
这里用Consumer<Page>函数式接口接收待执行的任务方法(比如HomePage::performBankAccountDetail这类方法引用),try-finally保证即使任务抛出异常,结束日志也能正常输出。
- 简化原有调用代码:
Page page = context.newPage(); LogTiming.withTiming("Account detail", page, HomePage::performBankAccountDetail); LogTiming.withTiming("Documents detail", page, DocumentsSequence::documentsVisualization);
方案优势
- 彻底消除重复:所有日志打印逻辑集中在工具类,调用点只需传入任务名称和执行方法
- 维护成本低:后续修改日志格式(比如切换到SLF4J等日志框架、调整输出内容)时,仅需修改
LogTiming类,无需改动所有调用处 - 扩展性强:可轻松重载方法支持其他场景,比如无参数任务用
Runnable、带返回值任务用Function
进阶扩展(可选)
如果需要统计任务执行时长,可在工具方法中增加时长计算:
public static void withTiming(String taskName, Page page, Consumer<Page> task) { LocalDateTime startTime = LocalDateTime.now(); System.out.printf("[+] - %s (start) %s%n", taskName, dtf.format(startTime)); try { task.accept(page); } finally { LocalDateTime endTime = LocalDateTime.now(); long duration = java.time.Duration.between(startTime, endTime).toMillis(); System.out.printf("[+] - %s (end) %s (duration: %dms)%n", taskName, dtf.format(endTime), duration); } }
内容的提问来源于stack exchange,提问作者binaryRat
相关产品推荐
相关产品推荐

