Java日志详解

文章目录

    • 概述
    • 日志级别
    • 日志框架
      • LogBack
      • Log4j
      • Slf4j
    • 查看日志
    • Log4j2 和 Logback 都支持异步日志
    • 常见的日志管理系统
    • 日志收集分析

概述

日志的定义:程序执行过程中,记录程序运行的情况的信息
日志的作用:Log日志,主要用于记录程序运行的情况,以便于程序在部署之后的排错调试等,也有利于将这些信息进行持久化(如果不将日志信息保存到文件或数据库,则信息便会丢失)。

日志级别

1、日志级别
针对不同的场景,日志被分为五种不的级别,按照重要程度依次排序
DEBUG 级别曰志记录对调试程序有帮助的信息。
INFO 级别日志 用来记录程序运行现场,虽然此处并未发生错误,但是对排查其他错误具有指导意义。
WARN 级别日志也可以用来记录程序运行现场,但是更偏向于表明此处有出现潜在错误的可能。
ERROR 级别日志表明当前程序运行发生了错误,需要被关注。但是当前发生的错误,没有影响系统的继续运行。
FATAL 级别曰志表明当前程序运行出现了严重的错误事件,并且将会导致应 用程序中断。
log 的 debug()、 error()、 info()方法
log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
log.error() 一般是需要if()的;
log.info()一般是在try catch 里面
log.debug() 做记录一般标志着方法的开始和结束。
简单的说,就是配合log的等级过滤输出
比如,你在开发的时候,要验证一个方法有没有被调用到,为了方便调试,通常会在这个方法开始的时候加一些system.out。但是项目真正发布的时候这些代码通常是要移除掉的,所以通常更建议用logger来记录
所以你可能会加logger.debug。 为什么是debug而不是info error或者其他呢?因为通常项目发布的时候都会把日志等级设置为error 或者info之类的等级,在这两个等级下debug的内容是输出不了的,所以就可以做到不需要修改代码就不会输出你只有在调试的时候才需要输出的内容
各个等级都是有它的含义的,虽然在代码写的时候你用debug info error都是可以,但是为了方便管理,只有调试的时候才用到日志会用debug,一些信息类的日志记录通常会用info(比如你想看一天有几个用户登录),一些错误的,或者异常信息会用error,比如某个时刻数据库连接出了问题,如果分析日志,直接搜索error开头的就能直接定位到了
logger.debug,logger.info,logger.warn,logger.error,logger.fatal的区别
logger.debug,logger.info,logger.warn,logger.error,logger.fatal的作用都是把错误信息写到文本日志里
不同的是它们表示的日志级别不同:
日志级别由高到底是:fatal,error,warn,info,debug,低级别的会输出高级别的信息,高级别的不会输出低级别的
信息,如等级设为Error的话,warn,info,debug的信息不会输出
修改日志输出的级别要在log4j文件中进行配置
项目正式发布后,一般会把日志级别设置为fatal或者error
log4j是一个开源的日志,共分为六个等级:LOG、DEBUG、INFO、WARN、ERROR、和FATAL。
DEBUG是其中的一种日志级别。一般我们用这个方法的时候都是这样的:
if(log.isDebugEnabled()){
log.debug(“debug!”);
}
意思是:如果log4j的配置中开启debug级别日志,那么我们就打印输出debug日志,其在输出日志中会被标记为[DEBUG].
这样做的好处是:在我们开发阶段有时候需要查看特定数据,我们可以把日志级别定为DEBUG级,调试信息会输出在日志里便于调试和跟踪修改bug。当产品发布上线之后,可以在log4j配置中去掉DEBUG级别,这时调试信息就不会输出在日志里,日志会只显示运行的相关信息。如此一来,控制输出什么日志不需要修改代码,只需修改配置文件的参数而已。
推荐使用log日志输出调试信息而不要使用System.out.println()方法,主要是因为println()使用了同步锁,会影响程序的并发性能和系统的吞吐量。

日志框架

