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下,也可以建立 ...
随机推荐
- Spring发展历程总结
目前很多公司的架构,从Struts2迁移到了SpringMVC.你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢? 既然这样,我们从源头说起.Stru ...
- 泛函编程(28)-粗俗浅解:Functor, Applicative, Monad
经过了一段时间的泛函编程讨论,始终没能实实在在的明确到底泛函编程有什么区别和特点:我是指在现实编程的情况下所谓的泛函编程到底如何特别.我们已经习惯了传统的行令式编程(imperative progra ...
- Quartz.NET开源作业调度框架系列(一):快速入门step by step
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- bootstrap源码分析之scrollspy(滚动侦听)
源码文件: Scrollspy.js 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项2.导航必须是 .nav > li > a 结构,并且a ...
- SweetAlert – 替代 Alert 的漂亮的提示效果
Sweet Alert 是一个替代传统的 JavaScript Alert 的漂亮提示效果.SweetAlert 自动居中对齐在页面中央,不管您使用的是台式电脑,手机或平板电脑看起来效果都很棒.另外提 ...
- Java2_J2EE体系架构
J2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition),它的核心是一组技术规范与指南,提供基于组件的方式来设计.开发.组装和部署企业应用.J2EE使用多 ...
- 理解React中es6方法创建组件的this
首发于:https://mingjiezhang.github.io/(转载请说明此出处). 在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的. 从react中的 ...
- Core Animation - 核心动画
CAAnimation类,是一个抽象类.遵循CAMediaTiming协议和CAAction协议! CAMediaTiming协议 可以调整时间,包括持续时间,速度,重复次数. CAAction协议 ...
- 计算c字符的长度,保证不超过2^30
来自sqlite3源码 /* ** Compute a string length that is limited to what can be stored in ** lower 30 bits ...
- Android 第一个程序 及 环境搭配
一. JDK配置 1.找到jdk安装路径 2.配置环境变量(建议配置在系统变量里面) 1).配置JAVA_HOME变量 2).配置 CLASSPATH 环境变量 CLASSPATH=.;%JAVA_H ...