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

相关文章

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

Spring中配置ContextLoaderListener方式

《Spring中配置ContextLoaderListener方式》:本文主要介绍Spring中配置ContextLoaderListener方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录Spring中配置ContextLoaderLishttp://www.chinasem.cntene

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码