鼓捣 atmosphere 和 org.apache.commons.io.input.Tailer 搭建的web日志查看器

最近部署一个测试用的项目,需要监控log4j的日志,搜了搜Apache有个Chainsaw项目,但是本地客户端的。
最后用github上有个外国人的程序的基础上改的 原程序在https://github.com/aestasit/logviewer.git 很老了,改起来才发现很麻烦

先git 克隆到本地
装grade
编译报错
C:\Users\wangxin\Documents\GitHub\logviewer\logviewer>gradle war

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\wangxin\Documents\GitHub\logviewer\logviewer\build.gradle' line: 7

* What went wrong:A problem occurred evaluating root project 'logviewer'.
> Could not find method mavenRepo() for arguments [{urls=https://oss.sonatype.org/content/repositories/releases/}] on root project 'logviewer'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 6.684 secs

原因目前gradle是2.9版本 build.gradle 文件,的语法和以前变化很大

这是改完以后的
allprojects {
repositories {
mavenLocal() 本地maven源,在C:\Users\wangxin\.m2\repository 下,有些网上找不到源的要下载自己弄本地
mavenCentral artifactUrls: ["http://maven.wso2.org/nexus/content/repositories/apache-snapshots"]
可以自己指定网上源的位置。
mavenCentral() 默认指向 https://repo1.maven.org/maven2/
}
}

另外一个坑就是有些网站比如http://mavenrepository.com 的程序包路径是这样的,注意 org.atmosphere
http://mavenrepository.com/artifact/org.atmosphere/atmosphere-runtime/2.4.1.4
而现在的gradle需要的路径是这样的 org/atmosphere 如下
https://repo1.maven.org/maven2/org/atmosphere/atmosphere-runtime/
结果就是一开始包各种找不到。

gradle的这部分配置可以参考https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html#org.gradle.api.artifacts.dsl.RepositoryHandler:mavenCentral(java.util.Map)

另外一个坑就是 org.apache.commons.io.input.Tailer 的中文问题
程序可以跑起来,单中文一直显示乱码,最后通过加输出,判断是 org.apache.commons.io.input.Tailer 的问题,在handle函数监听输出就是乱码。应该还是打开文件的问题,我的文件是utf-8格式,估计默认还是用了iso8859-1。即使我鼓捣本地源用了最新的 org.apache.commons.io 2.5-SNAPSHOT,的最新tailer.create中,支持字符集设定的重载,也是不管用。最后尝试“这篇文章”。的两个方法中的第二个方法,有效果。

方法一:

try {
			String a = new String(line.getBytes('ISO8859-1'),'GBK');
			System.out.println(a);
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

方法2:

public void handle(String line) {
final Charset charset = Charset.defaultCharset();//Charset.forName('UTF-8');
char[] chs = line.toCharArray();
byte[] data = new byte[chs.length];
for (int i = 0; i < data.length; i++) {
	        data[i] = (byte) chs[i];
   }
  line = new String(data,charset);
   System.out.println(line);
}

 

第三个坑就是老外这个程序用的旧版atmosphere 0.7.1 默认传输方式是streaming。导致大数据量时,服务器推过来的包被分片,造成json解析失败。从新的文档看,支持的传输方式蛮多的,官网文档

transport [default = 'polling']

The transport used between the client and the server. Value are polling, long-polling, streaming,websocket, jsonp, sse.

由于我这个是老版本,也没有去试,直接改代码传输时增加了一个包头。在前端加了循环解析,效果还行。

另外最后就是有莫名其妙日志顺序乱掉的情况,从服务端输出日志看,tailer顺序正常,atmosphere输出时有问题,改用
atmosphere 0.7.2后问题消失。

最后附上可以运行的程序logviewer

© 2015 - 2016, 新之助meow. 原创文章转载请注明: 转载自http://www.xinmeow.com

0.00 avg. rating (0% score) - 0 votes
点赞