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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 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]

查询与分析

通过上述方式配置好 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  

记录用户购买行为的日志

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 
开启查询分析

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

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

3

分析实例

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

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

语法示例

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

语法示例

| select level ,count(*) as count GROUP BY level ORDER BY count DESC
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
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

特别感谢

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日志并进行多维度分析。
相关文章
|
17天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
73 1
|
18天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
72 1
|
22天前
|
SQL 关系型数据库 MySQL
MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复
对于MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复。二进制日志是MySQL中记录所有数据库更改操作的日志文件。要进行时间点恢复,您需要执行以下步骤: 1. 确保MySQL配置文件中启用了二进制日志功能。在配置文件(通常是my.cnf或my.ini)中找到以下行,并确保没有被注释掉: Copy code log_bin = /path/to/binary/log/file 2. 在需要进行恢复的时间点之前创建一个数据库备份。这将作为恢复的基准。 3. 找到您要恢复到的时间点的二进制日志文件和位置。可以通过执行以下命令来查看当前的二进制日志文件和位
|
28天前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
48 0
|
29天前
|
存储 数据库
ALTER MATERIALIZED VIEW LOG :语句来更改现有物化视图日志的存储特征或类型。
`ALTER MATERIALIZED VIEW LOG` 语句用于修改已有的物化视图日志的存储属性或类型。配合示例中的动画图像(由于格式限制无法显示),该语句帮助优化数据库的性能和管理。
44 0
|
1天前
|
JavaScript Java 测试技术
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
11 3
|
11天前
|
Java 应用服务中间件 Linux
Caused by: java.lang.UnsatisfiedLinkError: /root/jdk1.7.0_45/jre/lib/amd64/xawt/libmawt.so: libXrend
Caused by: java.lang.UnsatisfiedLinkError: /root/jdk1.7.0_45/jre/lib/amd64/xawt/libmawt.so: libXrend
|
24天前
|
XML 运维 监控
【深入探究 C++ 日志库清理策略】glog、log4cplus 和 spdlog 的日志文件管理策略
【深入探究 C++ 日志库清理策略】glog、log4cplus 和 spdlog 的日志文件管理策略
62 0
|
30天前
|
安全 编译器 API
C++系统日志库精选:深入剖析glog与log4cplus,轻松搭建高效日志系统
C++系统日志库精选:深入剖析glog与log4cplus,轻松搭建高效日志系统
90 0
|
1月前
|
存储
Hudi Log日志文件格式分析(一)
Hudi Log日志文件格式分析(一)
25 1

相关产品

  • 日志服务