问题:

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. Java经典实例:按字符颠倒字符串

    使用StringBuilder类的reverse()方法来实现. /** * Created by Frank */ public class StringRevChar { public stati ...

  2. IO流(一)__File对象和字符流FileWriter FileReader

    IO流:IO流用来处理设备之间的数据传输,Java对于流的操作对象都在IO包中将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出 流分为字节流和字符流字符流的由来:其实就是字节流读取文字字节 ...

  3. 使用React并做一个简单的to-do-list

    1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其virtual ...

  4. css知多少(7)——盒子模型

    1. 引言 从这一节开始,我们就进入本系列的第三部分——css呈现.本部分将描述css在页面的几种布局和呈现的特性.包括两类:文字.块. 第一类——文字.这部分相对比较简单一些,例如设置字号.字体.颜 ...

  5. bootstrap字体图标在谷歌显示正常,在火狐显示异常的问题

    bootstrap字体图标的使用 现在有很多的网站支持字体图标,我所知道的有bootstrap,fontawesome,iconmoon,等等,可能还有其他我并不知道 bootstrap只要你的文件夹 ...

  6. BasicModal - 简单易用的现代 Web App 弹窗

    BasicModal 是为现代 Web 应用程序打造的弹窗系统.它包括所有你需要显示的信息,问题或接收用户的输入.这里的弹窗还可以链接起来,所以你可以很容易地建立一个预定义顺序的安装帮助或显示对话框. ...

  7. Pizza Pie Charts – 基于 Snap SVG 框架的响应式饼图

    Pizza Pie Charts 是一个基于 Adobe 的 Snap SVG 框架的响应式饼图插件.它着重于集成 HTML 标记和 CSS,而不是 JavaScript 对象,当然Pizza Pie ...

  8. 移动 Web 开发必备!时尚的 Off Canvas 导航

    这里向大家分享一组创新的 Off Canvas 导航效果.Off Canvas 导航在一些移动应用程序中被广泛使用.当你点击汉堡按钮(一般是三条横线组成)时,在左侧或者右侧拉出一个菜单,这样可以充分利 ...

  9. 设置跨域的iframe的高度

    原因 如下图,A域中有个B域的页面,但是B的页面的长度不确定,A无法去设置一个准确的高度. PS:iframe高度设置auto是无效的 解决办法 如上图, (1)在B页面中加一个A的代理页面的ifra ...

  10. SharePoint 2013 使用 PowerShell 更新用户

    在SharePoint开发中,经常会遇到网站部署,然而,当我们从开发环境,部署到正式环境以后,尤其是备份还原,所有用户组的用户,还依然是开发环境的,这时,我们就需要用PowerShell更新一下: P ...