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下,也可以建立 ...
随机推荐
- windows根据端口号找进程
d:\>netstat -ano | findstr "7777" TCP 127.0.0.1:7776 127.0.0.1:7777 ESTABLISHED 11764 T ...
- Hibernate(六)__对象的三种状态
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前 ...
- ProgressBar.js – 漂亮的响应式 SVG 进度条
ProgressBar.js 是一个借助动态 SVG 路径的漂亮的,响应式的进度条效果.使用 ProgressBar.js 可以很容易地创建任意形状的进度条.这个 JavaScript 库提供线条,圆 ...
- jquery图片查看插件,支持旋转、放大、缩小、拖拽、缩略图(仿qq图片查看)
最近做了一个jquery图片查看的插件,目的是能精确查看图片的详情,插件支持图片旋转.放大.缩小.拖拽.缩略图显示,界面效果是按照window的qq查看图片功能写的,当然不尽相同. 具体功能: 1. ...
- js动态计算移动端rem
在做移动端web app的时候,众所周知,移动设备分辨率五花八门,虽然我们可以通过CSS3的media query来实现适配,例如下面这样: html { font-size : 20px; } @m ...
- Box2D自定义重力
需要给刚体添加一个自定义的属性:m_customGravity,这样就可以动态的修改每一个刚体自定义的重力,查找box2d源码大约在5486行,加上红色的一句代码 b2Island.prototype ...
- iOS 适配iOS9
1.网络接口不支持https协议,在iOS9下 在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据. 解决方案(以下方法2选1): (1)暂时退回到http协议 ...
- 如何查找SAP的事务代码清单
SAP系统中,为了省去输入程序名称等繁琐步骤,SAP提供一种命令,称作‘事务代码’,通过执行事务代码达到快速进入相应程序的目的.那么在系统中如何去查找事务代码,事务代码和程序的对应关系如何呢?我们可以 ...
- BASIS--笨办法解决ALV_GRID的列剪切丢失纪录的错误
最近经常有业务人员问及在ALV_grid输出报表中,选择某一列,点击左键,并点击弹出菜单的复制文本,复制出的文本存在丢失 (纪录不少,但部分纪录的文本丢失).该如何解决呢? 后来跟踪代码发现这个命令没 ...
- AdaBoost算法实现
# -*- coding: utf-8 -*- # -------------------------------------------------------------------------- ...