Java中日志采集框架-JUL、Slf4j、Log4j、Logstash

1. 日志采集

        日志采集是指在软件系统、网络设备、服务器或其他IT基础设施中自动收集日志文件和事件信息的过程。这些日志通常包含了时间戳、事件类型、源和目标信息、错误代码、用户操作记录等关键数据。日志采集的目的是为了监控系统运行状态、分析系统性能、审计用户行为、故障排查和安全监控等。

日志采集通常涉及以下几个关键步骤:

  1. 日志生成:系统或应用程序在运行过程中产生日志。

  2. 日志存储:日志被保存在本地文件系统、数据库或其他存储介质中。

  3. 日志收集:使用特定的工具或服务将分散在不同位置的日志集中到一个或多个中心位置。

  4. 日志传输:将收集的日志数据通过网络传输到日志分析系统或存储系统。

  5. 日志处理:对日志数据进行格式化、过滤、聚合等处理,以便于分析和存储。

  6. 日志分析:使用日志分析工具对收集的日志数据进行分析,以识别模式、趋势、异常行为或安全威胁。

  7. 日志监控和告警:实时监控日志数据,并在检测到特定事件或异常时触发告警。

  8. 日志保留:根据合规性和审计要求,日志数据需要被保留一定时间。

2. 日志框架

一些典型的日志框架如下:

  • JUL:java.util.logging(简称JUL)是Java平台的一部分,它是一个轻量级的日志框架,提供了日志记录的基础设施。JUL是Java SE标准库的一部分,因此不需要额外的库就可以在任何Java应用程序中使用它。

  • Logback:Logback是一个流行的Java日志框架,由Log4j的创始人Ceki Gülcü和另一位Log4j贡献者Sébastien Pennec设计。

  • Log4j:Log4j是一个由Apache软件基金会维护的开源日志记录工具,它是Java语言中广泛使用的日志框架之一。

  • Log4j2:作为Log4j的继任者,在性能和功能上都有显著的提升。

  • logstash:Logstash是一个开源的服务器端数据处理管道,它能够从多个来源采集数据,转换数据,然后将数据发送到“数据库”。

  • Slf4j:SLF4J(Simple Logging Facade for Java)是一个为Java提供简单日志抽象的API。它并不是一个具体的日志框架,而是一个日志门面,允许开发者在代码中使用统一的API来记录日志,而不必直接依赖于具体的日志实现(如Log4j、Logback或Java Util Logging等)

3. 实例

3.1 JUL

JDK1.4具有的原生日志框架(不建议使用)。

package com.xiaokai;import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;/*** Author:yang* Date:2024-11-19 10:25*/
public class JULExample {private static final Logger logger = Logger.getLogger(JULExample.class.getName());public static void main(String[] args) {// 创建一个控制台处理器,并设置格式器ConsoleHandler consoleHandler = new ConsoleHandler();consoleHandler.setFormatter(new SimpleFormatter());logger.addHandler(consoleHandler);logger.setLevel(Level.INFO);// 设置日志级别为ALL,其他级别为FINEST、FINER、FINE、CONFIG、INFO、WARNING、SEVERE// 记录日志logger.log(Level.INFO, "This is an info message");logger.log(Level.SEVERE, "This is a severe message");}
}

测试结果:

十一月 19, 2024 10:30:44 上午 com.xiaokai.JULExample main
信息: This is an info message
十一月 19, 2024 10:30:44 上午 com.xiaokai.JULExample main
信息: This is an info message
十一月 19, 2024 10:30:44 上午 com.xiaokai.JULExample main
严重: This is a severe message
十一月 19, 2024 10:30:44 上午 com.xiaokai.JULExample main
严重: This is a severe message

3.2 Logback

它具有快速和通用的特性,可以在不同的环境下工作。Logback由三个模块组成:

  1. logback-core:构成logback-classic和logback-access的基础。要执行日志记录,需要logback-classic或logback-access。

  2. logback-classic:依靠logback-core提供日志记录服务,并且是log4j的改进版。它提供了更强大的日志功能,并且向下兼容log4j。它还支持SLF4J,可以在不修改代码的情况下将应用程序从一个日志框架切换到另一个日志框架。

  3. logback-access:为servlet容器(如Tomcat和Jetty)提供HTTP访问日志功能。

