JAVA实现读取最后几行日志
JAVA实现读取最后几行日志
1. 背景
在项目框架设计中,针对系统产生的日志,有线上查看日志的需求.日志文件本身很大.线上查看时,开发人员只想了解当前系统产生的错误信息.
2. POM依赖
主要使用 ReversedLinesFileReader 实现到读日志文件,需要引入commons-io依赖,底层使用 RandomAccessFile 实现.
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
3. 代码实现
先倒序读取每行数据,放入集合中.然后集合倒序,返回符合阅读习惯的文本日志.
public String readLastLines(String filePath, int lines) throws IOException {
if(StringUtils.isBlank(filePath)|| lines<=0){
return "";
}
List<String> lastLine = new ArrayList<String>();
ReversedLinesFileReader reader = null;
try {
reader = new ReversedLinesFileReader(filePath, StandardCharsets.UTF_8);
String line = "";
while ((line = reader.readLine()) != null && lastLine.size() < lines) {
lastLine.add(line);
}
Collections.reverse(lastLine);
} catch (IOException e) {
System.out.println("读取文件失败,公众号:小满小慢,小游戏:地心侠士");
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
System.out.println("关闭文件失败,,公众号:小满小慢,小游戏:地心侠士");
}
}
}
return StringUtils.join(lastLine, "\r\n");
}
4. RandomAccessFile 基本使用
使用 RandomAccessFile类,实现倒序读取内容
@Test
public void testReadLogFile() {
File logFile = new File("./logs/spring.log");
RandomAccessFile reader = null;
try {
reader = new RandomAccessFile(logFile, "r");
System.out.println(reader.readUTF());
reader.seek(logFile.length() - 1);
byte c = -1;
List<Byte> l = new ArrayList<Byte>();
do {
c = reader.readByte();
if (c == '\r' || c == '\n') {
byte[] bytes = new byte[l.size()];
for (int i = 0; i < l.size(); i++) {
bytes[i] = l.get(i);
}
String line = new String(bytes, StandardCharsets.UTF_8);
System.out.println("地心侠士:"+ line);
l = new ArrayList<Byte>();
}
} while (reader.getFilePointer() != logFile.length());
System.out.println("地心侠士:" +logFile.length());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
}
}
}
}
JAVA实现读取最后几行日志的更多相关文章
- 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...
- ELK学习笔记之Logstash和Filebeat解析对java异常堆栈下多行日志配置支持
0x00 概述 logstash官方最新文档.假设有几十台服务器,每台服务器要监控系统日志syslog.tomcat日志.nginx日志.mysql日志等等,监控OOM.内存低下进程被kill.ngi ...
- java代码读取yarn聚合目录日志
可以直接使用org.apache.hadoop.yarn.client.cli.LogsCLI(yarn logs -applicationId)中的main方法逻辑,如 public static ...
- 使用 Filebeat 对多行日志进行处理(multiline)
Filebeat 收集日志的过程中,默认是按行收取的,也就是每一行都会默认是一个单独的事件并添加时间戳.但是在收集一些特殊日志的时候,往往一个事件包含有多行,例如 Java 的堆栈跟踪日志: 20-0 ...
- logstash处理多行日志-处理java堆栈日志
logstash处理多行日志-处理java堆栈日志 一.背景 二.需求 三.实现思路 1.分析日志 2.实现,编写pipeline文件 四.注意事项 五.参考文档 一.背景 在我们的java程序中,经 ...
- K8S学习笔记之filebeat采集K8S微服务java堆栈多行日志
0x00 背景 K8S内运行Spring Cloud微服务,根据定制容器架构要求log文件不落地,log全部输出到std管道,由基于docker的filebeat去管道采集,然后发往Kafka或者ES ...
- spark读取 kafka nginx网站日志消息 并写入HDFS中(转)
原文链接:spark读取 kafka nginx网站日志消息 并写入HDFS中 spark 版本为1.0 kafka 版本为0.8 首先来看看kafka的架构图 详细了解请参考官方 我这边有三台机器用 ...
- Logstash-安装logstash-filter-multiline插件(解决logstash匹配多行日志)
ELK-logstash在搬运日志的时候会出现多行日志,普通的搬运会造成保存到ES中日志一条一条的保存,很丑,而且不方便读取,logstash-filter-multiline可以解决该问题. 接下来 ...
- Java快速读取大文件
Java快速读取大文件 最近公司服务器监控系统需要做一个东西来分析Java应用程序的日志. 第一步探索: 首先我想到的是使用RandomAccessFile,因为他可以很方便的去获取和设置文件指针,下 ...
- 五种方式让你在java中读取properties文件内容不再是难题
一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...
随机推荐
- Web前端入门第1问:英语是否很重要?有哪些前置条件?
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 在入门之前,是否有这样的疑问: 程序员的英语是否很牛?毕竟程序员的代码像天书一样,比如这样: 答案是否定的. 英 ...
- 妙用PHP函数处理数组
PHP的数组是一种很强大的数据类型,与此同时PHP内置了一系列与数组相关的函数可以轻松地实现日常开发功能. 1. 取数组指定键名列 对于某些关联数组,有时候我们只想取指定键名的那部分,比如数组为 [' ...
- 超值分享:ASN.1格式解析源码(未使用openssl),有助于分析证书、私钥等文件
源码下载地址 --下载服务由我的HttpServer服务器提供 一款简单的ASN.1格式解析工具,可将ASN.1格式输出,是你分析证书.私钥等文件的必备良器,比如查看公钥大数.私钥大数.加密算法.H ...
- 【SqlServer】datetime存储精度问题探究
最近使用sqlserver 2012的时候注意到datetime类型的毫秒的精度是存在问题的,好奇是怎么回事,特意来研究一下 问题复现 如下的sql执行 UPDATE AlarmItem SET cr ...
- 找到占用磁盘最多的文件或目录,可以使用du和sort
想要找到占用磁盘最多的文件或目录,可以使用du和sort命令: du -h /path/to/directory | sort -rh | head -n 10 其中: du -h /path/t ...
- 实现领域驱动设计 - 使用ABP框架 - 聚合
这是本指南的关键部分.我们将通过实例介绍和解释一些明确的规则.在实现领域驱动设计时,您可以遵循这些规则并将其应用到您的解决方案中 领域案例 这些例子将使用GitHub中使用的一些概念,比如Issue, ...
- Cursor 老改坏代码?六哥这几招超管用!
大家好,我是六哥!最近不少小伙伴和我吐槽,在使用Cursor时,AI老是把代码改坏,让人头疼不已.我自己也用了大几十个小时Cursor,今天就来给大家分享一些实用小窍门,教大家如何巧妙规避这类问题. ...
- ARM开发板——实时获取用户点击触摸屏的LCD坐标信息(阻塞式读取)
ARM开发板--实时获取用户点击触摸屏的LCD坐标信息(阻塞式读取) 目录 ARM开发板--实时获取用户点击触摸屏的LCD坐标信息(阻塞式读取) 1.硬件信息 2.代码需求 3.代码实现 1.硬件信息 ...
- DateTime.ToString(String) 格式化方法
小故事: 群里有位问了个问题:"dateime.now 怎么取20170610 这样格式的数据啊?"...然后等了好久,没人帮忙回答下(这里肯定少不了歧视和异议). 虽然问题很简单 ...
- TDXSpreadSheet中自定义公式函数三大步骤
看其demo:CustomFunctionDemo. 在报表系统中,特别是财务等报表系统中.需要对固定格式的报表中cell定义取数公式. 如新中大中: 公式 返回值 gs_dwmc(预算单位代码/名称 ...