贡献一下自己写的写日志程序

hu7324829 2012-01-05 01:55:06

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAX 128

int log_level;
void info(FILE *file, const char *format, ...);
void init_logger(struct stat *s, FILE **f, const char *path, int level);

int main(int argc, char *argv[]){
FILE *f;
struct stat s;
init_logger(&s, &f, "log", 4);
info(f, "hello %s, year %d", "huzilong", 2012);
return 0;
}

void init_logger(struct stat *s, FILE **f, const char *path, int level){//深度传形参f, f是一个临时指针变量
char temp[128] = {0};
time_t timer;
struct tm *now;
log_level = level;
time(&timer);
now = localtime(&timer);
sprintf(temp, "%s/%d%d%d.log", path, now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);
if(-1 == stat(path, s)){
puts("[warn]文件夹不存在");
mkdir(path, 777);
}

if(!(*f = fopen(temp, "a+"))){
puts("[error]open log file failed");
exit(-1);
}
}

void info(FILE *file, const char *format, ...){
int i, d;
unsigned int u;
void *p;
char c, *s, src[MAX] = {'\0'};//顺序遍历format
va_list argp = NULL;
va_start(argp, format);
for(i = 0; i < strlen(format) + 1; i++){
if(format[i] == '%'){
switch(format[i + 1]){
case 'd':
d = va_arg(argp, int);
sprintf(src, "%s%d", src, d);
i = i + 1;
break;
case 'c':
c = (char)va_arg(argp, int);
sprintf(src, "%s%c", src, c);
i = i + 1;
break;
case 's':
s = va_arg(argp, char *);
sprintf(src, "%s%s", src, s);
i = i + 1;
break;
case 'u':
u = va_arg(argp, unsigned int);
sprintf(src, "%s%u", src, u);
i = i + 1;
break;
case 'p':
p = va_arg(argp, void *);
sprintf(src, "%s%p", src, p);
i = i + 1;
break;
default:
break;
}
++format;
}else if('\0' == format[i]){
va_end(argp);
break;
}else{
sprintf(src, "%s%c", src, format[i]);
}
}
switch(log_level){
case 8:
case 4:
case 2:
case 1:
fputs(src, file);
fputs("\r\n", file);//Linux回车换行 \r\n
fflush(file);
default:
break;
}


有意见提啊。环境Red Hat 4.1.2-46, gcc version 4.1.2
...全文
7247 73 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
73 条回复
切换为时间正序
请发表友善的回复…
发表回复
wodemimihuayuan 2012-01-30
  • 打赏
  • 举报
回复
UNIX环境下用
kingmax54212008 2012-01-27
  • 打赏
  • 举报
回复
还有现成的比较成熟的比较好。功能也比较多。
比如,log4cpp,log4c
MSOKD 2012-01-24
  • 打赏
  • 举报
回复
期待楼主继续完善功能更强大的
gangban_lau 2012-01-20
  • 打赏
  • 举报
回复
PK 的那个代码,也有些疑惑
1, 为什么每次打开文件?效率都是问题
2, 加了简单的锁定,但是这个锁有点大,没必要加在最外面。里面的实现不仅要格式化数据还要开关文件,那么多线程会被这个 logv 脱慢
3, 没有分级

建议不要自己造车轮,c++ 可以看看或者直接是用 glog,或者 log4cxx 等知名的
gangban_lau 2012-01-20
  • 打赏
  • 举报
回复
楼主,有很多可以改进
1, 直接用 va_start(), vsnprintf(), va_end()
2, 将 sprintf 改为 snprintf,没有考虑越界
3, 非线程安全
4, 不要每次都 fflush,效率很低,起码给个参数控制
tlic031 2012-01-20
  • 打赏
  • 举报
回复
对日志不大了解,来围观各路PK和牛人点评的……
bigbadbird 2012-01-19
  • 打赏
  • 举报
回复
牛人啊!!学无止境啊
CoolEgos 2012-01-16
  • 打赏
  • 举报
回复
还ok了
sunstreak 2012-01-15
  • 打赏
  • 举报
回复
都是牛人。。。郁闷ing
sniffer12345 2012-01-14
  • 打赏
  • 举报
回复
直接logcxx不好吗?我不认为有这么多人能够自己写出高效率的稳定的支持多线程的日志 不过这玩意真麻烦 还要编译阿帕奇的依赖包
clever101 2012-01-13
  • 打赏
  • 举报
回复
liranke 2012-01-13
  • 打赏
  • 举报
回复
"日志轮转,就是当日志满足一定条件的时候进行覆盖操作,
常见的有:
1)基于日志个数
2)基于日志大小
3)基于日志时间
4)基于日志等级
或者是多个方面同时考虑。
" ------------------------------学习了
lineuser 2012-01-13
  • 打赏
  • 举报
回复
mark
heimodao7 2012-01-12
  • 打赏
  • 举报
回复
顶! 文件操作,哈哈
zhanggc0313 2012-01-12
  • 打赏
  • 举报
回复
有点扯, 多线程读写log日志, 这个设计并不是很好, 如果用多线程一般也用领导者/跟随者模式, 而且一般都用在单独的日志机器中, 目前一般的做法是多进程, 每一个进程一个日志, 这样就可以在一个进程启动的时候打开一个文件, 再打到阀值的时候关闭文件, 再有监控进程或者线程来压缩日志文件或者删除过期的文件,并且来监控硬盘的空间, 而且一般都采用进程名加时间范围来给日志文件命名。这样就不存在资源竞争,锁的开销是很大的, 打开文件, 关闭文件的开销也是很大的。关于日志等级一般都是可以实时配置的。 这一点很重要。因为对客户和对开发人员来说是需要不同的日志。

这些日志的写法, 用来玩玩可以, 用在产品里面还是有点距离的。
zmkkobe 2012-01-12
  • 打赏
  • 举报
回复
不错,谢谢分享
赵4老师 2012-01-11
  • 打赏
  • 举报
回复
多线程
共享读日志
毫秒
program2050 2012-01-11
  • 打赏
  • 举报
回复
好文

hu7324829 2012-01-11
  • 打赏
  • 举报
回复
更新了日志轮转和日志文件大小控制。
转到了
http://www.oschina.net/code/snippet_227071_8076
uc_fly 2012-01-11
  • 打赏
  • 举报
回复
大家都在PK啊。。。都是牛淫啊...
加载更多回复(38)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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