Java命令行程序:System.out与Logger输出方案选择及格式优化咨询
方案选择与Logger输出优化方案
一、哪种方案更优?
优先选择java.util.logging.Logger这类日志工具,原因如下:
- 符合最佳实践与可维护性:日志工具支持统一配置与管理,后续若需调整输出目标(比如同时输出到文件)、修改日志级别(调试时输出详细日志,生产环境只保留错误信息),无需修改业务代码,仅通过配置即可实现;而
System.out.println(sout)缺乏这类灵活性,后续维护成本高,还会触发Sonar等代码检查工具的规范告警。 - 日志分级能力:日志工具支持INFO、ERROR等不同级别,能清晰区分操作成功提示与错误反馈,用户可快速识别问题严重程度。
- 扩展性:如果后续应用需要集成日志收集系统(如ELK),日志工具的标准化输出更容易对接,sout则需要额外改造。
sout虽然输出简洁,但仅适合临时调试场景,长期来看不符合生产级应用的代码规范。
二、如何让Logger输出简洁无前缀?
你可以通过自定义日志格式实现无前缀的简洁输出,以下是两种可行方案:
1. 代码中自定义Formatter
实现一个仅输出日志消息的Formatter,替换默认格式:
import java.util.logging.Formatter; import java.util.logging.LogRecord; public class SimpleConsoleFormatter extends Formatter { @Override public String format(LogRecord record) { // 仅返回消息内容,加上换行符 return record.getMessage() + System.lineSeparator(); } }
然后在主类中配置Logger使用这个Formatter:
import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.Logger; public class Main { private static final Logger logger = Logger.getLogger(Main.class.getName()); public static void main(String[] args) { // 关闭父Logger的Handler,避免重复输出 logger.setUseParentHandlers(false); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setFormatter(new SimpleConsoleFormatter()); consoleHandler.setLevel(Level.ALL); logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { Executor executor = ExecutorFactory.getExecutor(args); executor.execute(); logger.info("操作成功"); } catch (ExecutorException e) { logger.info(e.getMessage()); } } }
2. 通过配置文件修改
创建自定义的logging.properties文件,指定自定义Formatter:
# 配置控制台Handler的Formatter java.util.logging.ConsoleHandler.formatter = com.yourpackage.SimpleConsoleFormatter # 设置日志级别 java.util.logging.ConsoleHandler.level = ALL
启动应用时指定该配置文件:
java -Djava.util.logging.config.file=logging.properties Main
两种方案都能让Logger输出类似sout的简洁内容,同时保留日志工具的所有优势。
内容的提问来源于stack exchange,提问作者chameerar
相关产品推荐
相关产品推荐