Logback:Logback是由log4j创始人设计的一种灵活、高效且可靠的日志组件。它是log4j的改进版,提供了更高的性能和可靠性,并兼容log4j的配置文件。
Log4j2:Log4j 2是Apache软件基金会开发的一种强大的日志组件。它是log4j的升级版,修复了一些在log4j中存在的性能和线程安全性问题,并引入了新的功能,如异步日志记录、自定义日志布局等。
java.util.logging:java.util.logging是JDK自带的日志组件,也是Java平台的官方标准日志框架。它提供了基本的日志记录功能,并与Java平台的其它API紧密集成。
SLF4J:Simple Logging Facade for Java (SLF4J)是一个日志门面(logging facade)API,它提供了常见日志组件的抽象接口,如Logback、Log4j等。使用SLF4J可以在应用程序中以统一的方式使用不同的日志组件。
这些日志组件具有不同的特点和用途,根据实际需求可以选择合适的日志组件进行使用。其中,Logback和Log4j2是目前广泛应用的主流日志组件,而SLF4J则是常用的日志门面框架。
Log4j:Log4j是Apache软件基金会开发的一个功能强大的日志组件。它提供了丰富的配置选项和强大的日志功能,支持多种输出格式和输出目标。
JUL(java.util.logging):JUL是Java平台自带的日志组件,提供了基本的日志记录功能。尽管功能相对较简单,但由于是Java平台的官方标准组件,可以无需引入额外依赖就可以使用。
Logback Classic:Logback Classic是Logback项目的一部分,是log4j和Logback之间的过渡产品。它在继承log4j特性的基础上进行了改进,并与SLF4J紧密结合。
Log4j-to-SLF4J:Log4j-to-SLF4J是一个桥接器,用于将现有使用Log4j的项目迁移到SLF4J和Logback上。它允许您在不更改现有代码的情况下,使用SLF4J API并将所有日志记录委托给Logback实现。
这些日志组件都有自己的特点和适用场景,选择适合项目需求的日志组件很重要。需要注意的是,在使用日志组件时,应根据项目的需求、性能要求和配置灵活性等方面进行评估和选择。
不同的Java日志框架对应的jar包会有所不同,下面是常用日志框架
Logback:org.slf4j.Logger、ch.qos.logback.classic.Logger和ch.qos.logback.core.spi.LifeCycle。
Log4j 2:org.apache.logging.log4j.LogManager、org.apache.logging.log4j.Logger和org.apache.logging.log4j.core.config.Configurator。
java.util.logging:java.util.logging.Logger、java.util.logging.Handler和java.util.logging.Formatter。
SLF4J:org.slf4j.Logger、org.slf4j.LoggerFactory和org.slf4j.Marker。
Log4j:org.apache.log4j.Logger和org.apache.log4j.Level。
Logback Classic:ch.qos.logback.classic.Logger、ch.qos.logback.classic.Level和ch.qos.logback.classic.spi.ILoggingEvent。
Log4j-to-SLF4J:org.slf4j.bridge.SLF4JBridgeHandler。

LogBack

简单地说,Logback 是一个 Java 领域的日志框架。它被认为是 Log4J 的继承人。
Logback 主要由三个模块组成:logback-core,logback-classic。logback-access
logback-core 是其它模块的基础设施,其它模块基于它构建,显然,logback-core 提供了一些关键的
通用机制。
logback-classic 的地位和作用等同于 Log4J,它也被认为是 Log4J 的一个改进版,并且它实现了简单
日志门面 SLF4J;
logback-access 主要作为一个与 Servlet 容器交互的模块,比如说 tomcat 或者 jetty,提供一些与
HTTP 访问相关的功能。
Logback 优点
同样的代码路径,Logback 执行更快更充分的测试
原生实现了 SLF4J API(Log4J 还需要有一个中间转换层)
内容更丰富的文档
支持 XML 或者 Groovy 方式配置
配置文件自动热加载
从 IO 错误中优雅恢复
自动删除日志归档
自动压缩日志成为归档文件
支持 Prudent 模式,使多个 JVM 进程能记录同一个日志文件
支持配置文件中加入条件判断来适应不同的环境
更强大的过滤器
支持 SiftingAppender(可筛选 Appender)
异常栈信息带有包信息

Log4j

Log4j 是 Apache 的一个开源项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台、
文件、GUI 组件,甚至是套接口服务器、NT 的事件记录器、UNIX Syslog 守护进程等;我们也可以控
制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j 由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。
1.Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制
2.Appenders : 指定了日志将打印到控制台还是文件中
3.Layout : 控制日志信息的显示格式
Log4j 中将要输出的 Log 信息定义了 5 种级别,依次为 DEBUG、INFO、WARN、ERROR 和 FATAL,
当输出时,只有级别高过配置中规定的 级别的信息才能真正的输出,这样就很方便的来配置不同情况
下要输出的内容,而不需要更改代码。
log4j2

Slf4j

