问题:

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日志下载功能问题的更多相关文章

  1. 【Python学习 】Python实现的FTP上传和下载功能

    一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...

  2. Safari 下用 "location.href = filePath" 实现下载功能的诡异 bug

    Safari 下的一些诡异 bug 我们已经领教一二,比如前文中说的 无痕浏览模式下使用 localStorage 的 API 就会报错.今天我们要讲的是利用 location.href = file ...

  3. location.href 实现点击下载功能

    如果页面上要实现一个点击下载的功能,传统做法是使用一个 a 标签,然后将该标签的 href 属性地址指向下载文件在服务端的地址(相对地址或者绝对地址),比如这样: 能这样实现是因为,在浏览器地址栏输入 ...

  4. php实现文件上传下载功能小结

    文件的上传与下载是项目中必不可少的模块,也是php最基础的模块之一,大多数php框架中都封装了关于上传和下载的功能,不过对于原生的上传下载还是需要了解一下的.基本思路是通过form表单post方式实现 ...

  5. JavaWeb学习记录(一)——response响应头之缓存设置与下载功能的实现

    一.HTTP中常用响应头 Location: http://www.it315.org/index.jsp Server:apache tomcat Content-Encoding: gzip Co ...

  6. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  7. 【转】Android 服务器之SFTP服务器上传下载功能

    原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...

  8. wuzhicms字段的添加以及实现下载功能

    1.字段的添加 发布内容--> 栏目管理--> 字段管理-->添加字段 下面根据需求进行相应的设置. 然后提交即可. 2.下载功能的实现 实例说明: 会员中心相关页面下载功能的实现 ...

  9. windows下实现uboot的tftp下载功能

    一.原理分析 带有uboot的开发板实际上充当的就是tftp客户端,而PC机扮演的角色就是tftp服务器端,而tftp下载功能实际上就是文件传输.tftp服务器可以建立在虚拟机linux下,也可以建立 ...

随机推荐

  1. 框架Spring笔记系列 一 基础

    主题:Spring 1.什么样的问题,使得Spring框架应用而生?使用Spring解决了那些问题? 2.

  2. Scalaz(53)- scalaz-stream: 程序运算器-application scenario

    从上面多篇的讨论中我们了解到scalaz-stream代表一串连续无穷的数据或者程序.对这个数据流的处理过程就是一个状态机器(state machine)的状态转变过程.这种模式与我们通常遇到的程序流 ...

  3. selenium启动firefox时加载扩展

    有些时候,我们测试需要用到插件或者已经导入的证书(比如金融和安全加密行业),而selenium启动firefox时会打开一个新的,不含有任何插件和个人证书的firefox(等同于全新安装后第一次打开的 ...

  4. Java 经典实例: Unicode字符和String之间的转换

    在Java诞生之际,Unicode码是一个16位的字符集,因此char值似乎顺其自然为16位宽,多年来一个char变量几乎可以表示任何Unicode字符. /** * Created by Frank ...

  5. 高效 Java Web 开发框架 JessMA v3.3.1 正式发布

    JessMA(原名:Portal-Basic)是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hib ...

  6. Spring4学习笔记1-HelloWorld与IOC和DI概述

    1.安装环境 1.1安装eclipse,jdk 1.1安装Spring tool suite(非必要项) 2.spring HelloWorld 2.1 需要的jar包(spring官网下载:http ...

  7. JavaScript基础20——element对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 一级缓存、二级缓存、延迟加载、hibernate session 域 pojo三种状态

    1.一级缓存(session缓存 ).二级缓存      意义:提高hibernate查询效率.    缺点:可能会因并发,产生数据不一致.      本质:基于session 的缓存,利用hiber ...

  9. ArcGIS version not specified错误解决方法

    添加下列语句到程序入口前: ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine);

  10. xmpp整理笔记:聊天信息的发送与显示

    任何一个信息的发送都需要关注两个部分,信息的发出,和信息在界面中的显示 往期回顾: xmpp整理笔记:环境的快速配置(附安装包)  http://www.cnblogs.com/dsxniubilit ...