java解析日志的问题

王者_来归 2015-05-11 08:20:13
如题,整个日志是一个xml,不断的的日志打印,里面有data节点,data节点下在rec节点,每打印一次日志,增加一对rec节点,整个日志还是一个xml,只是一直在日志中</data>节点之前增加新的rec节点。现在我要解析这个日志,把rec中的内容解析出来,解析按1分钟执行一次,每次从上一次结束的位置开始。
请教各位,有什么好的方案?
谢谢!
...全文
354 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
王者_来归 2015-06-23
  • 打赏
  • 举报
回复
运行了一个多月了,没有发现问题,确实会出现读到不完整的一个xml的情况。其实这种也正常,日志打印,虽然也是一个个xml追加,但是有一个IO操作过程,所以我读到不完整的情况也很正常。
zapdos 2015-05-28
  • 打赏
  • 举报
回复
引用 9 楼 sen_linzhiwang 的回复:
一个进程在写日志,另外一个进程在读,你能保证每次读到的都是完整的? 不过我已经解决,就是每次读的时候,根据xml的特点,读到一个完整的xml才解析,如果读不到一个完整的xml,就把当前的最后一个字节减去不完整的xml的字节保存起来当作下一周期的开始读位置。已经运行半个月了,没有问题。
引用 8 楼 zapdos 的回复:
不知你咋写入的,还能写到一半?那还是XML吗?如果不是XML,那就记录OFFSET得了,如果后面解析失败的就在当前位置继续解析;如果确保是XML,那就用SAX
我本来就是这个意思,你看清楚再说
  • 打赏
  • 举报
回复
引用 9 楼 sen_linzhiwang 的回复:
一个进程在写日志,另外一个进程在读,你能保证每次读到的都是完整的? 不过我已经解决,就是每次读的时候,根据xml的特点,读到一个完整的xml才解析,如果读不到一个完整的xml,就把当前的最后一个字节减去不完整的xml的字节保存起来当作下一周期的开始读位置。已经运行半个月了,没有问题。
引用 8 楼 zapdos 的回复:
不知你咋写入的,还能写到一半?那还是XML吗?如果不是XML,那就记录OFFSET得了,如果后面解析失败的就在当前位置继续解析;如果确保是XML,那就用SAX
解决思路还是很清晰的,其实联系实际情况也应该是这样,不完整的节点,本来也没办法解析,所以肯定是到每个完整的解析才解析并且做标记。
王者_来归 2015-05-27
  • 打赏
  • 举报
回复
一个进程在写日志,另外一个进程在读,你能保证每次读到的都是完整的? 不过我已经解决,就是每次读的时候,根据xml的特点,读到一个完整的xml才解析,如果读不到一个完整的xml,就把当前的最后一个字节减去不完整的xml的字节保存起来当作下一周期的开始读位置。已经运行半个月了,没有问题。
引用 8 楼 zapdos 的回复:
不知你咋写入的,还能写到一半?那还是XML吗?如果不是XML,那就记录OFFSET得了,如果后面解析失败的就在当前位置继续解析;如果确保是XML,那就用SAX
zapdos 2015-05-13
  • 打赏
  • 举报
回复
不知你咋写入的,还能写到一半?那还是XML吗?如果不是XML,那就记录OFFSET得了,如果后面解析失败的就在当前位置继续解析;如果确保是XML,那就用SAX
王者_来归 2015-05-12
  • 打赏
  • 举报
回复
已经按我的老办法解决。
王者_来归 2015-05-12
  • 打赏
  • 举报
回复
引用 5 楼 baohuan_love 的回复:
解析到哪个位置,可以用特殊符号做个标记,以便于下次遍历,找到特殊符号,直接从后边解析。
这个是自然的,但是有一个问题,如果获取到的数据中,最后一个rec节点日志还没有打印完成,比如只打印了一半,那就得不到完整的一个res节点了,问题是如何把这不完整的一段去除,然后把标记标到上一上一次完整的末尾。有什么好的办法? 谢谢
  • 打赏
  • 举报
