iNeedle日志下载功能问题
问题:
iNeedle系统本身包含日志下载功能,主要是将web服务器中的用户访问日志按照一定条件进行筛选并下载,提供管理者分析。但是这次的测试中发现iNeedle日志下载一直会卡住,web界面显示正在生成文件,这个问题郁闷了老半天。后来在雷哥的细心指导下终于弄明白了问题的原因,并轻易的解决掉,现在日志功能可以实现下载功能。
原理:
由于日志文件一般会比较大,这时用java直接去根据条件筛选并下载日志效率比较低下,这时就在底层采用C代码对文件进行索引筛选,并生成所需要的日志文件,然后由java调用zip程序进行文件解压分发下载。整个过程看似简单,其实关键点在于C和Java程序的相互调用问题。C要对log_filter代码进行打包,生成动态库,放到linux标准库文件路径下,供java程序调用。
C代码:
C代码由两部分组成:ilog_find.c和logGenerator_linux.c。ilog_find.c文件主要是向外提供接口get_ilog_file(char * cmd_str, char *log_name, char *log_out),三个参数分别是命令参数、原日志文件路径名称、输出日志路径名称,主要由logGenerator_linux.c文件调用,起核心作用,主要是根据用户的筛选条件,将满足条件的日志过滤出来,并输出。logGernerator_linux.c文件主要是做中转作用,这个文件中的接口Java_com_icompass_helper_LogGenerator_logFilter()主要是由java端来调用,由于类型的不同,需要作一些类型转换,输入转换,输出转换等,详细内容见代码。额外需要添加一个头文件,com_icompass_helper_LogGenerator.h,主要是针对java接口函数的声明,其实在logGernerator_linux.c文件中的函数是对java声明函数的一个实现过程。
logGernerator_linux.c内容:
#include <jdk/jni.h>
#include "com_icompass_helper_LogGenerator.h"
#include <stdio.h>
#include <string.h>
unsigned
long get_ilog_file(char
*,char
*,char*);
JNIEXPORT jint JNICALL Java_com_icompass_helper_LogGenerator_logFilter (JNIEnv *env, jobject obj, jstring cmdstr, jstring logdir, jstring logname, jstring outdir, jstring outname)
{
char
*mycmdstr =
(char*)(*env)->GetStringUTFChars(env, cmdstr,
NULL);
char
*mylogdir =
(char*)(*env)->GetStringUTFChars(env, logdir,
NULL);
char
*mylogname =
(char*)(*env)->GetStringUTFChars(env, logname,
NULL);
char
*myoutdir =
(char*)(*env)->GetStringUTFChars(env, outdir,
NULL);
char
*myoutname =
(char*)(*env)->GetStringUTFChars(env, outname,
NULL);
};
};
};
jint ret =
;
sprintf(clogname,
"%s/%s", mylogdir, mylogname);
sprintf(coutname,
"%s/%s", myoutdir, myoutname);
strcpy(ccmdstr,mycmdstr);
ret =
(jint)get_ilog_file(ccmdstr, clogname, coutname);
(*env)->ReleaseStringUTFChars(env, cmdstr, mycmdstr);
(*env)->ReleaseStringUTFChars(env, logdir, mylogdir);
(*env)->ReleaseStringUTFChars(env, logname, mylogname);
(*env)->ReleaseStringUTFChars(env, outdir, myoutdir);
(*env)->ReleaseStringUTFChars(env, outname, myoutname);
return ret;
}
com_icompass_helper_LogGenerator.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_icompass_helper_LogGenerator */
#ifndef _Included_com_icompass_helper_LogGenerator
#define _Included_com_icompass_helper_LogGenerator
#ifdef __cplusplus
extern
"C"
{
#endif
/*
* Class: com_icompass_helper_LogGenerator
* Method: logFilter
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
*/
/*
命令参数
日志目录
日志文件
目的目录
目的文件
*/
JNIEXPORT jint JNICALL Java_com_icompass_helper_LogGenerator_logFilter
(JNIEnv *, jobject, jstring, jstring, jstring, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif
C这块可以单独做测试,在ilog_find.c文件中main函数中可以简单输入些参数做测试。
生成动态库
gcc ilog_find.c logGenerator_linux.c -fPIC -shared -o liblogGenerator.so
cp liblogGenerator.so /usr/lib
拷贝到linux标准库路径下,让java来调用即可。
Bug
所有上述工作都做完之后,进行web界面操作,仍然是调用失败。后来使用单独C程序测试:成功;java独立程序测试:成功;使用web调用:失败。最后又做了些测试,针对输入日志文件路径进行了对比,也没有错误,最后竟然是输出日志路径写为/var/dz_resource/shared/tmp,但是由于/var/dz_resouce/shared目录下是没有tmp目录的,因此导致C代码端写入输出日志文件时发生隐藏错误,并没有成功写入输出日志文件。后续:在C代码中或Java代码中都应该做一下判断,如果该目录没有的话,就 应该调用linux命令进行创建目录,或者在部署ineedle环境的时候就应该提前创建该目录。
mkdir /var/dz_resource/shared/tmp -p
其实最终web端读取日志文件路径不应该写这个路径,应该是mnt目录,而不是nfs目录,这样如果真实环境下并不在一个设备上就会造成严重问题。
后续
其实后续还是应该再认真阅读一下ilog_find.c文件,检查是否有需要完善的地方。
还有应该学习学习java和C相互调用。
iNeedle日志下载功能问题的更多相关文章
- 【Python学习 】Python实现的FTP上传和下载功能
一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...
- Safari 下用 "location.href = filePath" 实现下载功能的诡异 bug
Safari 下的一些诡异 bug 我们已经领教一二,比如前文中说的 无痕浏览模式下使用 localStorage 的 API 就会报错.今天我们要讲的是利用 location.href = file ...
- location.href 实现点击下载功能
如果页面上要实现一个点击下载的功能,传统做法是使用一个 a 标签,然后将该标签的 href 属性地址指向下载文件在服务端的地址(相对地址或者绝对地址),比如这样: 能这样实现是因为,在浏览器地址栏输入 ...
- php实现文件上传下载功能小结
文件的上传与下载是项目中必不可少的模块,也是php最基础的模块之一,大多数php框架中都封装了关于上传和下载的功能,不过对于原生的上传下载还是需要了解一下的.基本思路是通过form表单post方式实现 ...
- JavaWeb学习记录(一)——response响应头之缓存设置与下载功能的实现
一.HTTP中常用响应头 Location: http://www.it315.org/index.jsp Server:apache tomcat Content-Encoding: gzip Co ...
- JavaWeb实现文件上传下载功能实例解析
转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...
- 【转】Android 服务器之SFTP服务器上传下载功能
原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...
- wuzhicms字段的添加以及实现下载功能
1.字段的添加 发布内容--> 栏目管理--> 字段管理-->添加字段 下面根据需求进行相应的设置. 然后提交即可. 2.下载功能的实现 实例说明: 会员中心相关页面下载功能的实现 ...
- windows下实现uboot的tftp下载功能
一.原理分析 带有uboot的开发板实际上充当的就是tftp客户端,而PC机扮演的角色就是tftp服务器端,而tftp下载功能实际上就是文件传输.tftp服务器可以建立在虚拟机linux下,也可以建立 ...
随机推荐
- TestNG 三 测试方法
一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数. 设置方式有两种方法:使用testng.xml或 ...
- nginx性能优化之线程池
默认情况下,nginx的work process按照顺序一个个处理http请求,因此如果后台处理时间较长,则work process会长时间等待IO状态,因此限制并发性.如下所示: 所以,对于可能存在 ...
- 原博客地址http://blog.chinaunix.net/uid/20656672.html弃用
原博客地址http://blog.chinaunix.net/uid/20656672.html弃用
- 02Mybatis_原生态jdbc编程中的问题总结——从而引生出为什么要用Mybatis
我们先用jdbc去编写一个例子: 第一步:建表 /* SQLyog v10.2 MySQL - 5.1.72-community : Database - mybatis ************** ...
- bootstrap的下拉框在firefox界面不友好的处理
http://output.jsbin.com/titaki 以上这个链接在firefix浏览器打开就会发现里面有个小容器,而且下拉按钮样式跟不友好 上谷歌查了一下 1.小容器可以利用select:p ...
- 实例之HTML标签属性
鼠标放在图片上会显示说明文字的代码 <img src="图片地址" width=620 height=138 border=0 title="说明文字" ...
- 理解React中es6方法创建组件的this
首发于:https://mingjiezhang.github.io/(转载请说明此出处). 在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的. 从react中的 ...
- 强大的JavaScript动画图形库mo.js
最近在学习前端动画方面知识时发现了挺有趣的一个动画的图形库mo.js,页面效果真是酷炫,有兴趣的同学可以研究下:). 酷炫的效果: 以下是官方的demo效果,更多详情请查看 mo.js http:// ...
- JS中取整以及随机颜色问题
前言:感觉自己已经好久好久没有写博客了,最近都是在写在线笔记比较多.现在来到新公司了,昨天刚刚完成一个项目所以今天有空研究研究一下前端方面的技术.下午在看一个游戏代码的时候,发现了几个别人留下的不错的 ...
- 几个有用的JSON工具
好久没写博客了,这里都要长草了:) 这几天研究PLM360 REST API和Infraworks REST API,一天到晚和JSON打交道,发现这几个小工具非常好用,推荐给大家. 第0个,大名鼎鼎 ...