- 浏览: 92164 次
- 性别:
- 来自: 北京
最新评论
-
xiangzihehao:
非常感谢~
JFreechart V1.0.9 Guide(英文版) -
minn84:
...
一个老程序员的忠告:不要一辈子靠技术生存 -
小斌江:
非常非常非常的感谢楼主。。。
JFreechart V1.0.9 Guide(英文版) -
yutian8888:
谢谢你老兄!我找了很久,在你这里得到的解决!!
Java web 根据url下载文件IE出错,FF正常 -
liuwenbo200285:
学习了,面试的时候经常问这个问题,估计有的面试官也不知道如果不 ...
StringBuilder StringBuffer and "+"
这是一个商用的项目,是给XX证券用的.其实现的功能是,将各个服务器上的日志文件下载(通过FTP或SFTP的方式),然后按照给定的日志格式分析并导入到DB中存储起来,然后再用WEB界面实现一个和用户交互的查询.
日志一天只要导入一次就可以的,从该平台的稳定性来考虑,用到了数据库的存储过程,用程序也是可以实现的,不过用数据库更稳定一些.所以该平台采用了sqlserver2005的存储过程.
WEB界面展示的数据是用图形显示的,所以引用了大名鼎鼎的jfreechart来作图表展现.
1 日志文件的存储格式(采用CSV无列头,以comma分隔,\n\r结束为一条日志记录的方式)
2 日志文件的下载(将ftp或sftp的参数配置在xml文件),然后写成定时任务(由于日志是按天生成的,所以定时任务也是一天执行一次)
3 日志下载完成以后就是解析了,然后就将数据批量导入到数据库中存储起来.
4 写数据库存储过程,将原始数据处理
5 写web界面的查询,数据显示以图表展现(JFreechart)
以上就是分的模块.
日志文件格式还包括日志文件名,但为了灵活使用,我们将日志文件名在配置文件中实现,假设我们有三种格式的日志文件要下载--下载日志,交易日志,行情日志.然后我们可以在配置文件中配置日志的名字,以及日志名字中的日期的格式,以及日志文件内容的字段,见一代码片段:
我详细解释一下以上配置文件中每一个细节:
task name是给任务取的名字,用来区分多个任务的,csvreader是读取该文件的类,executetime是该定时任务执行的时间
sql这段是批量导入数据库时用到的insert sql语句,maxCommitNumber是批量导入时的最大commit数,table中的csvindex就是指明该字段在表中的位置.遇到日期这样的我们要规定一下日期的表现形式,如yyyyMMddHHmmss.这个格式其实是指明了日志文件中该字段的日期表现形式,而导入数据库时用的是timestamp的形式.这里要注意的是该表的字段和下面table中的都是一致的,这里所有的顺序还和日志文件中内容相一致,这就实现了最大化的定制性(customize),假设另一个日志文件内容为downloadtime,ipaddress,mobilefac,filename,哪我们就可以将以上内容分别替换为
datasource就是配置的ftp或sftp的连接,端口及路径的参数了,如果有多个ftp下载,照上面一datasource copy一个,并列即可,我们的处理xml的xmlManager会将多个ftp下载源读出来的.
filepath就是将远程日志下载以后存放的路径,如果有多个ftp下载我们可以用ftp的ip作为文件名的前缀然后再加文件名来区分不同ftp来源的日志文件.
看,就这一小段配置文件就把我们上面所说的定时任务,日志文件格式,数据库字段,批量导入时的最大commit数全部解决了.
这里面我们平台在运行过程中发生的问题就是多线程读取日志文件到库中时,产生了一些问题,后来更正了.由于每个日志文件的规则不同,所以我们实现的csvreader就不同,所以我们提供csvreader,具体实现由您自己扩展.该平台中由于只有交易日志和其他两个日志规则不同,所以我们只实现了两个reader.
如有疑问,请在后面留言.
下面我们来看定时任务.
start里的遍历就是查找有几个task,如果有多个就会循环运行,下篇文章我们来讲ImportTask,即批导入的任务
日志一天只要导入一次就可以的,从该平台的稳定性来考虑,用到了数据库的存储过程,用程序也是可以实现的,不过用数据库更稳定一些.所以该平台采用了sqlserver2005的存储过程.
WEB界面展示的数据是用图形显示的,所以引用了大名鼎鼎的jfreechart来作图表展现.
1 日志文件的存储格式(采用CSV无列头,以comma分隔,\n\r结束为一条日志记录的方式)
2 日志文件的下载(将ftp或sftp的参数配置在xml文件),然后写成定时任务(由于日志是按天生成的,所以定时任务也是一天执行一次)
3 日志下载完成以后就是解析了,然后就将数据批量导入到数据库中存储起来.
4 写数据库存储过程,将原始数据处理
5 写web界面的查询,数据显示以图表展现(JFreechart)
以上就是分的模块.
日志文件格式还包括日志文件名,但为了灵活使用,我们将日志文件名在配置文件中实现,假设我们有三种格式的日志文件要下载--下载日志,交易日志,行情日志.然后我们可以在配置文件中配置日志的名字,以及日志名字中的日期的格式,以及日志文件内容的字段,见一代码片段:
<?xml version="1.0" encoding="gbk"?> <dataconfig> <task name="quote" csvReader="这里填写该任务的读取实现类" excutetime="02:00:00"> <!-- 批量导入数据库的SQL语句及一次批量插入最多的记录条数--> <sql insert="insert into quotelogs (visittime,ipaddress,pageviews) values(?,?,?)" maxCommitNumber="100"/> <table name="quotelogs"> <column name="visittime" type="datetime" format="yyyyMMdd HHmmss" csvindex="0" /> <column name="ipaddress" type="string" csvindex="1" /> <column name="pageviews" type="int" csvindex="2" /> </table> <!-- fileMaxSize是以M为单位的,此处200是指200M即 200*1024*1024 --> <datasource server="192.168.10.21" port="21" username="ftptest" password="ftptest!@#" fileMaxSize="200" fileName="accessquote.log.{yyyyMMdd}" initPath="/home/ftptest/" /> <!-- 存放下载日志的路径--> <filePath path="F:/Logs/" /> </task> <task>......</task> <task>......</task> </dataconfig>
我详细解释一下以上配置文件中每一个细节:
task name是给任务取的名字,用来区分多个任务的,csvreader是读取该文件的类,executetime是该定时任务执行的时间
sql这段是批量导入数据库时用到的insert sql语句,maxCommitNumber是批量导入时的最大commit数,table中的csvindex就是指明该字段在表中的位置.遇到日期这样的我们要规定一下日期的表现形式,如yyyyMMddHHmmss.这个格式其实是指明了日志文件中该字段的日期表现形式,而导入数据库时用的是timestamp的形式.这里要注意的是该表的字段和下面table中的都是一致的,这里所有的顺序还和日志文件中内容相一致,这就实现了最大化的定制性(customize),假设另一个日志文件内容为downloadtime,ipaddress,mobilefac,filename,哪我们就可以将以上内容分别替换为
<sql insert="insert into downloadlogs (downloadtime,ipaddress,mobilefac,filename) values (?,?,?,?)" maxCommitNumber="100" /> <table name="downloadlogs"> <column name="downloadtime" type="datetime" format="yyyyMMddHHmmss" csvindex="0" /> <column name="ipaddress" type="string" csvindex="1" /> <column name="mobilefac" type="string" csvindex="2" /> <column name="filename" type="string" csvindex="3" /> </table>
datasource就是配置的ftp或sftp的连接,端口及路径的参数了,如果有多个ftp下载,照上面一datasource copy一个,并列即可,我们的处理xml的xmlManager会将多个ftp下载源读出来的.
filepath就是将远程日志下载以后存放的路径,如果有多个ftp下载我们可以用ftp的ip作为文件名的前缀然后再加文件名来区分不同ftp来源的日志文件.
看,就这一小段配置文件就把我们上面所说的定时任务,日志文件格式,数据库字段,批量导入时的最大commit数全部解决了.
这里面我们平台在运行过程中发生的问题就是多线程读取日志文件到库中时,产生了一些问题,后来更正了.由于每个日志文件的规则不同,所以我们实现的csvreader就不同,所以我们提供csvreader,具体实现由您自己扩展.该平台中由于只有交易日志和其他两个日志规则不同,所以我们只实现了两个reader.
如有疑问,请在后面留言.
下面我们来看定时任务.
public class SchedulerEngine { Logger logger = LoggerFactory.getLogger(SchedulerEngine.class); private Document doc; // 定时执行调度类,来定时调度 private ScheduledExecutorService schuledExecutor; // 所有定时任务的Future private Map<String, Future<?>> futureMap = new Hashtable<String, Future<?>>(); /** path配置文件的路径 . */ final static String confpath = "/conf/dataconfig.xml"; public void init() { try { URL url = getClass().getResource(confpath); //URLDecoder.decode不懂的查API FileInputStream fis = new FileInputStream(URLDecoder.decode(url .getFile(), "UTF-8")); byte[] buf = new byte[fis.available()]; fis.read(buf); String strXml = new String(buf, "GBK"); doc = XmlManager.createDomByString(strXml); } catch (Exception e) { logger.error(e.toString(), e); } } public void start() throws Exception { try { schuledExecutor = Executors.newScheduledThreadPool(3); NodeList tnl = XmlManager.queryList("/dataconfig/task", doc); for (int i = 0; i < tnl.getLength(); i++) { Element ele = (Element) tnl.item(i); String name = ele.getAttribute("name"); String schtime = ele.getAttribute("excutetime"); long curTime = System.currentTimeMillis(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String tmpstr = df.format(new Date(curTime)); String tmpstr2 = tmpstr.substring(0, 11) + schtime; long executeTime = df.parse(tmpstr2).getTime(); long ONEDAY = 24 * 60 * 60 * 1000; // 启动定时task任务 long delay = executeTime - curTime < 0 ? (executeTime - curTime + ONEDAY) : (executeTime - curTime); // delay = 0; // 调度服务监控代码 ImportTask task = new ImportTask(ele); Future<?> future = schuledExecutor.scheduleAtFixedRate(task, delay, ONEDAY, TimeUnit.MILLISECONDS); futureMap.put(name, future); } } catch (Exception ex) { logger.error(ex.toString(), ex); throw new Exception(ex); } } public void reload() throws Exception { stop(); start(); } public void stop() { schuledExecutor.shutdown(); for (Future<?> fu : futureMap.values()) { fu.cancel(true); } futureMap.clear(); } }
start里的遍历就是查找有几个task,如果有多个就会循环运行,下篇文章我们来讲ImportTask,即批导入的任务
发表评论
-
last year log statistics source code download
2009-07-31 16:48 885只提供两天下载,下周一就失效!! -
学习Apache Mina
2009-05-12 14:50 1748Mina的几个重要接口: I ... -
JFreechart V1.0.9 Guide(英文版)
2008-12-31 09:48 3265本人在0day上发现了JFreechart V1.0.9的Gu ... -
Java web 根据url下载文件IE出错,FF正常
2008-12-26 12:39 1924本人在web开发中,导出csv文件时遇到这一问题的,如下 当用 ... -
日志统计平台3之Jfreechart显示篇
2008-12-19 16:15 1571jfreechart功能十分强大了,在我们平台中用到了柱图和曲 ... -
日志统计平台2
2008-12-19 15:41 1378ImportTask里面我们就实现了ftp下载日志文件,然后批 ... -
(随时添加更新)本人code中积累或总结
2008-11-25 09:43 12621 一定要注意资源使用以后要释放,比如数据库的连接,流的使用, ... -
StringBuilder StringBuffer and "+"
2008-10-16 17:20 2074String字符串是Java中最常用的数据结构. " ... -
再用Maven2
2008-09-24 16:35 1604上次用Maven只是别人搭建好的工程,我们使用,今天项目不多, ... -
今天公司培训Scrum有感
2008-09-23 22:24 2613据说Scrum是一种敏捷的灵活的软件管理过程.你可以用它来迭代 ... -
定时执行调度任务
2008-07-21 15:36 2221这里我们用JDK 5.0里的ScheduledExecutor ... -
jdbc 分页
2008-07-20 00:34 3024在网上看了好多的分页程序,有好多hibernate的或是jdb ... -
IntrospectorCleanupListener 简介
2008-05-22 19:12 3482org.springframework.web.util.In ... -
java 读取dbf文件
2008-04-11 13:52 6159先来定义dbf文件的格式,先来定义dbfheader,impo ... -
*.sql的导入与导出
2008-01-24 09:49 984导出:x:\mysql\bin\mysqldump --dat ... -
java程序打开指定的网址
2008-01-24 09:43 16172007-04-19 13:57:42 import j ... -
tomcat5.0.*迁移Tomcat5.5.*的问题:jsp页面显示空白
2008-01-24 09:39 32422007-05-09 12:51:19 本机环境:Win ... -
在Tomcat中添加支持3GP/MP4格式文件的下载
2008-01-24 09:37 13765近日在工作中遇到3gp和mp4格式的文件问题。我用Nokia3 ... -
MySQL常用命令
2008-01-24 09:35 11362007-06-13 20:37:22 1.连接M ... -
Core Java:java除法中保持小数点位数的两种方法
2008-01-24 09:31 6400Method One: (double)(Mat ...
相关推荐
在2008年,日志统计平台主要负责收集和处理各种系统的运行日志,这些日志包含了丰富的系统运行状态和用户行为信息。然而,当时的平台存在诸多问题,如需求响应周期长,运维成本高,运行速度慢,这不仅限制了工作效率...
2008年,日志统计平台的出现是这个过程的起点。这些平台主要用于收集和处理来自各种系统的日志数据,以获取运营和性能指标。然而,这样的系统存在一些明显的局限性,比如需求响应周期长,运维成本高,运行速度慢,...
日志计算平台则涉及对收集到的日志数据进行深度加工和分析,如实时处理、存储和统计等。这部分内容在文档中没有详细的介绍,但可以推测,唯品会的日志计算平台可能包含了数据仓库、数据分析引擎等组件。数据可视化...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学...企业级电商网站的大数据统计分析平台源码+项目说明(以 Spark 框架为核心,对电商网站的日志进行离线和实时分析)...
在现代大数据处理领域,Java、Kafka、Spark和HBase是四大关键组件,它们共同构建了一个高效、实时的日志统计分析系统。这个系统利用这些工具的特性,实现了从数据采集到处理再到存储的完整流程。 首先,Kafka是...
### 唯品会日志平台架构介绍 #### 唯品会简介 唯品会是一家专注于特卖的电商平台,自2012年3月23日在纽约证券交易所上市以来,凭借其独特的商业模式和高效的运营策略,在电商领域取得了显著的成绩,并成为少数实现...
通过安装日志易Agent,可以方便地采集本地系统的日志数据,并将其传输到日志易平台进行处理。 2. **rsyslog Agent**:这种方式适用于已经使用rsyslog5.8.0或更高版本的环境。用户需要拥有sudo权限,并通过配置...
在当前数字化转型深入发展的背景下,企业对于日志数据平台的需求日益增大,尤其是高并发、大规模、多维度的数据处理与分析能力。本资料中提到的“于俊大规模日志数据平台架构面临的问题与挑战”主要涉及到了大规模...
该平台可以对大量分散设备的异构日志进行统一管理、集中存储、统计分析、快速查询,并提供真正可靠的事件追责依据和业务运行的深度安全。 云智综合日志审计平台的核心特点包括: 1. 多类型数据采集:支持多种网络...
《基于Spark Streaming、Kafka与HBase的日志统计分析系统详解》 在现代大数据处理领域,实时数据分析成为了不可或缺的一部分。为了实现高效的日志统计分析,技术栈通常会结合多个组件,如Spark Streaming、Kafka...
3. **统计和报告**:生成统计图表和报告,展示日志信息的分布、趋势和异常情况。 4. **报警和通知**:当发现潜在问题或达到预设阈值时,发送报警通知。 5. **日志聚合**:对来自多个源的日志进行整合和分析,以全局...
### 人人网数据服务平台:基于日志分析的数据系统架构 #### 背景与挑战 在互联网行业,数据成为驱动业务发展的核心力量。人人网,作为中国早期的社交网络服务提供商,面临着海量用户数据的管理和分析挑战。传统的...
该平台具备高性能日志采集能力,提供了强大的分析功能,能够对大量分散设备的异构日志进行统一管理、集中存储、统计分析和快速查询。 平台特点: 1. 多类型数据采集支持:支持多种网络设备、安全设备、漏扫设备、...
【Web服务器日志统计分析完全解决方案】 Web服务器日志统计分析是互联网服务提供商(ICP)和网站管理员不可或缺的一项工作,旨在了解网站的运行状态、访问量和用户行为。通过对Web服务器日志文件的深入分析,可以...