Java日志大整合(千万别看)

2024-02-22 04:20
文章标签 java 日志 整合 千万别

本文主要是介绍Java日志大整合(千万别看),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

java日志

在程序开发中,日志是一个很重要的角色,其主要用于记录程序运行的情况,以便于程序在部署之后的排错调试等。

日志的概念

(1)日志的作用及好处

  1. 查看程序的运行状态以及程序的运行轨迹,方便对程序进行分析。

  2. 系统问题排查,日志结合异常处理,可快速发现程序发生异常的地点。

  3. 查看系统运行时间,为系统性能优化提供相关的依据。

  4. 安全审计,通过系统日志分析,可以判断一些非法攻击,非法调用,以及系统处理过程中的安全隐患。

(2)最简单的日志

最简单的日志使用便是System.out.print()

 public class Application(){
     public static void main(String[] args){
         // 设置日期格式
         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         // new Date()为获取当前系统时间
         String beginTime = df.format(new Date());
         System.out.print(beginTime + "程序开始了......");
         ...
         ...
         ...
         String endTime = df.format(new Date());
         System.out.print(endTime + "程序结束了......");
     }
 }

优点:直观、方便

缺点:

  • System.out.printjava运行程序运行在同一线程,业务程序会等待System.out.print的动作,导致资源被占用。

  • System.out.print是在控制台输出,只能输出到控制台,没有存储到日志文件当中。

  • 不规范。

(3)日志框架

Java 拥有功能和性能都非常强大的日志库,但不幸的是,日志库并不止一个,如JUL(Java Util Log)JCL(Commons Logging)Log4jSLF4JLogbackLog4j2 等等的日志工具,那么到底使用那一个呢?

Java日志的发展史

日志最早出现的是Apache开源社区的Log4j,此日志确实是应用最广泛的日志工具,成为了 Java 日志事实上的标准。之后, Java 的开发主体 Sun 公司为了抢回市场,在Jdk1.4中增加了与Log4j没有关联的 JUL(java.util.logging)日志实现,用于对抗 Log4j,但是却成为了 Java 目前记录日志局面混乱的开端。

当项目使用的第三方库使用了不同的日志工具时,就会造成一个应用中存在着多种日志的情况,由于各种日志之间互相没有关联,替换和统一日志工具也就变成了一件比较棘手的事情。为解决多种log工具存在的问题,Apache 开源社区提供了一个日志框架作为日志的抽象,叫 commons-logging,也被称为 JCLJCL 会对各种日志接口进行抽象,抽象出一个接口层,实现对每个日志框架都进行适配,在使用日志工具时直接使用抽象接口即可,完成了各种主流日志框架的兼容实现(Log4jJULsimplelog等),较好的解决了上述问题。

JCL出现之后,元老级日志Log4j 的作者 觉得 JCL 不够优秀,所以他再度开发了一套更优雅的日志框架 SLF4J(Simple Logging Facade for Java),即简单日志门面,并为 SLF4J实现了一个亲儿子——logback日志框架。在弄完后,觉得还是得照顾一下自己的“大儿子”log4j,于是对log4j进行升级,便出现了Log4j2

java common loggingSLF4J 都是日志的接口,供用户使用,而没有提供实现,Log4jJULlogbackLog4j2 等等才是日志的真正实现。他们之间的关系可看作电脑与打印机设备之间的关系,电脑连接多台没有关联的打印机,用户只需用电脑选择打印机进行打印。不相同的是,当我们调用日志接口时,接口会自动寻找恰当的实现,返回一个合适的实例给我们服务。这些过程都是透明化的,用户不需要进行任何操作。(如不理解,请继续往后阅读)

日志级别

日志级别日志描述
OFF关闭:最高级别,不输出日志
FATAL致命:输出非常严重的可能会导致应用程序终止的错误。
ERROR错误:严重错误,主要是程序出错。
WARN警告:输出可能潜在的危险状况。
INFO信息:输出应用运行过程的详细信息。
DEBUG调试:输出更细致的对调试应用有用的信息。
TRACE跟踪:输出更细致的程序运行轨迹。
ALL所有:输出所有级别信息。

最常见的日志级别为Debug、Info、Warn、Error

日志优先级别从低到高顺序为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

Log4j日志框架

最先出现的日志框架,是 Apache 的一个开源项目。使用Log4j可以通过配置文件来灵活进行配置,控制日志信息的输出格式和目标,而不需要修改程序代码。

使用日志级别

日志级别日志描述
OFF关闭:最高级别,不输出日志
FATAL致命:输出非常严重的可能会导致应用程序终止的错误。
ERROR错误:严重错误,主要是程序出错。
WARN警告:输出可能潜在的危险状况。
INFO信息:输出应用运行过程的详细信息。
DEBUG调试:输出更细致的对调试应用有用的信息。
TRACE跟踪:输出更细致的程序运行轨迹。
ALL所有:输出所有级别信息。