回复
解析到哪个位置,可以用特殊符号做个标记,以便于下次遍历,找到特殊符号,直接从后边解析。
王者_来归 2015-05-11
  • 打赏
  • 举报
回复
每天做一次分析,又做不到实时,就是通过分析日志来发现问题,如果是一天一次,这样是方便了,但是无法实时知道相关情况。
Chengyajie521 2015-05-11
  • 打赏
  • 举报
回复
每天做一次分割,只分析当天的吧。似乎做不到增量分析
王者_来归 2015-05-11
  • 打赏
  • 举报
回复
生成日志的不是自己写的,要是自己写的,就用不着这么做了
Chengyajie521 2015-05-11
  • 打赏
  • 举报
回复
生成日志的是第三方的还是自己写的?
《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载Android源代码 1.3.2 编译Android源代码 1.3.3 运行Android模拟器 1.4 下载、编译和运行Android内核源代码 1.4.1 下载Android内核源代码 1.4.2 编译Android内核源代码 1.4.3 运行Android模拟器 1.5 开发第一个Android应用程序 1.6 单独编译和打包Android应用程序模块 1.6.1 导入单独编译模块的mmm命令 1.6.2 单独编译Android应用程序模块 1.6.3 重新打包Android系统镜像文件 第2章 硬件抽象层 2.1 开发Android硬件驱动程序 2.1.1 实现内核驱动程序模块 2.1.2 修改内核Kconfig文件 2.1.3 修改内核Makefile文件 2.1.4 编译内核驱动程序模块 2.1.5 验证内核驱动程序模块 2.2 开发C可执行程序验证Android硬件驱动程序 2.3 开发Android硬件抽象层模块 2.3.1 硬件抽象层模块编写规范 2.3.2 编写硬件抽象层模块接口 2.3.3 硬件抽象层模块的加载过程 2.3.4 处理硬件设备访问权限问题 2.4 开发Android硬件访问服务 2.4.1 定义硬件访问服务接口 2.4.2 实现硬件访问服务 2.4.3 实现硬件访问服务的JNI方法 2.4.4 启动硬件访问服务 2.5 开发Android应用程序来使用硬件访问服务 第3章 智能指针 3.1 轻量级指针 3.1.1 实现原理分析 3.1.2 应用实例分析 3.2 强指针和弱指针 3.2.1 强指针的实现原理分析 3.2.2 弱指针的实现原理分析 3.2.3 应用实例分析 第2篇 Android专用驱动系统 第4章 Logger日志系统 4.1 Logger日志格式 4.2 Logger日志驱动程序 4.2.1 基础数据结构 4.2.2 日志设备的初始化过程 4.2.3 日志设备文件的打开过程 4.2.4 日志记录的读取过程 4.2.5 日志记录的写入过程 4.3 运行时库层日志库 4.4 C/C++日志写入接口 4.5 Java日志写入接口 4.6 Logcat工具分析 4.6.1 相关数据结构 4.6.2 初始化过程 4.6.3 日志记录的读取过程 4.6.4 日志记录的输出过程 第5章 Binder进程间通信系统 5.1 Binder驱动程序 5.1.1 基础数据结构 5.1.2 Binder设备的初始化过程 5.1.3 Binder设备文件的打开过程 5.1.4 Binder设备文件的内存映射过程 5.1.5 内核缓冲区管理 5.2 Binder进程间通信库 5.3 Binder进程间通信应用实例 5.4 Binder对象引用计数技术 5.4.1 Binder本地对象的生命周期 5.4.2 Binder实体对象的生命周期 5.4.3 Binder引用对象的生命周期 5.4.4 Binder代理对象的生命周期 5.5 Binder对象死亡通知机制 5.5.1 注册死亡接收通知 5.5.2 发送死亡接收通知 5.5.3 注销死亡接收通知 5.6 Service Manager的启动过程 5.6.1 打开和映射Binder设备文件 5.6.2 注册为Binder上下文管理者 5.6.3 循环等待Client进程请求 5.7 Service Manager代理对象的获取过程 5.8 Service组件的启动过程 5.8.1 注册Service组件 5.8.2 启动Binder线程池 5.9 Service代理对象的获取过程 5.10 Binder进程间通信机制的Java接口 5.10.1 Service Manager的Java代理对象的获取过程 5.10.2 Java服务接口的定义和解析 5.10.3 Java服务的启动过程 5.10.4 Java服务代理对象的获取过程 5.10.5 Java服务的调用过程 第6章 Ashmem匿名共享内存系统 6.1 Ashmem驱动程序 6.1.1 基础数据结构 6.1.2 匿名共享内存设备的初始化过程 6.1.3 匿名共享内存设备文件的打开过程 6.1.4 匿名共享内存设备文件的内存映射过程 6.1.5 匿名共享内存块的锁定和解锁过程 6.1.6 匿名共享内存块的回收过程 6.2 运行时库cutils的匿名共享内存访问接口 6.3 匿名共享内存的C++访问接口 6.3.1 MemoryHeapBase 6.3.2 MemoryBase 6.3.3 应用实例 6.4 匿名共享内存的Java访问接口 6.4.1 MemoryFile 6.4.2 应用实例 6.5 匿名共享内存的共享原理 第3篇 Android应用程序框架 第7章 Activity组件的启动过程 7.1 Activity组件应用实例 7.2 根Activity组件的启动过程 7.3 子Activity组件在进程内的启动过程 7.4 子Activity组件在新进程中的启动过程 第8章 Service组件的启动过程 8.1 Service组件应用实例 8.2 Service组件在新进程中的启动过程 8.3 Service组件在进程内的绑定过程 第9章 Android系统广播机制 9.1 广播机制应用实例 9.2 广播接收者的注册过程 9.3 广播的发送过程 第10章 Content Provider组件的实现原理 10.1 Content Provider组件应用实例 10.1.1 ArticlesProvider 10.1.2 Article 10.2 Content Provider组件的启动过程 10.3 Content Provider组件的数据共享原理 10.3.1 数据共享模型 10.3.2 数据传输过程 10.4 Content Provider组件的数据更新通知机制 10.4.1 注册内容观察者 10.4.2 发送数据更新通知 第11章 Zygote和System进程的启动过程 11.1 Zygote进程的启动脚本 11.2 Zygote进程的启动过程 11.3 System进程的启动过程 第12章 Android应用程序进程的启动过程 12.1 应用程序进程的创建过程 12.2 Binder线程池的启动过程 12.3 消息循环的创建过程 第13章 Android应用程序的消息处理机制 13.1 创建线程消息队列 13.2 线程消息循环过程 13.3 线程消息发送过程 13.4 线程消息处理过程 第14章 Android应用程序的键盘消息处理机制 14.1 键盘消息处理模型 14.2 InputManager的启动过程 14.2.1 创建InputManager 14.2.2 启动InputManager 14.2.3 启动InputDispatcher 14.2.4 启动InputReader 14.3 InputChannel的注册过程 14.3.1 创建InputChannel 14.3.2 注册Server端InputChannel 14.3.3 注册系统当前激活的应用程序窗口 14.3.4 注册Client端InputChannel 14.4 键盘消息的分发过程 14.4.1 InputReader获得键盘事件 14.4.2 InputDispatcher分发键盘事件 14.4.3 系统当前激活的应用程序窗口获得键盘消息 14.4.4 InputDispatcher获得键盘事件处理完成通知 14.5 InputChannel的注销过程 14.5.1 销毁应用程序窗口 14.5.2 注销Client端InputChannel 14.5.3 注销Server端InputChannel 第15章 Android应用程序线程的消息循环模型 15.1 应用程序主线程消息循环模型 15.2 与界面无关的应用程序子线程消息循环模型 15.3 与界面相关的应用程序子线程消息循环模型 第16章 Android应用程序的安装和显示过程 16.1 应用程序的安装过程 16.2 应用程序的显示过程

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