本文纲要日志技术与输出语句的区别日志体系结构与Log4jLog4j入门案例Log4j三大核心Logger记录器Appender输出源Layout布局配置文件详解Log4j在项目中的应用日志技术与输出语句的区别在开发中经常需要了解系统的运行情况。以往我们通常在关键位置使用System.out.println()输出信息但这种方式存在明显弊端不易关闭如果不再需要查看信息必须修改代码删除输出语句。输出位置单一信息只能展示在控制台无法持久化到文件或数据库。性能影响输出语句与业务代码运行在同一线程可能影响性能。日志技术Log则能很好地解决这些问题。它不仅可以记录程序运行时的关键信息还具备以下优势对比维度System.out 输出日志技术是否需改代码需要修改代码只需修改配置文件输出目的地仅控制台控制台、文件、数据库等线程模型与业务代码同一线程多线程记录减小性能影响灵活控制无级别概念支持日志级别、格式、过滤因此现代Java开发中普遍采用日志框架替代直接输出。日志体系结构与Log4jJava日志体系包含两套主流接口和多种实现实现接口Commons LoggingSimple Logging Facade for JavaLog4jjava.util.loggingLogbackJCL (Jakarta Commons Logging)Apache 早期提供的日志接口现更名为Commons Logging。SLF4J (Simple Logging Facade for Java)另一个流行的日志门面提供了更简洁的 API支持在运行时绑定具体的日志实现。Log4j是 Apache 的一个开源日志实现也是目前最常用的日志框架之一。通过 Log4j 我们可以控制日志输出目的地控制台、文件等控制每条日志的输出格式定义日志级别精细管理日志生成全部通过配置文件灵活设置无需修改代码接下来的内容将以Log4jSLF4J组合为例展示如何在实际项目中使用日志。Log4j入门案例1 ) 开发流程导入Log4j相关的jar包编写Log4j配置文件log4j.properties在代码中获取日志对象按照日志级别记录日志信息2 ) 项目结构log4j-demo ├── lib │ ├── log4j-1.2.17.jar │ ├── slf4j-api-1.7.30.jar │ └── slf4j-log4j12-1.7.26.jar ├── src │ ├── log4j.properties │ └── com/wb/demo1 │ └── Log4JTest01.java3 ) 配置文件一个最简单的log4j.properties内容如下log4j.rootLoggerdebug,my,fileAppender # 输出到控制台 ### log4j.appender.myorg.apache.log4j.ConsoleAppender log4j.appender.my.ImmediateFlush true log4j.appender.my.TargetSystem.out log4j.appender.my.layoutorg.apache.log4j.PatternLayout log4j.appender.my.layout.ConversionPattern%d %t %5p %c{1}:%L - %m%n # 输出到文件 log4j.appender.fileAppenderorg.apache.log4j.FileAppender log4j.appender.fileAppender.ImmediateFlush true log4j.appender.fileAppender.Appendtrue log4j.appender.fileAppender.FileD:/log4j-log.log log4j.appender.fileAppender.layoutorg.apache.log4j.PatternLayout log4j.appender.fileAppender.layout.ConversionPattern%d %5p %c{1}:%L - %m%n4 ) 获取日志对象推荐使用SLF4J的 API 获取日志对象这样更换底层日志实现时无需修改业务代码。packagecom.wb.demo1;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassLog4JTest01{//使用slf4j里面的api来获取日志的对象//好处如果以后我们更换日志的实现类那么下面的代码不需要跟着修改//推荐使用privatestaticfinalLoggerLOGGERLoggerFactory.getLogger(Log4JTest01.class);publicstaticvoidmain(String[]args){//1.导入jar包//2.编写配置文件//3.在代码中获取日志的对象//4.按照日志级别设置日志信息LOGGER.debug(debug级别的日志);LOGGER.info(info级别的日志);LOGGER.warn(warn级别的日志);LOGGER.error(error级别的日志);}}注意直接使用 Log4j 的Logger.getLogger()方法也能获取对象但这样会与具体实现耦合不便于未来切换框架因此不推荐。运行main方法后控制台和D:/log4j-log.log文件中都会输出相应级别的日志。如果将根日志级别改为 info则debug日志不会被输出。Log4j三大核心Log4j 主要围绕三个核心组件工作Logger记录器、Appender输出源、Layout布局。应用程序LoggerAppenderLayout输出目的地1 ) Logger 记录器Logger 负责捕获日志信息并决定哪些信息需要输出。Log4j 定义了以下常用日志级别从低到高级别含义DEBUG用于开发过程中的调试信息INFO用于输出重要的运行信息WARN可能出现问题但不影响程序继续运行ERROR发生错误但程序仍可继续运行FATAL严重错误会导致程序停止规则只输出不低于设定级别的日志。例如配置级别为INFO则DEBUG不会被输出若配置为ALL则所有级别全部输出配置为OFF则关闭所有日志。2 ) Appender 输出源Appender 指定日志的输出目的地。常用的有Appender 类作用ConsoleAppender输出到控制台FileAppender输出到文件配置时需要为每个 Appender 指定一个名字例如my,fileAppender名字可以随意命名。示例# 控制台输出命名为 my log4j.appender.myorg.apache.log4j.ConsoleAppender log4j.appender.my.ImmediateFlush true log4j.appender.my.TargetSystem.out # System.out黑或 System.err红 # 文件输出命名为 fileAppender log4j.appender.fileAppenderorg.apache.log4j.FileAppender log4j.appender.fileAppender.Appendtrue # true:追加, false:覆盖 log4j.appender.fileAppender.FileD:/log4j-log.log4.3 Layout 布局Layout 负责格式化日志输出内容。常用布局管理器布局类特点PatternLayout灵活定制输出格式最常用SimpleLayout仅包含日志级别和信息字符串TTCCLayout包含时间、线程、类别等信息PatternLayout通过ConversionPattern来定义格式常用的占位符如下占位符含义%p日志级别%d日期时间%t线程名%c{1}类名可指定精度%L行号%m输出的日志信息%n换行符示例配置log4j.appender.my.layoutorg.apache.log4j.PatternLayout log4j.appender.my.layout.ConversionPattern%d %t %5p %c{1}:%L - %m%n配置文件详解真实的log4j.properties通常包含三大部分第一部分根 Logger 配置log4j.rootLoggerdebug,my,fileAppenderdebug全局日志级别可写为OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL。my,fileAppender指定使用的 Appender 名称多个用逗号分隔。第二部分Appender 配置以my和fileAppender为例定义其类型、刷新模式、目标位置等属性。第三部分Layout 配置为每个Appender绑定具体的Layout及输出格式。完整示例就是前面提供的log4j.properties通过修改它就能灵活调整日志行为无需改动代码。Log4j在项目中的应用在实际 Web 项目如一个 NIO 服务器中使用 Log4j遵循以下四步即可1 ) 导入 jar 包将log4j-1.2.17.jar,slf4j-api-1.7.30.jar,slf4j-log4j12-1.7.26.jar加入项目lib目录并添加为库。2 ) 放置配置文件将log4j.properties拷贝到src目录下必须是该名称3 ) 获取Logger对象在需要日志的类中通过SLF4J获取privatestaticfinalLoggerloggerLoggerFactory.getLogger(当前类.class);4 ) 记录日志在关键业务逻辑处记录logger.info(已经处理了登录请求准备给浏览器响应);运行时控制台和指定文件会同时输出日志信息形如2025-03-07 10:15:30,123 main INFO HttpServer:25 - 已经处理了登录请求准备给浏览器响应这样我们就能够清晰追踪系统运行状况并且可以根据环境灵活控制日志级别与输出位置。总结通过以上内容我们了解了日志技术与传统输出的区别、Java日志体系结构、Log4j的核心组件以及实际项目中的应用方法。掌握这些基础知识后你就可以在项目中高效地运用日志技术提升问题排查和系统监控的效率。