1。Java日志概述说到Java日志,很多初学者可能会一头雾水,因为这里涉及的东西太多了:ApacheCommonsLogging、Slf4j、Log4j、Log4j2、Logback、JavaUtilLogging等等,这些都有什么作用构架?它们之间有什么区别?1.1总体概述下图很好地展示了Java中的日志系统:可以看到,Java中的日志框架主要分为两个类:LoggingFacade和LoggingImplementation。日志门面日志门面定义了一套日志接口规范,不提供底层的具体实现逻辑。ApacheCommonsLogging和Slf4j属于这一类。日志实现日志实现是日志的具体实现,包括日志级别控制、日志打印格式、日志输出形式(输出到数据库、输出到文件、输??出到控制台等)。Log4j、Log4j2、Logback和JavaUtilLogging属于此类。将日志门面和日志实现分开,其实就是一个典型的门面模式。这种方式可以让具体的业务在不同的日志实现框架之间自由切换,而无需更改任何代码。开发者只需要掌握日志门面的API即可。日志门面不能单独使用,必须和具体的日志实现框架结合使用。那么日志框架可以单独使用吗?从技术上来说当然是没问题的,但是我们一般不会这样做,因为不好维护,后面也不好扩展。比如A开发了一个使用Log4j打印日志的工具包,B引用了这个工具包,但是B喜欢用Logback打印日志。这时,一个业务使用了两个或多个日志框架,开发者也需要维护多个用于日志记录的Configuration文件。所以我们都是使用日志门面来打印日志。1.2日志级别使用日志级别的好处是,通过调整级别,可以屏蔽很多调试相关的日志输出。不同的日志实现定义的日志级别不尽相同,但都大同小异。JavaUtilLoggingJavaUtilLogging定义了7种日志级别,从严重到普通:SEVEREWARNINGINFOCONFIGFINEFINERFINEST因为默认级别是INFO,低于INFO级别的日志将不会被打印出来。Log4jLog4j定义了8个日志级别(不包括OFF和ALL,可以说分为6个级别),从严重到普通:OFF:最高级别,用于关闭所有日志记录。FATAL:主要错误,这个级别可以直接停止程序。ERROR:打印错误和异常信息。如果不想输出太多日志,可以使用这个级别。WARN:警告提示。INFO:用于输出生产环境中程序运行的一些重要信息,不能滥用。DEBUG:用于开发时打印一些运行信息。TRACEALL最低级别,用于启用所有日志记录。LogbackLogback日志级别比较简单,从严重到正常:ERRORWARNINFODEBUGTRACE1.3综合比较JavaUtilLogging系统在JVM启动时读取配置文件并完成初始化。一旦应用程序开始运行,就无法修改配置。另外,这种日志实现配置也不是很方便。您只能在JVM启动时传递参数,如下所示:-Djava.util.logging.config.file=。由于这些限制,JavaUtilLogging并未得到广泛使用。Log4j的配置虽然繁琐,但是一旦配置完成,使用起来还是非常方便的。你只需要将相关的配置文件放在类路径下即可。在很多情况下,Log4j配置文件可以在不同的项目中重复使用。Log4j可以与ApacheCommonsLogging一起使用。ApacheCommonsLogging将自动搜索和使用Log4j。如果未找到Log4j,将使用JavaUtilLogging。比Log4j+ApacheCommonsLogging组合更流行的是Slf4j+Logback组合。Logback是Slf4j的原生实现框架,也是Log4j的作者(CekiGülcü)编写的,但比Log4j有更多的优势、特性和更强的性能。1.4最佳实践如果你不想添加任何依赖,使用JavaUtilLogging或者框架容器已经提供的日志接口。如果你关心性能,我推荐:Slf4j+Logback。如果项目中一直使用Log4j,没有发现性能问题,推荐组合为:Slf4j+Log4j2。2.SpringBoot日志实现SpringBoot使用ApacheCommonsLogging作为内部日志框架门面,它只是一个日志接口。在实际应用中需要为此接口指定相应的日志实现。SpringBoot默认的日志记录实现是Logback。这个好查:随便开一个SpringBoot项目,从控制台找一行日志,比如下面:考虑到最后一个prod是一个可以改变的字符,我们在项目中全局搜索:如下配置文件处于活动状态,结果如下:日志输出行中的调试。然后再次启动项目,如下图所示:此时我们可以看到真正的日志实现是Logback。SpringBoot对JavaUtilLogging和Log4j等其他框架也有很好的支持。在SpringBoot项目中,只要添加如下web依赖,就会自动添加日志依赖:org.springframework.bootspring-boot-starter-web2.1SpringBoot日志配置SpringBoot的日志系统会根据classpath下的内容自动选择合适的日志配置,在这个过程中首选Logback。如果开发者需要修改日志级别,只需要在application.properties文件中以logging.level前缀+包名的形式配置即可,例如:logging.level.org.springframework.web=debuglogging。level.org.hibernate=error如果想将日志输出到文件,可以通过如下配置指定日志文件名:logging.file.name=javaboy.loglogging.file.name可以只指定日志文件名称,或者您可以指定日志文件的完整路径。例如如下:logging.file.name=/Users/sang/Documents/javaboy/javaboy.log如果你只是想重新定义输出日志文件的路径,你也可以使用logging.file.path属性,如下:logging.file。path=/Users/sang/Documents/javaboy如果想细粒度的管理输出到文件的日志,可以配置如下属性:logging.logback.rollingpolicy.file-name-pattern:文件名日志归档,日志文件达到一定大小后,自动压缩归档。logging.logback.rollingpolicy.clean-history-on-start:应用启动时是否进行归档管理。logging.logback.rollingpolicy.max-file-size:日志文件大小的上限。达到上限后,会自动压缩。logging.logback.rollingpolicy.total-size-cap:日志文件在被删除之前可以容纳的最大大小。logging.logback.rollingpolicy.max-history:保留日志文件的天数。对于日志文件归档,有兴趣的可以自己试试。你可以先缩小max-file-size属性,这样你可以很容易地看到效果:logging.logback.rollingpolicy.max-file-size=1MB然后添加如下接口:@RestControllerpublicclassHelloController{privatestaticfinalLogger记录器=getLogger(HelloController.class);@GetMapping("/hello")publicvoidhello(){for(inti=0;i<100000;i++){记录器。信息(“你好javaboy”);}}}访问这个界面,可以看到最后生成的日志文件是自动压缩的:日志分组也可以在application.properties中配置。日志分组可以将相关的logger归为一个组,统一管理。比如我们可以定义一个tomcat组:logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat然后统一管理tomcat组中的所有logger:logging.level.tomcat=SpringBoot中的TRACE也预定义了两个日志组web和??sql,如下:但是在application.properties中只能实现一些非常简单的日志配置。如果想实现更细粒度的日志配置,需要使用logs实现的原生配置,比如Logback的classpath:logback.xml、Log4j的classpath:log4j.xml等,如果classpath中存在这些日志配置文件,那么默认情况下,SpringBoot会自动加载这些配置文件。2.2Logback配置2.2.1基本配置Logback默认有两个配置文件名:logback.xml:该配置文件将被日志框架直接加载。logback-spring.xml:这种配置文件不会被日志框架直接加载,而是由SpringBoot解析来配置日志配置,可以使用SpringBoot的高级Profile功能。SpringBoot为Logback提供了四个默认的配置文件,位于org/springframework/boot/logging/logback/,分别是:defaults.xml:提供公共日志配置,日志输出规则等console-appender.xml:添加一个ConsoleAppender使用CONSOLE_LOG_PATTERN。file-appender.xml:添加一个RollingFileAppender。base.xml:提供与旧版本的SpringBoot的兼容性。如果需要自定义logback.xml文件,可以使用也可以不使用这些默认的配置文件。一个典型的logback.xml文件如下(resources/logback.xml):可以通过include导入SpringBoot已经提供的配置文件,也可以自定义。2.2.2输出到文件如果想关闭控制台的日志输出,而是将日志内容输出到文件中,我们可以自定义一个logback-spring.xml文件,导入上面提到的file-appender.xml文件。像下面这样(resources/logback-spring.xml):2.3Log4j配置如果classpath中有Log4j2依赖,SpringBoot会自动配置。默认情况下,类路径中没有Log4j2依赖项。如果要使用Log4j2,可以排除现有的Logback,然后导入Log4j2,如下:<排除项><排除项>org.springframework.bootspring-boot-starter-logging排除项>排除项>org.springframework.bootspring-boot-starter-log4j2Log4j2的配置比较简单,在reources目录下新建一个log4j2.xml文件,内容为如下:logging日志??/${app_name}<appenders><策略><策略>首先在properties节点指定应用名称和日志文件位置,然后通过几个不同的RollingFiles处理不同级别的日志。不同级别的日志会输出到不同的文件中,并按照各自的命名方式进行压缩。这个配置比较程式化,小伙伴们可以保存起来做成IntelliJIDEA模板,方便日常使用。3.总结嗯,这是宋哥和小伙伴们分享的SpringBoot日志。总体来说不难,大家可以仔细看看。