免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8155 | 回复: 13
打印 上一主题 下一主题

每分钟生成一个日志文件?谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-01 06:04 |只看该作者 |倒序浏览
c写的一个服务, 每分钟大概有10万条日志。多个进程会同时向日志文件写日志。
日志文件名的的格式:2010-11-29-15-33.log
我的目的是希望所有的log都计入在相应的日志文件中。
比如, 在15点33分内的日志, 全部在文件2010-11-29-15-33.log中。

我现在的想法是:
  1. static int write_log(const char *msg) {
  2.        FILE *gp_log = NULL;
  3.         char file_name[64] = "";
  4.         time_t rawtime;
  5.         struct tm timeinfo;
  6.         time(&rawtime);

  7.         if ( localtime_r(&rawtime, &timeinfo) != NULL ) {
  8.                 //file name format:2010-11-30_15-33.log
  9.                 sprintf(file_name, "%04d-%02d-%02d_%02d-%02d.log", timeinfo.tm_year+1900, timeinfo.tm_mon+1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min);
  10.         }

  11.          gp_log = fopen(file_name, "a+");
  12.          fprintf(gp_log, "%s", msg );
  13.   
  14.          fclose(gp_log);

  15.         return 0;
  16. }
复制代码
这个非常没效率:  每写一条日志都要打开文件, 写了之后又要关闭文件。


请问各位有什么好办法?
我甚至不知道如何预先整点生成日志文件. 用定时器不是整点的。


(单独写一个日志服务器就算了。时间有点紧。)

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-12-01 08:59 |只看该作者
记录上次日志的时间,与本次比较,同一分,继续用原来的文件,不同分,关闭原先的再打开新的

论坛徽章:
0
3 [报告]
发表于 2010-12-01 10:05 |只看该作者
看看这样行不行:
1 开一块共享内存。
2 服务不停的将日志写入这块内存。
3 开一个新的进程,定时读共享内存,并将它们按规则写入文件。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-12-01 10:36 |只看该作者
错误的设计。

论坛徽章:
0
5 [报告]
发表于 2010-12-01 10:54 |只看该作者
是多线程还是多进程?
如果是多线程的话,那就共享一个log句柄,多线程写,有一个 log_open_time = time(0); 记录打开的时间,如果超时(一分钟)锁定,关旧log,添加模式开新的log,解锁,多线程write log msg。
多进程的话也是类似的,没个线程都维护一个 a+ 打开的句柄,每次比较时间,然后超时关闭和新开log。因为a+打开是原子写不会产生竞争。

论坛徽章:
0
6 [报告]
发表于 2010-12-01 10:58 |只看该作者
lz 在gp工作?green packet?

论坛徽章:
0
7 [报告]
发表于 2010-12-01 11:39 |只看该作者
错误的设计。
flw 发表于 2010-12-01 10:36


我知道这个设计很差.原来的想法是要么开一块大内存做日志的缓冲, 定时dump到文件中.   要么另外起一个日志进程, 主进程把日志用消息发给日志进程, 有日志进程来负责写入文件.


不过现在没时间了. 所以想请教有没有效率过的去实现起来快的方式.


多谢.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2010-12-01 11:48 |只看该作者
实现起来快的方法就是,什么也不做,把文件切割成按分钟的工作由外部程序进行。

论坛徽章:
0
9 [报告]
发表于 2010-12-01 11:51 |只看该作者
ls说的不错~~单独写个进程重新划分整理log

论坛徽章:
0
10 [报告]
发表于 2010-12-01 12:02 |只看该作者
实现起来快的方法就是,什么也不做,把文件切割成按分钟的工作由外部程序进行。
flw 发表于 2010-12-01 11:48




谢谢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP