`

NIO读取日志文件

    博客分类:
  • IO
 
阅读更多

在分布式开发中对日志处理的一些简单思路

一.约定日志的格式,以及生成规则

1.约定日志的输出格式

2.约定生成日志的目录

3.约定日志生成的时段,是按天生成一个日志文件、还是按小时生成

 

二.日志抽取

1.日志抽取的应用对日志信息抽取入mysql库

2.定时统计各个应用所要统计的内容(srping+quarz)

3.提供web端可以查看统计分析(HightChar)

 

 文件的收集整理,对日志的IO读取写了简单的测试方法:

 

 

@Test
	public  void test() throws Exception{
		
        long time = System.currentTimeMillis();
        System.out.println("开始时间"+time);
        
	RandomAccessFile fin = new RandomAccessFile("D:\\logs\\catalina.out", "r");
	RandomAccessFile fout = new RandomAccessFile("D:\\logs\\catalina.out1", "rw");
        FileChannel fcin = fin.getChannel();  
        FileChannel fcout = fout.getChannel();  
        ByteBuffer buffer = ByteBuffer.allocate(15360);  
        int byteRead = 0;
        while((byteRead=fcin.read(buffer))>0){
        	buffer.flip();
        	while(buffer.hasRemaining()){
        		 fcout.write(buffer);
	   		}
           buffer.clear();
        }
        fcin.close();  
        fcout.close();  
        fin.close();  
        fout.close();  
        System.out.println("结束时间"+System.currentTimeMillis());
        System.out.println("消耗时间" +(System.currentTimeMillis() - time));
	}

 

 

    本机的配置是win7 4G内存  64为系统  32为jdk

 

    采用的NIO来处理,此日志为 2.57 GB (2,764,091,431 字节)读取使用以上ByteBuffer.allocate(15360);         得到的值是

 

开始时间1419939751750
结束时间1419939811927
消耗时间60177

    这个值的的设定可根据自己的电脑实际配置测试得到,这个值在我电脑上读取几乎感觉不到cpu的波动,这个开多个线程处理也是可行的。

 

     文件搜集完后那就是对文件的读取,并入数据库,采用的测试方法是:

	@Test
	public  void testRead() throws Exception{
        long time = System.currentTimeMillis();
        System.out.println("开始时间"+time);
	RandomAccessFile fin = new RandomAccessFile("D:\\logs\\logger.log", "r");
	long pos = 0;
        fin.seek(pos);
		String line = null;
		while((line=fin.readLine())!=null){
			pos = fin.getFilePointer();
			System.out.println(line + "-----" + fin.getFilePointer());
			if(pos==232){
				break;
			}
		}
		fin.seek(pos);
		while((line=fin.readLine())!=null){
			System.out.println(line + "-----" + fin.getFilePointer());
		}
        System.out.println("结束时间"+System.currentTimeMillis());
        System.out.println("消耗时间" +(System.currentTimeMillis() - time));
	}

 

这个类可以设置已经读到位置,下次从设定的位置开始读取  pos = fin.getFilePointer(),逐行读取解析入库

 

还有NIO种另外一种文件写入方式

	@Test
	public void testTransTo(){
	try{
		
        long time = System.currentTimeMillis();
        System.out.println("开始时间"+time);
		
	RandomAccessFile fromFile = new RandomAccessFile("D:\\logs\\catalina.out", "r");
	FileChannel      fromChannel = fromFile.getChannel(); 
		
	RandomAccessFile toFile = new RandomAccessFile("D:\\logs\\catalina.out1", "rw"); 
	FileChannel      toChannel = toFile.getChannel(); 
		
	long position = 0;
	long persize = fromChannel.size(); 
	long maxSize = persize;
		
	//FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中
	//toChannel.transferFrom(fromChannel, position, count);
		
	//transferTo()方法将数据从FileChannel传输到其他的channel中。下面是一个简单的例子: 适合读取小文件的小于1G的在30毫秒可处理完, 读取大文件瞬间cpu暴增,如果执行多个可导致内存溢出
		
	fromChannel.transferTo(position, persize, toChannel);
		
	fromFile.close();
	fromChannel.close();
	toFile.close();
	toChannel.close();
        
        System.out.println("结束时间"+System.currentTimeMillis());
        System.out.println("消耗时间" +(System.currentTimeMillis() - time)/1000);
		
	}catch(Exception e){
	    e.printStackTrace();
	}
}

 

这种方式读取2.5个的log日志我的cpu瞬间达到90%以上,但读取时间是47,缩减为原来的1/2需要24但cpu也是瞬间到达90%以上,缩减为原来的1/3的读取时间为17 cpu比较稳定,所以才想是不是在读取1G一下的日志时速度回高一些。

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java日志文件过滤

    1. **读取日志文件**:程序会读取指定路径下的日志文件,这通常通过`java.io`或`java.nio`包提供的文件I/O操作实现。 2. **日志解析**:日志格式可能各不相同,FilterFile可能包含解析不同格式日志的逻辑,如固定...

    Java NIO原理解析

    Java NIO,即Non-Blocking I/O,是Java在JDK 1.4引入的一套新的I/O API,旨在提供一种...随着Java版本的更新,NIO的功能也在不断完善,如NIO 2引入了异步文件I/O和Path API,进一步增强了Java在低级I/O操作上的表现。

    NIO简易服务器框架、文件传输

    2. **文件读取器(File Reader)**:客户端使用这个组件读取本地文件,将其转化为字节流,然后通过SocketChannel发送到服务器。 3. **文件发送逻辑(File Sending Logic)**:这部分逻辑可能包括文件分块、错误处理...

    日志记录类(将日志保存在一个文件中)

    4. **文件处理**:使用Java的`java.io`或`java.nio`包来处理文件的读写。创建或追加到日志文件,确保在多线程环境下正确同步。 5. **异常处理**:在写入日志时,应处理可能出现的I/O异常,如文件无法打开、磁盘空间...

    读取文件夹中所有文件中的内容

    例如,在进行数据分析、日志处理或批量文件操作时,可能需要读取一个文件夹下所有的文件内容并对这些内容进行一定的处理。Java作为一种广泛使用的编程语言,提供了丰富的API来帮助开发者实现这样的需求。 #### 关键...

    java nio入门学习,两个pdf

    2. **文件操作**:NIO提供了高效、灵活的文件读写能力,特别是对于大数据处理,如日志分析、文件复制等。 3. **网络编程**:在网络通信中,NIO可以实现高效的客户端与服务器之间的数据传输,如HTTP、FTP服务器。 4...

    NIO网络通讯编程

    此外,NIO也适用于需要高效读写文件或网络流的场合,例如大数据处理、日志收集系统等。 7. Java NIO库的其他组件:除了基本的通道、缓冲区和选择器外,Java NIO库还包括Pipe(管道)和CharBuffer(字符缓冲区)等,...

    java读取大文件

    在Java中,处理大文件时,直接使用`BufferedReader`或`FileInputStream`等默认方式可能会导致内存溢出,因为它们会将整个文件加载到内存中。...这种方法尤其适用于处理非常大的文件,如日志文件或大数据分析中的文件。

    java读取大文件大全

    #### 三、使用NIO读取大文件 本文档中的代码示例主要采用NIO的方式读取大文件。下面详细介绍其中的关键步骤和技术要点。 #### 四、代码解析 1. **初始化文件输入输出** ```java File fin = new File("D:\\...

    java读取文本文件

    在Java编程语言中,读取文本文件是一项基本且常见的任务,尤其在处理数据输入、日志分析或配置文件操作时。下面将详细讲解如何使用Java读取文本文件,包括多种常用的方法和注意事项。 1. 使用`BufferedReader` `...

    利用JDK7的NIO2.0进行I/O读写和监视

    学习和理解JDK7的NIO2.0对于提升Java应用的性能和可扩展性至关重要,尤其是在处理大量I/O操作的场景下,如文件服务器、日志系统或者大型数据处理应用。同时,NIO2.0的异步特性也为编写高并发、非阻塞的代码提供了...

    IO、文件、NIO 最佳阅读资料与实践

    同时,通过编写实际的文件读写、网络通信程序,可以深入体会IO和NIO的用法。博客“IO、文件、NIO最佳阅读资料与实践”可能会分享作者在学习过程中的心得,推荐一些实用的教程、文档和工具,以及解决常见问题的方法。...

    文件读写(SD卡文件,及资源文件)

    理解并掌握文件读写是开发Android应用的必要技能,特别是对于存储用户数据、日志记录或者资源加载等场景。本文将详细讲解如何在Android中进行文件读写,并以"FileReadAndWriteTest"为例,展示具体实现。 1. **文件...

    Java读取文件并对其排序后重新写入文件

    可以使用缓冲区提高读写效率,或者考虑使用NIO(非阻塞I/O)进行更高效的文件操作。此外,还可以封装成工具类,以便在多个地方复用。 通过上述步骤,我们可以实现Java中读取文件、排序数据并重新写入文件的功能。这...

    STL.zip_java读取stl_stl读取 java

    1. **打开文件**:使用`java.io.File`类创建一个File对象,然后通过`java.nio.file.Files`类的`newBufferedReader`方法创建一个BufferedReader,以读取文件内容。 2. **解析文件**:逐行读取文件,跳过头信息,直到...

    socket读取文件上传并在服务器从新写入文件

    1. **文件读取**:客户端程序首先需要打开并读取本地文件,将文件内容转换为字节流。这可以通过Java的`FileInputStream`或Python的`open()`等API实现。 2. **建立Socket连接**:使用`Socket`类(在Java中)或`...

    异步读取文件

    异步读取适用于Web服务器处理文件上传、大数据分析、实时日志处理等场景,以及任何对响应时间和资源利用率有较高要求的应用。 9. **最佳实践** - 使用缓冲区来减少系统调用次数,提高效率。 - 避免过度使用异步...

Global site tag (gtag.js) - Google Analytics