        Logback原生实现了Java的简单日志外观(SLF4J)API,这意味着开发人员可以针对SLF4J API编写日志代码,在部署时灵活地插入所需的日志框架。由于Logback原生实现了SLF4J,因此额外的SLF4J API层不会产生任何性能开销,这是Logback相对于其他框架的一点优势。

        Logback支持TRACE、DEBUG、INFO、WARN和ERROR五种日志级别。在本地开发时,通常将日志级别设置为DEBUG,这将提供详细的日志消息以供开发者使用。部署到生产环境时,通常将日志级别设置为ERROR,这是为了避免日志中充斥过多的调试信息。

3.2.1 添加依赖

<!-- Logback Classic Module -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency><!-- SLF4J API -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.30</version>
</dependency>

3.2.2 配置logback

创建一个名为logback.xml的配置文件,并将其放置在项目的src/main/resources目录下

<configuration><!-- Console Appender --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- File Appender --><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>application.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- Loggers --><root level="info"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /></root></configuration>

这个配置定义了两个Appender:一个输出到控制台,一个输出到文件application.log

3.2.3 示例

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Component
public class MyService {private static final Logger logger = LoggerFactory.getLogger(MyService.class);public void doSomething() {logger.info("Doing something important");}
}

注:

  • SpringBoot项目,会自动加载logback-sprinng.xml命令的配置文件。

  • 一般情况下先加载logback-test.xml文件,没有会读取logback.xml文件。

  • 在application.yml文件中配置加载文件。

# application.yml logging: config: classpath:logback.xml

3.3 Slf4j

        SLF4J(Simple Logging Facade for Java)是一个为Java提供简单日志抽象的API。它并不是一个具体的日志框架,而是一个日志门面,允许开发者在代码中使用统一的API来记录日志,而不必直接依赖于具体的日志实现(如Log4j、Logback或Java Util Logging等)。

上述3.2 为slf4j+logback实现的日志输出示例。

3.4 Log4j

        Log4j是一个由Apache软件基金会维护的开源日志记录工具,它是Java语言中广泛使用的日志框架之一。以下是Log4j的一些关键特点和介绍:

  1. 灵活性和可配置性

    1. Log4j允许开发者通过配置文件(如log4j.propertieslog4j.xml)灵活地设置日志级别、输出格式和目的地。这些配置文件定义了Loggers(日志记录器)、Appenders(日志输出目的地)和Layouts(日志格式)。

  2. 多种日志级别

    1. Log4j支持多种日志级别,包括DEBUG、INFO、WARN、ERROR和FATAL,允许开发者根据需要控制日志的详细程度。

  3. 多种Appender支持

    1. Log4j提供了多种Appender,可以将日志输出到不同的地方,如控制台(ConsoleAppender)、文件(FileAppender)、滚动文件(RollingFileAppender)和数据库(JDBCAppender)等。

  4. Layout定制

    1. 通过Layout,Log4j允许开发者定制日志的输出格式,包括时间戳、日志级别、消息等。

  5. 性能

    1. 虽然Log4j1.x在性能上不如Log4j2,但它仍然是许多Java应用的常用日志框架,特别是在不需要极端性能要求的场景下。

  6. 安全性

    1. Log4j2相比于Log4j1.x在安全性方面有显著改进,例如,Log4j2中的JNDI支持更加安全,而Log4j1.x中的某些版本存在已知的安全漏洞,如Log4Shell(CVE-2021-44228)。

  7. 易用性

    1. Log4j通过简单的API使得在代码中插入日志语句变得容易,无需编写复杂的日志记录代码。

  8. 社区支持

    1. 作为一个成熟的开源项目,Log4j拥有活跃的社区支持,提供文档、教程和问题解答。

  9. 审计和调试

    1. Log4j不仅在开发周期中发挥作用,其丰富的日志记录功能也可以作为审计工具使用。

3.4.1 Maven依赖配置

在项目的pom.xml文件中添加Log4j的依赖:

<!-- Log4j2依赖 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0</version>
</dependency>

3.4.2 Log4j配置文件

在src/main/resources目录下创建log4j.properties文件:

# 设置根Logger的级别和输出目的地
log4j.rootLogger=DEBUG, stdout, file# 配置控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n# 配置文件输出
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=logs/application.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

这个配置定义了两个Appender:一个输出到控制台,一个输出到文件application.log。

3.4.3 Java代码示例

创建一个Java类来使用Log4j记录日志:

import org.apache.log4j.Logger;public class Log4jExample {private static final Logger logger = Logger.getLogger(Log4jExample.class);public static void main(String[] args) {logger.debug("这是一个调试信息");logger.info("这是一个普通信息");logger.warn("这是一个警告信息");logger.error("这是一个错误信息");logger.fatal("这是一个致命错误信息");}
}

3.5 Logstash

        Logstash是一个开源的服务器端数据处理管道,它能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。以下是Logstash的一些主要功能和特点:

  1. 集中、转换和存储数据

    1. Logstash能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用Grok从非结构化数据中派生出结构,从IP地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。

  2. 输入、筛选和输出

    1. Logstash支持各种输入选择,可以同时从众多常用来源捕捉事件,如日志、指标、Web应用等。它还提供实时解析和转换数据的能力,以及众多输出选择,可以将数据发送到指定的地方。

  3. 可扩展插件生态系统

    1. Logstash提供超过200个插件,以及创建和贡献自己的灵活性。它采用可插拔框架,允许将不同的输入选择、筛选器和输出选择混合搭配、精心安排,让它们在管道中和谐地运行。

  4. 可靠性与安全性

    1. 如果Logstash节点发生故障,Logstash会通过持久化队列来保证至少将运行中的事件送达一次。那些未被正常处理的消息会被送往死信队列 (dead letter queue) 以便做进一步处理。此外,Logstash还能让您充分确保自己采集管道的安全性。

  5. 性能

    1. Logstash在性能上已经有很大提升,但与它的替代者们相比还是要慢很多的。它在大数据量的情况下可能会是个问题,特别是在资源消耗(默认的堆大小是1GB)方面。生产中写入Elasticsearch的速度可以达到5万/秒左右,但因为牵扯到过滤等操作,性能会有所降低。

  6. 社区支持

    1. Logstash是一个广泛采用的开源项目,拥有活跃的社区支持和大量的文档资源。

  7. 与Log4j的比较

    1. Logstash可以与Log4j配合使用,Log4j负责日志的生成和初步处理,而Logstash则负责日志的收集、解析和传输。Log4j配置文件中可以设置将日志输出到Logstash,Logstash再将这些日志数据传输到Elasticsearch中进行存储和分析。

3.5.1 基本示例

1. Logstash配置文件

        首先,我们需要创建一个Logstash配置文件,这里我们称之为logstash.conf。这个配置文件包含了输入(input)、过滤(filter)和输出(output)三个部分。

input {stdin { }
}
filter {grok {match => { "message" => "%{COMBINEDAPACHELOG}"}}
}
output {stdout { codec => rubydebug }elasticsearch {hosts => ["http://localhost:9200"] # Elasticsearch服务器地址index => "logstash-apache-logs-%{+YYYY.MM.dd}" # 索引名称,包含日期}
}

2. 运行Logstash

接下来,我们使用以下命令运行Logstash,并指定我们的配置文件:

bin/logstash -f logstash.conf

这个命令告诉Logstash使用我们提供的logstash.conf文件作为配置。

3. 输入日志数据

在运行Logstash的同时,我们可以向标准输入(stdin)输入日志数据。例如:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

4. 查看处理结果

Logstash会将输入的日志数据通过grok插件解析,然后输出到标准输出(stdout)和Elasticsearch。在标准输出中,你会看到类似以下格式的JSON数据:

{"@version": "1","host": "your-hostname","@timestamp": "2023-11-20T12:39:38.514Z","message": "127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] \"GET /apache_pb.gif HTTP/1.0\" 200 2326","apache": {"clientip": "127.0.0.1","ident": "-","auth": "frank","verb": "GET","request": "/apache_pb.gif","httpversion": "HTTP/1.0","bytes": "2326","referrer": "-","agent": "-","response": "200","cookies": [],"xforwardedfor": [],"unresolvedaddress": null,"unresolvedhostname": null}
}

同时,这些数据也会被索引到Elasticsearch中,可以通过Kibana或其他Elasticsearch客户端工具来查询和分析这些日志数据。

3.5.2 采集Java程序日志作为输入

1. 添加依赖:在你的Java项目中添加Logback和Logstash encoder的依赖。如果你的项目是Maven项目,可以在pom.xml中添加以下依赖:

<!-- Logback Classic Module -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency><!-- Logstash Logback Encoder -->
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>5.3</version>
</dependency>

2. 配置Logback:在src/main/resources目录下创建logback-spring.xml文件,并配置一个appender将日志发送到Logstash:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><!-- 配置Logstash服务地址 --><destination>127.0.0.1:4560</destination><!-- 日志输出编码 --><encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>UTC</timeZone></timestamp><pattern><pattern>{"logLevel": "%level","serviceName": "
${springAppName:-}","pid": "$
{PID:-}","thread": "%thread","class": "%logger{40}","rest": "%message"}</pattern></pattern></providers></encoder></appender><root level="DEBUG"><appender-ref ref="LOGSTASH" /></root>
</configuration>

3. 启动Logstash:配置Logstash监听TCP端口并接收日志:

input {tcp {mode => "server"host => "127.0.0.1"port => 4560codec => json_lines}
}
output {elasticsearch {hosts => "127.0.0.1:9200"index => "springboot-logstash-%{+YYYY.MM.dd}"}
}

4. 启动应用并查看日志:启动ava应用程序,日志将被发送到Logstash,并且Logstash会将这些日志存储到Elasticsearch中,在Kibana中查看和分析这些日志。

  不积跬步,无以至千里 --- xiaokai

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474909.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++系列之继承

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xf…

记录———封装uni-app+vant(u-upload)上传图片组件

上传图片回显&#xff0c;自定义图片回显样式 这段代码是一个Vue组件&#xff0c;主要实现了图片上传和预览的功能。组件接收了父组件传递的图片列表、最大图片数量和上传状态等属性。在模板中&#xff0c;使用了uni-easyinput组件和u-upload组件来实现图片上传和预览功能。在…

Java从入门到精通笔记篇(十三)

与流处理 ambda表达式 定义 lambda表达式不能被独立执行&#xff0c;因此必须实现函数式接口&#xff0c;并且会返回一个函数式接口的对象。 可将其语法用下列的方式理解 误区警示 “->”符号是由英文状态下的“-”和“>”组成的&#xff0c;符号之间没有空格。 lambd…

kvm-dmesg:从宿主机窥探虚拟机内核dmesg日志

在虚拟化环境中&#xff0c;实时获取虚拟机内核日志对于系统管理员和开发者来说至关重要。传统的 dmesg 工具可以方便地查看本地系统的内核日志&#xff0c;但在KVM&#xff08;基于内核的虚拟机&#xff09;环境下&#xff0c;获取虚拟机内部的内核日志则复杂得多。为了简化这…

apipost下载安装教程、脚本详细使用教程

目录 apipost脚本使用教程 缘由&#xff1a; 实现流程&#xff1a; 1、设置接口需要的URL&#xff1a; 2、boby: 3、预执行操作&#xff1a; 4、断言 5、执行结果&#xff1a; 什么是ApiPost&#xff1f; 下载以及安装&#xff1a; apipost使用文档介绍&#xff1a;…

25. 架构能力

文章目录 第25章 架构能力25.1 个人能力&#xff1a;架构师的职责、技能和知识职责技能知识那经验方面呢&#xff1f; 25.2 软件架构组织的能力25.3 成为更优秀的架构师接受指导指导他人 25.4 小结25.5 扩展阅读25.6 问题讨论 第25章 架构能力 人生苦短&#xff0c;学海无涯。 …

UniApp的Vue3版本中H5配置代理的最佳方法

UniApp的Vue3版本中H5项目在本地开发时需要配置跨域请求调试 最开始在 manifest.json中配置 总是报404&#xff0c;无法通过代理请求远程的接口并返回404错误。 经过验证在项目根目录创建 vite.config.js文件 vite.config.js内容: // vite.config.js import {defineConfig }…

kafka基础

文章目录 一、Kafka入门1.1、JMS1.2、生产者-消费者模式1.3、ZooKeeper 二、kafka基础架构2.1、producer2.2、kafka cluster2.2.1、broker2.2.2、Controller2.2.3、Topic2.2.4、Partition2.2.5、Replication2.2.6、Leader & Follower 2.3、consumer 一、Kafka入门 Kafka是一…

SIMCom芯讯通A7680C在线升级:FTP升级成功;http升级腾讯云对象储存的文件失败;http升级私有服务器的文件成功

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

CSS一些练习过程

1.字体样式 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

Linux系统Centos设置开机默认root用户

目录 一. 教程 二. 部分第三方工具配置也无效 一. 教程 使用 Linux 安装Centos系统的小伙伴大概都知道&#xff0c;我们进入系统后&#xff0c;通常都是自己设置的普通用户身份&#xff0c;而不是 root 超级管理员用户&#xff0c;导致我们在操作文件夹时往往爆出没有权限&am…

【机器学习】机器学习中用到的高等数学知识-7.信息论 (Information Theory)

熵 (Entropy)&#xff1a;用于评估信息的随机性&#xff0c;常用于决策树和聚类算法。交叉熵 (Cross-Entropy)&#xff1a;用于衡量两个概率分布之间的差异&#xff0c;在分类问题中常用。 信息论作为处理信息量和信息传输的数学理论&#xff0c;在机器学习中具有广泛的应用。…

【C#】C#编程入门指南:构建你的.NET开发基础

文章目录 前言&#xff1a;1. C# 开发环境 VS的基本熟悉2. 解决方案与项目的关系3. 编辑、编译、链接、运行4. 托管代码和CLR4.1 CLR&#xff1a;4.2 C# 代码第编译过程&#xff08;两次编译的&#xff09; 5. 命名空间6. 类的组成与分析7. C# 的数据类型7.1 值类型7.2 引用类型…

手摸手5-springboot开启打印sql完整语句

目录 手摸手5-springboot开启打印sql完整语句简介 p6spy简介引入依赖修改application-jdbc.yaml配置配置spy.properties文件配置项运行后效果 手摸手5-springboot开启打印sql完整语句 简介 MyBatis-Plus提供了SQL分析与打印的功能&#xff0c;通过集成p6spy组件&#xff0c;可…

深入解析TK技术下视频音频不同步的成因与解决方案

随着互联网和数字视频技术的飞速发展&#xff0c;音视频同步问题逐渐成为网络视频播放、直播、编辑等过程中不可忽视的技术难题。尤其是在采用TK&#xff08;Transmission Keying&#xff09;技术进行视频传输时&#xff0c;由于其特殊的时序同步要求&#xff0c;音视频不同步现…

力扣(leetcode)题目总结——动态规划篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…

MySQL超详细安装配置教程(亲测有效)

目录 1.下载mysql 2.环境配置 3.安装mysql ​4.navicat工具下载与连接 ​5总结 1.下载mysql mysql下载--MySQL &#xff1a;&#xff1a; 下载 MySQL 社区服务器 下载的时候这里直接逃过就行 我这里的版本是最新的mysql8.0.37 下载完成之后,将压缩包进行解压 这里我建议大…

高阶云服务-ELB+AS

ELBAS 弹性负载均衡弹性伸缩 原来1台web服务器不满足相应&#xff0c;现部署多台提供相同服务&#xff1b; 由于多个服务器多个ip该如何提供给应用呢&#xff1f; 引申出负载均衡&#xff08;HAProxy&#xff0c;LVS01四层&#xff0c;Nginx七层&#xff09; 防单点故障做主备…

python蓝桥杯刷题2

1.最短路 题解&#xff1a;这个采用暴力枚举&#xff0c;自己数一下就好了 2.门牌制作 题解&#xff1a;门牌号从1到2020&#xff0c;使用for循环遍历一遍&#xff0c;因为range函数无法调用最后一个数字&#xff0c;所以设置成1到2021即可&#xff0c;然后每一次for循环&…

阿里云轻量应用服务器可以用在哪些场景呢

在数字化转型的浪潮中&#xff0c;中小企业面临着如何快速、高效地上云的挑战。阿里云轻量应用服务器&#xff08;SWAS&#xff09;作为一款专为中小企业设计的云服务产品&#xff0c;提供了简单易用、经济实惠的解决方案&#xff0c;助力企业轻松实现云端部署&#xff0c;赋能…