免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: linuxiang
打印 上一主题 下一主题

多个进程把日志记录在同一个文件的问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-08-08 09:42 |只看该作者
原帖由 JohnBull 于 2006-8-7 13:22 发表


简单、安全、干净。正解!

参考syslog的设计。

agree.

论坛徽章:
0
32 [报告]
发表于 2006-08-08 09:59 |只看该作者
每个进程配一个日志文件不好嘛?干吗非要多个进程公用一个日志文件?

论坛徽章:
0
33 [报告]
发表于 2006-08-08 10:28 |只看该作者
原帖由 henngy 于 2006-8-8 09:59 发表
每个进程配一个日志文件不好嘛?干吗非要多个进程公用一个日志文件?


看看自己的系统,是不是有很多httpd子进程或ftp子进程?他们能分开写吗?

论坛徽章:
0
34 [报告]
发表于 2006-08-08 11:13 |只看该作者
我的做法是加文件锁。具体代码如下:


  1. #include <stdarg.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <time.h>
  5. #include <errno.h>
  6. #include <dirent.h>

  7. #define  MAXARGS     31

  8. void SDKerrlog( const char *errfile, const char *arglist, ... )
  9. {
  10.         FILE *fp;
  11.         int fd;
  12.         char path[PATH_MAX];
  13.         va_list args;
  14.        
  15.         sprintf( path, "%s/log/%s", (char *)getenv("HOME"), errfile );

  16.         if( (fp = fopen(path, "a")) == NULL ) {
  17.                 fprintf(stderr, "无法打开出错日志文件[%s] %s\n",
  18.                         path, strerror(errno) );
  19.                 /*return;*/
  20.                 fp=stderr;
  21.         }

  22.         fd = fileno(fp);
  23.         lockf(fd, F_LOCK, 0l);

  24.         fprintf( fp, "[%08ld:%06ld] ", current_date(), current_time() );
  25.         va_start( args, arglist );
  26.         vfprintf( fp, arglist, args );
  27.         va_end( args );
  28.         fprintf( fp, "\n" );

  29.         lockf(fd, F_ULOCK, 0l);
  30.         if( fp==stderr )
  31.                 return;

  32.         fclose(fp);
  33. }
复制代码


current_date(), current_time() 是两个自定义输出日期和时间的函数。

这段代码就是wenlq所说的那个程序。至于I/O的问题,我认为在交易系统中这部分操作对性能的影响基本可以忽略。仔细分析一下的话,在OLTP系统中绝大部分I/O是被数据库占用了,而不是写日志。

论坛徽章:
0
35 [报告]
发表于 2006-08-08 11:23 |只看该作者
原帖由 sunlan 于 2006-8-8 11:13 发表
我的做法是加文件锁。具体代码如下:

[code]
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include <dirent ...


提个建议,log的文件描述符应该是全局的,否则chroot过的子进程调用你的函数,就不正确了

论坛徽章:
0
36 [报告]
发表于 2006-08-08 11:37 |只看该作者
lockf根本没有必要。
如果多个进程在LOG,lockf还可能影响性能。

论坛徽章:
0
37 [报告]
发表于 2006-08-08 11:51 |只看该作者
原帖由 思一克 于 2006-8-8 11:37 发表
lockf根本没有必要。
如果多个进程在LOG,lockf还可能影响性能。


lockf并非没必要。不同的系统的底层实现是不一样的,在SCO下曾经发生过不加锁而导致日志被写乱的情况

论坛徽章:
0
38 [报告]
发表于 2006-08-08 11:56 |只看该作者
没有SCO的经验。不过从道理上可以并且应该不LOCK的情况,就尽量不要使用。因为他影响性能。

论坛徽章:
0
39 [报告]
发表于 2006-08-08 12:19 |只看该作者
你这个LOG很影响性能,在多进程同时的情况下。一个进程会停止下来等待LOCK。

论坛徽章:
0
40 [报告]
发表于 2006-08-08 12:23 |只看该作者
生产用的程序里日志数量是受限的,不可能老写日志。而且每次写的日志很少,实际环境下很少有冲突的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP