大家自己使用的都是什么日志类?求分享

ayw215 2010-06-19 11:57:02
寻找一个日志类,满足一下条件
1, 多线程安全
2, 支持不同级别的日志过滤
3,支持多个输出,比如文件,控制台,网络
4,支持按照时间,大小等自动切割日志文件。
5, 不依赖于任何第三方库
6,体积小,速度快
7,使用简单

log4cplus使用太麻烦了,而且编译出来的静态库有10M,囧~~,log4c在win下目前还不能使用

不知道大家都用的啥日志类,求分享,100分感谢
谢谢大家!
...全文
113 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
herman~~ 2010-06-19
  • 打赏
  • 举报
回复
mark
Defonds 2010-06-19
  • 打赏
  • 举报
回复
java
log4j
老邓 2010-06-19
  • 打赏
  • 举报
回复
我习惯性的记录方法是:可以重定向到控制台,也可以生成log
这是几个函数:
void dbg(const char* format, ...)
{
#ifdef qpDEBUG
char buf[4096];
char* p = buf;
va_list ap;
va_start(ap, format);
int n = vsnprintf_s(buf, sizeof(buf), _countof(buf), format, ap);
va_end(ap);

// buf-3 is room for CR/LF/NUL
p += (n < 0) ? _countof(buf) - 3 : n;
while (p > buf && isspace(p[-1]))
*--p = '\0';

*p++ = '\r';
*p++ = '\n';
*p = '\0';

OutputDebugStringA(buf);
#endif
}

void dbg(const wchar_t* format, ...)
{
#ifdef qpDEBUG
wchar_t buf[4096];
wchar_t* p = buf;
va_list ap;
va_start(ap, format);
int n = _vsnwprintf_s(buf, _countof(buf), format, ap);
va_end(ap);

// buf-3 is room for CR/LF/NUL
p += (n < 0) ? _countof(buf) - 3 : n;
while (p > buf && iswspace(p[-1]))
*--p = L'\0';

*p++ = L'\r';
*p++ = L'\n';
*p = L'\0';

OutputDebugStringW(buf);
#endif
}

void dbg(const string& str)
{
#ifdef qpDEBUG
dbg(str.c_str());
#endif
}

void dbg(const wstring& str)
{
#ifdef qpDEBUG
dbg(str.c_str());
#endif
}

void dbg(int i, int line, const char* file)
{
#ifdef qpDEBUG
if (line != 0)
dbg("%s, %d : %d", file, line, i);
else
dbg("%d", i);
#endif
}

void dbg(void* p, const char* file, int line)
{
#ifdef qpDEBUG
if (line != 0)
dbg("%s, %d : %x", file, line, p);
else
dbg("%x", p);
#endif
}
别逗我乐 2010-06-19
  • 打赏
  • 举报
回复
楼主水平肯定好高,遇到的问题,我们从没想过。

哎,
老邓 2010-06-19
  • 打赏
  • 举报
回复
除了log4cplus,还真没啥好玩意。
要不自己写一个?
ayw215 2010-06-19
  • 打赏
  • 举报
回复
感谢ls各位
感谢老邓
自己写了个,但是不够完美,目前的需求是够了,简单测试了下,大概可以达到30w每分钟的记录速度,没有丢消息,还是等以后有空了再完善吧
结贴
zmshy2128 2010-06-19
  • 打赏
  • 举报
回复
下面是我常用的日志类(从别的地方抄的),功能简单实用,不过没有日志过滤功能,不过也很好扩展。

.h文件
#ifndef _LOG_H
#define _LOG_H

class CLog
{
public:
CLog();
~CLog();

public:
void InitLog(LPCTSTR lpszLogPath);
void Add(const char* fmt, ...); //输出文字,参数就跟printf一样

protected:
enum {BUFSIZE = 3000}; //工作缓冲区
char m_tBuf[BUFSIZE];

CString m_strLogPath;
CRITICAL_SECTION m_crit; //设置一个临界区
};

#endif






.cpp文件
#include "stdafx.h"
#include "log.h"

CLog::CLog() //构造函数,设置日志文件的默认路径
{
::InitializeCriticalSection(&m_crit); //初始化临界区
}


CLog::~CLog()
{
::DeleteCriticalSection(&m_crit); //释放里临界区
}


/*================================================================
* 函数名: InitLog
* 参数: LPCTST lpszLogPath
* 功能描述: 初始化日志(设置日志文件的路径)
* 返回值: void
* 作 者: 程红秀 2005年01月06日
================================================================*/
void CLog::InitLog(LPCTSTR lpszLogPath)
{
m_strLogPath=lpszLogPath;
}

void CLog::Add(const char* fmt, ...)
{
if (m_strLogPath.IsEmpty())
return ;

if (!AfxIsValidString(fmt, -1))
return ;
/*-----------------------进入临界区(写文件)------------------------------------*/
::EnterCriticalSection(&m_crit);
try
{
va_list argptr; //分析字符串的格式
va_start(argptr, fmt);
_vsnprintf(m_tBuf, BUFSIZE, fmt, argptr);
va_end(argptr);
}
catch (...)
{
m_tBuf[0] = 0;
}

FILE *fp = fopen(m_strLogPath, "a"); //以添加的方式输出到文件
if (fp)
{
fprintf(fp,"%s: ", AfxGetApp()->m_pszExeName); //加入当前程序名

CTime ct ; //加入当前时间
ct = CTime::GetCurrentTime();
fprintf(fp,"%s : ",ct.Format("%m/%d/%Y %H:%M:%S"));
fprintf(fp, "%s\n", m_tBuf);
fclose(fp);
}
::LeaveCriticalSection(&m_crit);
/*-------------------退出临界区----------------------------------------*/
}

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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