slf4j 的全称是 Simple Loging Facade For Java,即它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则而已。所以单独的 slf4j 是不能工作的,必须搭配其他具体的日志实现方案,比如 apache 的 org.apache.log4j.Logger,jdk 自带的 java.util.logging.Logger 等
SLF4J 和log4j lojback的区别
SLF4J(Simple Logging Facade for Java)是一个日志框架的抽象层,它提供了一组 Java 接口,用于在不同的日志系统之间切换。SLF4J 并不提供实际的日志功能,而是允许应用程序在运行时绑定到具体的日志系统,例如 Logback、Log4j、Java Util Logging 等。使用 SLF4J,你可以在应用程序中使用统一的日志 API,而无需关心底层的日志实现。
Log4j 和 Logback 都是流行的日志系统,它们都实现了 SLF4J 的接口,因此可以被用作 SLF4J 的实际日志系统。Log4j 是一个历史悠久的日志框架,在 Java 应用程序中广泛使用。Logback 是由 Log4j 的作者开发的新一代日志框架,它提供了比 Log4j 更好的性能和可靠性,并且与 SLF4J 集成得更好。
两者的主要区别如下:
性能和可靠性:
Logback 在性能和可靠性方面优于 Log4j,因为它使用了更先进的日志技术,例如异步日志和自动重启。此外,Logback 的配置也更灵活,支持通过 Groovy 脚本进行配置。
功能:
在日志功能方面,Logback 的功能比 Log4j 更强大,例如支持 SiftingAppender 和 TurboFilter,可帮助你更好地掌控日志输出。此外,Logback 也提供了更多的插件和扩展,例如可以与 Spring 框架集成。
易用性:
Log4j 的配置比较复杂,需要使用 XML 文件进行配置,而 Logback 的配置则更加简单和直观,可以使用 YAML 或 Groovy 进行配置。
总的来说,Logback 是一个更现代化和功能更强大的日志框架,因此在选择日志系统时通常是首选。但如果你已经在使用 Log4j,并且没有问题,也可以继续使用它。在任何情况下,使用 SLF4J 可以让你的代码更具可移植性和灵活性。

查看日志

grep:查找文件中包含指定文本的命令
grep ‘123456789’ 20211018.log —输出2021101801.log这个日志下包含123456789的记录
grep ‘123456789’ 20211018.log > temp.txt 搜索日志输出到指定文件
cat -n app.log |grep “error” > temp.txt

less查看大日志文件
对于很大的log文件用more不能直接跳到文件末尾向前查看。
这时可以用less来查看文件时,在command模式下按G跳到文件末尾,再使用pageup或pagedown来翻页
less filename_xxx
shift+g
:G 跳到底部,就可以用 上下方向键 或 pageup或pagedown来翻页查看log了
less
less log.log
shift + G 命令到文件尾部 然后输入 ?/加上你要搜索的关键字例如 ?1213
shift+n 关键字之间进行切换
history
history | grep XXX // 历史记录中包含某些指令的记录
tail查看实时日志
tail -f catalina.out
tail -f catalina.out -n 500 倒数500行
tail -100f test.log 实时监控100行日志
tail -n 10 test.log 查询日志尾部最后10行的日志;
tail -n +10 test.log 查询10行之后的所有日志;
配合着grep用, 例如 : tail -fn 100 catalina.out | grep – ‘关键字’
head
head -n 1000 catalina.out //查询日志文件中的头10行日志;
head -n -1000 catalina.out //查询日志文件除了最后10行的其他所有日志;
linux日志文件说明
/var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
/var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件
grep基本介绍
全拼:Global search REgular expression and Print out the line.
从grep的全称中可以了解到,grep是一个可以利用”正则表达式”进行”全局搜索”的工具,grep会在文本文件中按照指定的正则进行全局搜索,并将搜索出的行打印出来。
当然,不使用正则表达式时也可以使用grep,但是当grep与正则表达式结合在一起时,威力更强大。
使用grep命令在文本中查找指定的字符串,就像你在windows中打开txt文件,使用快捷键 “Ctrl+F” 在文本中查找某个字符串一样,说白了,可以把grep理解成字符查找工具。
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行.
模式:由正则表达式的元字符及文本字符所编写出的过滤条件﹔
grep的语法格式:
grep -option(参数) ‘word’(关键词) file(文本文件);

语法:grep 参数 查找条件 文件名(注:是文件名,目录名下查找不行)
主要参数:
-i:不区分大小写(只适用于字母字符。)
-l:查询多文件时只输出包含匹配字符的 文件名。
-n:显示匹配行内容及行号。

比如我的/opt目录下有文件test1.txt
grep -i “teacher” test1.txt : 查询包含teacher
grep -l “teacher” test1.txt test2.txt : 在文件test1/test2中查找是否有“teacher”
grep teacher *.txt : 显示当前目录下包含“teacher”且以.txt 结尾的文件(grep命令支持正则表达式,如grep ‘[a-z]{7}’ *.txt)
ps -ef|grep java:查找指定进程(这里指定java进程)
ls -l|grep -i test:把ls -l的输出中包含字母test(不区分大小写)的内容输出 (如果查询的是目录可以使用正则表达式,但是文件不行)

Log4j2 和 Logback 都支持异步日志

Log4j2 和 Logback 都支持异步日志,通过使用异步日志可以提高日志记录的性能,减少对主线程的影响。以下是使用 Log4j2 和 Logback 实现异步日志的简要说明:
Log4j2 异步日志配置
添加依赖: 确保项目中引入 Log4j2 的相关依赖。
配置 log4j2.xml: 在 Log4j2 的配置文件中开启异步日志,示例如下:


  
    
      
    
  
  
    
      
    
  

在上面的配置中,使用了 标签将日志输出异步化,这样日志信息将会在独立的线程中进行处理。
Logback 异步日志配置
添加依赖: 确保项目中引入 Logback 的相关依赖。
配置 logback.xml: 在 Logback 的配置文件中开启异步日志,示例如下:


  
    
  

  
    
  

在上述示例中,使用了 ch.qos.logback.classic.AsyncAppender 类来实现异步日志记录,将日志的输出和处理放到了独立的线程中。
需要注意的是,异步日志的具体配置会根据项目和需求而有所不同,上述示例仅供参考。在实际项目中,你可能还需要根据自己的需求来调整线程池大小、日志队列容量等参数。

常见的日志管理系统

ELK Stack (Elasticsearch, Logstash, Kibana): ELK Stack 是一个开源的日志管理解决方案,包括 Elasticsearch 用于存储和索引日志数据、Logstash 用于日志收集和处理、Kibana 用于日志可视化和分析。
Splunk: Splunk 是一款商业化的日志管理和分析软件,提供了强大的搜索、监控和报告功能,适用于大型企业和复杂的日志管理需求。
Graylog: Graylog 是一个开源的日志管理系统,提供了实时日志分析、搜索和仪表板等功能,支持灵活的日志处理和警报机制。
Fluentd: Fluentd 是一个开源的日志收集工具,可以将不同数据源的日志集中到统一的地方进行存储和分析,支持丰富的插件和扩展功能。
Prometheus: Prometheus 是一个开源的监控和告警系统,也可以用于日志收集和分析,在结合 Grafana 等工具可以实现强大的日志管理功能。
Loggly: Loggly 是一款基于云的日志管理服务,提供了实时日志搜索、分析和可视化的功能,适用于快速部署和使用的场景。
以上列举的是一些比较常见的日志管理系统,每个系统都有其特点和适用场景,选择合适的日志管理系统需要根据实际需求和情况进行评估和比较。

日志收集分析

在记录日志或实现追踪功能时,开发人员可以采用多种不同的方式,每种方式都有其特点和适用场景:

  1. 手动添加代码:
    在关键的业务方法或代码块中,开发人员可以显式地插入记录日志或追踪信息的代码。
    这种方式操作简单直接,可以精确控制追踪的粒度和内容,但需要开发人员自己添加代码,比较繁琐。
  2. AOP(面向切面编程):
    使用 AOP 技术,在方法调用的开始和结束时插入代码,记录相应的追踪信息。
    这种方式可以降低代码侵入性,提高代码的可维护性,使得追踪逻辑与业务逻辑分离。
  3. 第三方库:
    许多第三方的分布式跟踪工具(如 Zipkin、Jaeger 等)提供了 Java 客户端库,能够自动收集、存储和展示链路追踪数据。
    开发人员只需引入相应的库并进行简单配置,即可实现链路追踪功能,无需手动添加大量代码。
  4. 集成框架:
    一些流行的框架(如 Spring Cloud、Micronaut 等)提供了集成分布式追踪功能的支持。
    通过这些框架提供的配置和注解,开发人员可以轻松地实现链路追踪,并集成到微服务架构中。
    不论选择哪种方式,基本原则是在关键的业务逻辑中记录必要的信息(如调用时间、调用者、被调用者、调用参数等),将这些信息汇总存储在日志文件、数据库或专门的追踪系统中,以便后续分析和监控。不同的方式适用于不同的情境和需求,开发人员可以根据实际情况选择合适的方式来实现日志记录和追踪功能。

日志采集是指从各种系统和应用程序中收集、汇总和存储日志信息的过程。以下是常见的日志采集方式:

  1. 日志文件监控:
    ● 实时监控文件:通过监控日志文件的变化,实时读取新增的日志内容。
    ● 定时扫描文件:定期扫描指定目录下的日志文件,将新增内容进行采集。
  2. 系统日志:
    ● 操作系统日志:收集操作系统生成的日志,如 Windows Event Log、Syslog 等。
    ● 应用服务器日志:收集应用服务器(如 Apache、Nginx)产生的日志信息。
  3. 远程日志采集:
    ● 远程 Syslog:通过 Syslog 协议从远程机器收集日志信息。
    ● 远程 API:通过调用远程 API 接口获取日志数据。
  4. 日志发送器:
    ● Logstash:一个开源的数据收集引擎,可以从多种来源采集日志数据。
    ● Fluentd:另一个流行的开源日志收集工具,支持多种日志源和输出。
    ● Filebeat:轻量级的日志转发工具,专门用于将日志文件发送到 Elasticsearch 或 Logstash。
  5. 应用日志集成:
    ● 日志框架:在应用程序内部集成日志框架,将日志输出到指定目标(如文件、数据库、消息队列)。
    ● 日志代理:使用专门的日志代理软件,收集应用程序输出的日志并统一管理。
  6. 消息队列:
    ● Kafka:利用 Kafka 等消息队列中间件进行日志数据的缓冲和传输。
    ● RabbitMQ:另一个常用的消息队列工具,也可用于日志采集和传输。
  7. 容器日志采集:
    ● Docker 日志:通过 Docker 容器日志驱动将容器内的日志收集到宿主机或远程存储中。
    ● Kubernetes Fluentd 插件:在 Kubernetes 集群中使用 Fluentd 进行日志收集和处理。
  8. 自定义日志采集器:
    ● 可以根据特定需求开发自定义的日志采集器,例如基于特定协议或定制化的数据格式。
    以上是常见的日志采集方式,具体选择何种方式取决于系统架构、需求和预算等因素。有效的日志采集可以帮助监控系统运行状态、排查问题并进行分析,是系统运维和故障排除中的重要环节。

在Java中进行日志收集和分析有多种方式,下面是一些常用的方式:

  1. 日志框架:Java中有许多优秀的日志框架可供选择,其中最流行的包括Log4j、Logback和java.util.logging等。这些框架提供了灵活的配置选项和丰富的功能,使得日志记录变得简单和高效。
  2. 日志级别控制:日志框架通常支持不同的日志级别,如DEBUG、INFO、WARN、ERROR等。通过适当设置日志级别,可以控制日志输出的详细程度,以满足应用程序的需求。
  3. 日志输出:日志可以输出到不同的目标,包括控制台、文件、数据库、远程服务器等。Java日志框架通常提供了各种Appenders或Handlers,用于指定日志的输出目标。
  4. 日志格式化:日志框架允许开发人员定义日志的格式,包括时间戳、日志级别、类名、方法名、线程ID等信息。通过合适的格式化,可以使日志信息易于阅读和理解。
  5. 异步日志:某些日志框架支持异步日志记录,这意味着日志消息可以在后台线程中处理,从而减少对主线程的影响,提高应用程序的性能。
  6. 日志分析工具:除了记录日志外,还可以使用日志分析工具来对日志进行实时监控、搜索和分析。一些流行的日志分析工具包括ELK Stack(Elasticsearch、Logstash、Kibana)、Splunk、Graylog等。
  7. AOP(面向切面编程):使用AOP技术可以将日志记录逻辑从业务代码中分离出来,从而降低代码的耦合度。Spring框架提供了方便的AOP支持,可以轻松地实现日志记录功能。
  8. 错误日志记录:除了常规的日志记录外,还可以捕获和记录应用程序的错误信息。Java提供了Throwable类及其子类来表示异常和错误,可以通过try-catch块捕获异常,并将异常信息记录到日志中。

综上所述,Java中进行日志收集和分析的方式丰富多样,开发人员可以根据具体需求选择合适的工具和技术来实现日志记录和分析功能。

你可能感兴趣的:(#,日志,java)