日志优先级别从高到低顺序为: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL

apache建议使用4级,即 ERRORWARNINFODEBUG

使用步骤

(1)引入相关依赖

 <dependency>
     <groupId>log4j</groupId>
     <artifactId>log4j</artifactId>
     <version>1.2.12</version>
 </dependency>

(2)配置log4j核心配置文件log4j.properties

先认识一下Log4j三大组件Logger、Appender、Layout。

  • Logger: 日志记录器,日志记录的核心类,用于输出不同日志级别的消息。

  • Appender: 日志输出目标,用于指定日志输出的目的地,如控制台、文件等等。

  • Layout: 日志格式化器,用于指定日志按照什么格式输出,是日志输出的格式化器。

配置样例:

# Global logging configuration
 ​
 ######################### Logger ############################
 # 设置日志输出级别以及输出目的地,等号后第一个参数写日志级别,级别后面写输出目的地,目的地名可自定义,多个目的地以逗号分开。
 # 设置根Logger,默认输出DEBUG以上的记录,输出目标(appender)为CONSOLE、LOGFILE
 log4j.rootLogger=DEBUG,CONSOLE,LOGFILE
 ​
 ######################### Appender #########################
 # 对目标CONSOLE进行配置(与Logger对应)
 # 设置日志目标类型为org.apache.log4j.ConsoleAppender控制台类型
 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
 # 输出到的目的地
 log4j.appender.CONSOLE.Target = System.out
 # 指定控制台输出日志级别
 log4j.appender.CONSOLE.Threshold = DEBUG
 # 默认值是 true, 表示是否立即输出
 log4j.appender.CONSOLE.ImmediateFlush = true
 # 设置编码方式
 log4j.appender.CONSOLE.Encoding = UTF-8
 # 设置日志输出布局方式Layout
 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
 # 如果日志输出布局为PatternLayout 自定义级别,需要使用ConversionPattern指定输出格式
 log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p (%c:%L) - %m%n
 ​
 # 对目标LOGFILE进行设置(与Logger对应)
 # 设置日志目标类型为org.apache.log4j.FileAppender文件类型
 log4j.appender.LOGFILE=org.apache.log4j.FileAppender
 # 指定输出文件路径,相对路径或绝对路径
 log4j.appender.LOGFILE.File =./logs/error.log 
 #日志输出到文件,默认为true
 log4j.appender.LOGFILE.Append = true
 # 指定输出日志级别
 log4j.appender.LOGFILE.Threshold = ERROR
 # 是否立即输出,默认值是 true,
 log4j.appender.LOGFILE.ImmediateFlush = true
 # 设置编码方式
 log4j.appender.LOGFILE.Encoding = UTF-8
 # 设置日志输出布局方式Layout
 log4j.appender.LOGFILE.layout = org.apache.log4j.PatternLayout
 # 如果日志输出布局为PatternLayout 自定义级别,需要使用ConversionPattern指定输出格式
 log4j.appender.LOGFILE.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

rootLogger部分

总是存在一个rootLogger,即使没有显示配置也是存在的,并且默认输出级别为DEBUG,所有其他的Logger都默认继承自rootLogger

子Logger格式:log4j.logger.childName=INFO,appenderName1,appenderName2...

注意,在设置子Logger后,会造成appender叠加,即子Logger输出一次,父Logger也会输出一次,如果要限制叠加,则需要添加下面的语句:

 log4j.additivity.childName=false

Appender部分

日志信息输出目的地类型

类型描述
org.apache.log4j.ConsoleAppender控制台
org.apache.log4j.FileAppender文件
org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件
org.apache.log4j.RollingFileAppender文件大小到达指定尺寸的时候产生一个新的文件
org.apache.log4j.WriterAppender将日志信息以流格式发送到任意指定的地方

ConsoleAppender控制台常配置属性

  • Threshold: 指定日志消息的输出最低日记级别。

  • ImmediateFlush: 默认值是true,意谓着所有的消息都会被立即输出。

  • Target:指定输出控制台,默认情况下是System.out

FileAppender 文件的常配置属性

  • Threshold:指定日志消息的输出最低日记级别。

  • ImmediateFlush:默认值是true,意谓着所有的消息都会被立即输出。

  • File:指定消息输出的文件路径。

  • Append:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

RollingFileAppender的常配置属性

  • Threshold:指定日志消息的输出最低日记级别。

  • ImmediateFlush:默认值是true,意谓着所有的消息都会被立即输出。

  • File:指定消息输出到mylog.txt文件。

  • Append:默认值是true,即

这篇关于Java日志大整合(千万别看)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/734112

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows