`
sunnylocus
  • 浏览: 869325 次
  • 性别: Icon_minigender_1
  • 来自: 美国图森
社区版块
存档分类
最新评论

Java实时监控日志文件并输出

    博客分类:
  • Java
阅读更多

    最近有一个银行数据漂白系统,要求操作人员在页面调用远端Linux服务器的shell,并将shell输出的信息保存到一个日志文件,前台页面要实时显示日志文件的内容.这个问题难点在于如何判断哪些数据是新增加的,通过查看JDK 的帮助文档, java.io.RandomAccessFile
可以解决这个问题.为了模拟这个问题,编写LogSvr和 LogView类,LogSvr不断向mock.log日志文件写数据,而 LogView则实时输出日志变化部分的数据.

代码1:日志产生类

package com.bill99.seashell.domain.svr;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
 *<p>title: 日志服务器</p>
 *<p>Description: 模拟日志服务器</p>
 *<p>CopyRight: CopyRight (c) 2010</p>
 *<p>Company: 99bill.com</p>
 *<p>Create date: 2010-6-18</P>
 *@author Tank Zhang<tank.zhang@99bill.com>
 *@version v0.1 2010-6-18
 */
public class LogSvr {
	
	private SimpleDateFormat dateFormat = 
		new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	/**
	 * 将信息记录到日志文件
	 * @param logFile 日志文件
	 * @param mesInfo 信息
	 * @throws IOException 
	 */
	public void logMsg(File logFile,String mesInfo) throws IOException{
		if(logFile == null) {
			throw new IllegalStateException("logFile can not be null!");
		}
		Writer txtWriter = new FileWriter(logFile,true);
		txtWriter.write(dateFormat.format(new Date()) +"\t"+mesInfo+"\n");
		txtWriter.flush();
	}
	
	public static void main(String[] args) throws Exception{
		
		final LogSvr logSvr = new LogSvr();
		final File tmpLogFile = new File("mock.log");
		if(!tmpLogFile.exists()) {
			tmpLogFile.createNewFile();
		}
		//启动一个线程每5秒钟向日志文件写一次数据
		ScheduledExecutorService exec = 
			Executors.newScheduledThreadPool(1);
		exec.scheduleWithFixedDelay(new Runnable(){
			public void run() {
				try {
					logSvr.logMsg(tmpLogFile, " 99bill test !");
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			}
		}, 0, 5, TimeUnit.SECONDS);
	}
}

 代码2:显示日志的类

 

 

package com.bill99.seashell.domain.client;   
  
import java.io.File;   
import java.io.IOException;   
import java.io.RandomAccessFile;   
import java.util.concurrent.Executors;   
import java.util.concurrent.ScheduledExecutorService;   
import java.util.concurrent.TimeUnit;   
  
public class LogView {   
    private long lastTimeFileSize = 0;  //上次文件大小   
    /**  
     * 实时输出日志信息  
     * @param logFile 日志文件  
     * @throws IOException  
     */  
    public void realtimeShowLog(File logFile) throws IOException{   
        //指定文件可读可写   
        final RandomAccessFile randomFile = new RandomAccessFile(logFile,"rw");   
        //启动一个线程每10秒钟读取新增的日志信息   
        ScheduledExecutorService exec =    
            Executors.newScheduledThreadPool(1);   
        exec.scheduleWithFixedDelay(new Runnable(){   
            public void run() {   
                try {   
                    //获得变化部分的   
                    randomFile.seek(lastTimeFileSize);   
                    String tmp = "";   
                    while( (tmp = randomFile.readLine())!= null) {   
                        System.out.println(new String(tmp.getBytes("ISO8859-1")));   
                    }   
                    lastTimeFileSize = randomFile.length();   
                } catch (IOException e) {   
                    throw new RuntimeException(e);   
                }   
            }   
        }, 0, 1, TimeUnit.SECONDS);   
    }   
       
    public static void main(String[] args) throws Exception {   
        LogView view = new LogView();   
        final File tmpLogFile = new File("mock.log");   
        view.realtimeShowLog(tmpLogFile);   
    }   
  
}  

 

执行LogSvr类,LogSvr类会启动一个线程,每5秒钟向mock.log日志文件写一次数据,然后再执行LogView类,LogView每隔1秒钟读一次,如果数据有变化则输出变化的部分.

 

结果输出:

2010-06-19 17:25:54  99bill test !
2010-06-19 17:25:59  99bill test !
2010-06-19 17:26:04  99bill test !
2010-06-19 17:26:09  99bill test !
2010-06-19 17:26:14  99bill test !
2010-06-19 17:26:19  99bill test !

 

 

PS:

  代码修改过, 有朋友下载了我的代码,说如果是中文会乱码,将日志输出类的第30行的代码  
  System.out.println(tmp)改成 System.out.println(new String(tmp.getBytes("ISO8859-1"))),就会正常显示中文.


 

 

20
0
分享到:
评论
33 楼 dx_meng 2016-09-22  
楼主,也求一份356878812@qq.com,小女子也学习一下,谢谢。
32 楼 青春de诺言 2016-07-20  
楼主,您好!麻烦发我一份学习下 fangyb@bytter.com 谢谢!
31 楼 tblovecj 2016-02-22  
亲爱的楼主,请发一份来学习下,谢谢
tangben_slkj@126.com
30 楼 zifanglian 2015-08-10  
楼主您好,我现在也想用这个框架实时在前台展示日志信息,麻烦您给我也发一份,谢谢了!
邮箱:zifanglian@163.com
29 楼 cuiyiping 2014-12-12  
楼主,把日志显示在前台页面的代码能否发我一份。418409893@qq.com
28 楼 zhaofangtao 2014-10-28  
这是打印到system控制台。请问打印到界面比如Lable组件上,该如何输出?
貌似Lable组件传入run方法中后会报错。
27 楼 jason_3345 2014-10-28  
楼主可否发份给我
jack68_hn@163.com
26 楼 sunnylocus 2014-08-19  
jokerQin 写道
sunnylocus 写道
jokerQin 写道

楼主我现在要把日志显示在前台页面,这样应该怎么处理呢?


很简单呀,用ajax技术每隔一秒请求服务端,服务端把上次插入的日志信息取出来,response到前端。有个数据漂白项目里用了这种方式,我看看代码还能不能找到。

麻烦楼主了

项目在移动硬盘里放着,你给我个邮箱,我回家找到后发你邮箱里
25 楼 huangyungang 2014-08-19  
楼主,麻烦发一份,huangyungang@hotmail.com
24 楼 jokerQin 2014-08-18  
sunnylocus 写道
jokerQin 写道

楼主我现在要把日志显示在前台页面,这样应该怎么处理呢?


很简单呀,用ajax技术每隔一秒请求服务端,服务端把上次插入的日志信息取出来,response到前端。有个数据漂白项目里用了这种方式,我看看代码还能不能找到。

麻烦楼主了
23 楼 sunnylocus 2014-08-18  
jokerQin 写道

楼主我现在要把日志显示在前台页面,这样应该怎么处理呢?


很简单呀,用ajax技术每隔一秒请求服务端,服务端把上次插入的日志信息取出来,response到前端。有个数据漂白项目里用了这种方式,我看看代码还能不能找到。
22 楼 jokerQin 2014-08-18  

楼主我现在要把日志显示在前台页面,这样应该怎么处理呢?
21 楼 a136709853 2014-08-08  
楼主你好!请问怎么做实时监控telnet或tn3270中的操作并实时显示在网页控件(如用Swing界面的形式进行打印)中。如果有相关资料麻烦发我邮箱136709853@qq.com,谢谢。
20 楼 hxsyewlink 2014-06-23  
多谢lz分享,我也遇到了这个问题,学习一下
19 楼 moxiuer 2013-11-15  
你好,我现在需要把日志的错误信息,用Swing界面的形式进行打印,想知道怎么做呢?我一直打印不出来呢
18 楼 yuanji 2013-11-07  
请教一下楼主,对于远程系统的监控,如果实时数据接收速度超过处理程序的速度,应当如何处理比较好。目前采用socket接收,并new新线程处理,导致线程处理来不及,产生过多线程致使系统内存溢出。
17 楼 竹子风 2013-04-28  
楼主,挺不错的,很感兴趣的,能否发我一份,谢谢。
jasonk2010@163.com
16 楼 carol_ji 2013-04-22  
写得非常好,对我很有用,
楼主我现在做的是个自动化测试的工具,要把日志显示在前台页面。
你那用Ajax每隔一秒取新增长的信息,然后显示在页面的代码,能不能发给我一份。非常感谢。
ryj_jch@163.com
15 楼 medicine 2013-04-06  
  不错!
14 楼 小岛人张璐 2013-01-07  
sunnylocus 写道
奇迹海 写道
楼主,看了下你描述的功能正和我现在想实现的类似。可是我的是要实时输出到页面上,该怎么做?

这个简单呀,我做过,用ajax每隔一称钟获取新增长的信息,然后显示到页面就可以了。手里有源代码,需要的话发到你邮箱里。

楼主你好,我现在手上有一个类似的东西要做,但我刚刚接触不太会,希望您帮忙发一份代码,谢谢了。fortune1989@sohu.com

相关推荐

    Java实时监控日志文件并输出的方法详解

    主要给大家介绍了关于Java实时监控日志文件并输出的方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。

    Log4j日志根据模块不同输出到不同的日志文件开发配置,便于监控项目各功能模块的运行情况

    文件中内容包括模块中某个类单独输出到一个日志文件中、模块中某个package单独输出到一个日志文件中、同一模块不同package输出到一个日志文件中三种情况下log4j.properties配置项配置事例、Java类中代码如何一致编写...

    基于WebSocket技术的实时日志输出系统设计源码

    WebSocket日志输出系统 - 基于Java和HTML开发的实时日志显示解决方案,包含20个文件,专注于WebSocket技术实现,支持实时日志输出,适用于各类日志管理需求,提升系统监控和运维效率。

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    javaagent:基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志

    相比于NewRelic或者开源的,以及阿里的,本工具主打的是简单,我们只记录每个方法的执行次数和时间,并输出到json格式的日志文件中。基于javaagent的日志,你可以使用严丽同学开发的进行分析查询,或者可以自己去写...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包9

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包101

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包5

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java jdk实列宝典 光盘源代码

    自定义日志文件类; 8线程 线程的启动 和停止;线程的互斥;线程的协作;线程join;生产者、消费者问题;线程的优先级;列出虚拟机中所有的线程;守护线程Daemon;线程池;一个死锁的例子; 定时器Timer:包括在指定...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包7

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics