Java日志上云三剑客:Log4J/LogBack/Producer Lib

本文涉及的产品
对象存储 OSS,20GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
对象存储 OSS,恶意文件检测 1000次 1年
简介: 日志服务提供30多种数据采集方式,针对服务器、移动端、嵌入式设备及各种开发语言都提供完整的接入方案。对 Java 开发者而言,没有什么比熟悉的日志框架 Log4j、Log4j2、Logback Appender 更好使的了。

日志中心化之路

近几年来,无状态编程、容器、Serverless 编程方式的诞生极大提升了软件交付与部署的效率。在架构的演化过程中,可以看到两个变化:

_1

  • 应用架构开始从单体系统逐步转变微服务,其中的业务逻辑随之而来就会变成微服务之间调用与请求。
  • 资源角度来看,传统服务器这个物理单位也逐渐淡化,变成了看不见摸不到的虚拟资源模式。

从以上两个变化可以看到这种弹性、标准化架构背后,原先运维与诊断的需求也变得越来越复杂。在10年前我们可以快速登陆到服务器上捞取日志,Attach进程的模式已再也不存在,面对我们的更多是一个标准化的“黑盒”。

_2

​ 为了应对这种变化趋势,诞生一系列面向DevOps诊断与分析的工具。例如集中式监控、集中式日志系统、以及SaaS化的各种部署、监控等服务。

​ 日志中心化解决的是以上这个问题,既应用产生日志后实时(或准实时)传输到中心化的节点服务器,例如Syslog,Kafka,ELK,Hbase进行集中式存储是一些常见的模式。

中心化四个好处

  • 使用方便:在无状态应用中最麻烦的要属Grep日志了,集中式存储只要运行一个Search命令就能够替代原先漫长的过程
  • 存储与计算分离:定制机器硬件时无需为日志存储考虑空间大小
  • 更低成本:集中式日志存储可以削峰填谷,预留更高水位
  • 安全:当发生黑客入侵以及灾难时,关键数据留作取证

_

采集端 (Java系列)

日志服务提供30+数据采集方式,针对服务器、移动端、嵌入式设备及各种开发语言都提供完整的接入方案。对Java 开发者而言,没有什么比熟悉的日志框架 Log4j、Log4j2、Logback Appender更好使的了。

对Java应用而言,目前有两种主流的日志采集方案:

  • Java程序将日志落盘,通过Logtail进行实时采集
  • Java程序直接配置日志服务提供的Appender,当程序运行时,实时将日志发完服务端

两者的差别如下:

日志落盘+Logtai采集 Appender 直接发送
实时性 日志落文件,通过Logtail采集 直接发送
吞吐量
断点续传 支持,取决于Logtail 配置大小 支持,取决于内存大小
关心应用位置 需要,配置采集机器组时 不需要,主动发送
本地日志 支持 支持
关闭采集 Logtail移除配置 修改Appender配置,重启应用

通过Appender可以在不改任何代码情况下,通过Config就能够非常容易完成日志实时采集工作,日志服务提供的Java系列Appender有如下几大优势:

  • 无需修改程序,修改配置即生效
  • 异步化 + 断点续传:IO不影响主线程,支持一定网络和服务容错
  • 高并发设计:满足海量日志写入需求
  • 支持上下文查询功能:写入支持支持在服务端还原原始进程中精确上下文(前后N条日志)

Appender 介绍与使用

目前提供Appender如下,底层均使用 aliyun-log-producer 完成数据的写入。

这四者的差别如下:

      aliyun-log-log4j-appender aliyun-log-log4j2-appender aliyun-log-logback-appender aliyun-log-producer
说明 针对 log4j 1.x 开发的 appender,如果您的应用程序正在使用 log4j 1.x 日志框架,建议您选择该 appender。 针对 log4j 2.x 开发的 appender,如果您的应用程序正在使用 log4j 2.x 日志框架,建议您选择该 appender。 针对 logback 开发的 appender,如果您的应用程序正在使用 logback 日志框架,建议您选择该 appender。 为运行在大数据、高并发场景下的 Java 应用量身打造的高性能写 LogHub 类库,目前提供的 appender 底层均使用它完成数据写入。
它具有很高的灵活性,可以让您指定写入 Loghub 中数据的字段和格式,如果您发现我们提供的 appender 无法满足您的业务需求,您可以基于它开发适合您的日志采集程序。

接入 Appender

可参考 aliyun-log-log4j-appender配置步骤部分接入 appender。

配置文件log4j.properties的内容如下:

log4j.rootLogger=WARN,loghub

log4j.appender.loghub=com.aliyun.openservices.log.log4j.LoghubAppender

#日志服务的project名,必选参数
log4j.appender.loghub.projectName=[your project]
#日志服务的logstore名,必选参数
log4j.appender.loghub.logstore=[your logstore]
#日志服务的http地址,必选参数
log4j.appender.loghub.endpoint=[your project endpoint]
#用户身份标识,必选参数
log4j.appender.loghub.accessKeyId=[your accesskey id]
log4j.appender.loghub.accessKey=[your accesskey]
AI 代码解读

查询与分析

通过上述方式配置好 appender 后,Java 应用产生的日志会被自动发往日志服务。可以通过 LogSearch/Analytics 对这些日志实时查询和分析。本文提供的样例的日志格式如下:

记录用户登录行为的日志

level:  INFO  
location:  com.aliyun.log4jappendertest.Log4jAppenderBizDemo.login(Log4jAppenderBizDemo.java:38)
message:  User login successfully. requestID=id4 userID=user8  
thread:  main  
time:  2018-01-26T15:31+0000  
AI 代码解读

记录用户购买行为的日志

level:  INFO  
location:  com.aliyun.log4jappendertest.Log4jAppenderBizDemo.order(Log4jAppenderBizDemo.java:46)
message:  Place an order successfully. requestID=id44 userID=user8 itemID=item3 amount=9  
thread:  main  
time:  2018-01-26T15:31+0000 
AI 代码解读
开启查询分析

若要对数据进行查询和分析,需要首先开启查询分析功能。开启步骤如下:

  • 登录 日志服务管理控制台
  • 选择目标项目,单击项目名称或者单击右侧的 管理
  • 选择目标日志库并单击日志索引列下的 查询
  • 单击右上角的 设置查询分析 > 设置
  • 进入设置菜单,为下列字段开启查询。

3

分析实例

以下视频包含了下述5个分析实例。

1. 统计过去1小时发生Error最多的3个位置

语法示例

level: ERROR | select location ,count(*) as count GROUP BY  location  ORDER BY count DESC LIMIT 3
AI 代码解读
2. 统计过去15分钟各种日志级别产生的日志条数

语法示例

| select level ,count(*) as count GROUP BY level ORDER BY count DESC
AI 代码解读
3. 日志上下文查询

对于任意一条日志,能够精确还原原始日志文件上下文日志信息。

参阅: 上下文查询

4. 统计过去1小时,登录次数最多的三个用户

语法示例

login | SELECT regexp_extract(message, 'userID=(?<userID>[a-zA-Z\d]+)', 1) AS userID, count(*) as count GROUP BY userID ORDER BY count DESC LIMIT 3
AI 代码解读
5. 统计过去15分钟,每个用户的付款总额

语法示例

order | SELECT regexp_extract(message, 'userID=(?<userID>[a-zA-Z\d]+)', 1) AS userID, sum(cast(regexp_extract(message, 'amount=(?<amount>[a-zA-Z\d]+)', 1) AS double)) AS amount GROUP BY userID
AI 代码解读

特别感谢

aliyun-log-log4j-appender,aliyun-log-log4j2-appender,aliyun-log-logback-appender,aliyun-log-producer-java 是由阿里云团队和共创平台上的贡献者共同完成的。感谢你们对项目作出的杰出贡献。

aliyun-log-log4j-appender 贡献者:@zzboy

aliyun-log-log4j2-appender 贡献者:@LNAmp @zzboy

aliyun-log-logback-appender 贡献者:@lionbule @zzboy

aliyun-log-producer-java 贡献者:@zzboy

技术支持

大家在使用过程中遇到的任何问题,可以加钉钉群11775223联系我们:

扫我进群

扫我进群

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1928 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
188 5
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
Java中Log级别和解析
日志级别定义了日志信息的重要程度,从低到高依次为:TRACE(详细调试)、DEBUG(开发调试)、INFO(一般信息)、WARN(潜在问题)、ERROR(错误信息)和FATAL(严重错误)。开发人员可根据需要设置不同的日志级别,以控制日志输出量,避免影响性能或干扰问题排查。日志框架如Log4j 2由Logger、Appender和Layout组成,通过配置文件指定日志级别、输出目标和格式。
Java打包jar运行时分离lib和jar
在`pom.xml`的`build`节点中,设置`packaging`为`jar`,并配置插件分离依赖库到`lib`目录和资源文件到`resources`目录。这样可以在运行时通过`-Dloader.path=lib,resources`加载外部依赖和资源文件,便于独立升级依赖库和修改资源文件,而无需重新打包程序。具体插件包括`maven-dependency-plugin`、`maven-resources-plugin`和`spring-boot-maven-plugin`等。
134 1
|
5月前
|
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
1630 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
112 1
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
118 2
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
126 2
|
7月前
|
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
270 1

云存储

+关注

相关产品

  • 日志服务
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等