论坛首页 Java企业应用论坛

如何减少日志记录占用的系统资源

浏览 20129 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-07-23  
百家争鸣,各个有理
0 请登录后投票
   发表时间:2008-07-23  
可以考虑用jms,weblogic server就送的。以前bea集成方案就是基于jms的,可以做到跨业务系统的事务。
不过我认为,自己写个队列+做好异常处理,更简单...
0 请登录后投票
   发表时间:2008-07-23  
你说的可能是审计日志,Log4j完全可以实现你的功能。
Log4j中有专门的MDC,你可以研究研究,关于性能,可以考虑JDBCAppender,可以设置BufferSize的。
johnnylzb 写道

我现在要做的日志组件不同于传统的日志(Log4J、JDK Logging等),这些日志信息不是基于代码级的,而是基于业务级的,所以不存在“级别”(INFO之类)的问题,只要应用程序有需求,就要记录日志。现在问题就在于要保持事务一致的情况下如何降低对应用程序的影响,我曾经做过数据移植程序,发现数据持久化的瓶颈在于写入数据库的时刻,用JDBC向数据库写入一条数据是毫秒级的,如果一次写入1000条以上,对应用程序的影响就比较明显了。

0 请登录后投票
   发表时间:2008-07-23  
我之前的一个解决办法是log4j异步写数据库.开始一次,结束一次(成功或失败).
不过我们不需要非得保证百分之百写进去,只是作为管理员对系统使用情况的一种查看方式.只需要大部分ok就行.我觉得,如果到了机器都崩了的情况,其中所损失的一点日志,一般的系统都可以忽略.
0 请登录后投票
   发表时间:2008-07-24  
Godlikeme 写道
个人认为是在扯淡。
你们公司是做应用的还是做产品的?
做应用有多少个项目?
做产品的有多少个产品?
有搞通用日志组件的必要么?
什么叫日志组件?日志组件都有哪些方面的功能性、非功能性要求?现有的日志解决方案都有哪些,哪些方面不能满足你们的要求?

做这个事情的初衷有没有想清楚,就讨论怎么做了。

为了日志的性能做成分布式还说可以减少应用服务器负担,我觉得lz就是在搞笑。



严重同意!
0 请登录后投票
   发表时间:2008-07-25  
类似的情况,要保证事务性的话太麻烦,我曾经直接在数据库中写日志.定时备份转移或删除就是了.
0 请登录后投票
   发表时间:2008-11-11  
coffeecat 写道
zypro 写道
首先,我们要定义一下,什么叫日志.
我觉得楼上所有的答复,都是作为"通用"日志的解决方案.
我要提醒lz,按照你所说的需求,每个"日志"都要保证记录,并且最好通过数据库事务来保证一旦业务成功提交,日志也提交. 这个描述中的"日志"已经不属于通常意义的系统日志,这个属于业务需求.是业务逻辑的一部分. 如果我是你,我不会把它当成日志来考虑,我会毫不犹豫的象你所说的,把它和其他业务写到同一个事务中. 至于由此引发的额外的系统负担,应该通过其他手段来对整个系统调优.



确实如兄台所说,目前我们项目也写类似的所谓日志,该日志应该是业务逻辑的一部分,实际中除了要记录成功日志,而且还要记录失败日志,因为往往出问题时候是失败的情况,系统管理员需要去查找原因,所以我们是在一个单独的事务中记录。


非常赞同上面两位的说法。lz的概念有点混淆,lz的日志说的业务逻辑的一部分,但是lz却把它当做普通的系统输出,例如,在银行系统中,用户的每一次的取款和存款操作都需要记录日志,这个大家都应该知道这个日志的作用,因为它本身就是业务的一部分,也是事务的一部分,对这样的操作来说,只能放在同步的事务当中。因为无论是记录了日志但是没有完成事务还是没有记录日志但完成了事务都会造成严重的后果,所以这些必须放到同一事务中去。事务的acid特性由数据库管理系统支持,不需要编程人员干预编写。性能问题只能靠高性能的服务器解决。
但是对于一般的日志,比如说记录某个函数被调用,使用JMS肯定时没有问题的。
对于不是特别关键的业务日志,例如记录用户登录,用户操作等日志,使用JMS,网络状况良好,比如服务器和jms服务器在同一局域网中,丢失日志的概率几乎为0.所以lz操心过了!
0 请登录后投票
   发表时间:2008-11-11  
monkig 写道
楼主本来的想法没有错,用JMS,异步来写日志
把日志都写到一个queue,然后另外一个机器或服务来监听这个queue,收下来后完成化,JMS也是有事务的嘛,所以完全可以保证事务性。

我不太清楚楼主所说的JMS Server答复时间是什么意思?你不会是要等完成日志持久化后再发一个JMS消息回来给应用吧!如果是这样的话说明你还没有理解JMS。如果不是这样,那我觉得向JMS Server发一条消息还是很快的呀,人家股票消息传递都用JMS,不知道你用的是哪一个JMS Server。此外,如果真是还是嫌慢的话,那就不要使用持久消息,这样速度会更快,只是如果JMS Server崩溃的话,那些还没有持久化的日志会丢失,不过,一般的JMS Server稳定性还是很高的,大不了再做一个HA

楼主自己的思路是对的,性能的问题最好先去实践一下,如果真有问题,要是我,也是在这个方案的前提下再去解决性能问题,因为从面临的问题来看,这是一个很正确的解决思路,其它方案的问题如下:
1、Cache 无法保证事务性
2、内存数据库  如果是纯内存数据库,一样没办法保证事务性,如果内存数据库本身也要持久化,那不见得比直接写日志快,可以把日志看成是一种特殊的数据库

所以楼主如果能接受JMS Server万一崩溃后的日志丢失,那就用这种方案,如果不行,就还是用持久消息,只是楼主说的慢到不可接受具体慢到什么程度?你们的应用高峰时一秒会产生多少笔日志?你测的JMS Server的吞吐量又是多大,两个一比较才知道行还是不行,差距又有多少。

支持!
0 请登录后投票
   发表时间:2008-11-11  
写日志对服务器来说应该不是问题吧, 专门为日志准备的裸设备

也不用每次都收集, 这样会形成网络风暴的, 先保存在本地的裸设备, 然后一天/一星期合并并分析日志(收集(合并)日志可以找一个服务器不忙的时间段)
0 请登录后投票
   发表时间:2008-11-11  
我想LZ的处理方式大概和我以前做过的一个系统差不多,不知道你们是不是用来做事件审计分析的
我是这样来做的,记录日志用syslog协议把日志发送给syslogServer来处理分析
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics