# printf风格的接口,包括LOGA__, LOGW__, LOG__, LOGBIN__
# 日志附加信息包括时间,源代码文件,函数,行号
# 每个日志对象都有单独的行为
# 在程序运行时通过配置ini文件动态改变日志行为
# 可以输出到控制台窗口,文件,http服务器
# 线程安全
# 跨平台(windows, linux)
这里有一个重点就是尽可能的简单,我对接口修改过多次,为了尽量做到简单易用和自解释。而上述功能都是从实际项目的需求中提炼出来的,比如为什么每个日志对象需要有单独的行为?看日志文件最大的烦恼就是内容太多太杂不容易找到需要的,那么yaolog给出一种解决方法是设置不同的日志对象,如果想专门查看socket日志,可以只启用socket日志对象,或者将socket日志专门输出到一个文件,而这些都是可以在程序运行时动态配置的。又比如发送日志到http服务器,起因于某次有个用户在QQ上报了一个bug,这个bug如果在有日志的debug版本下应该能很快确定原因,但是release版本是没有日志的。当然,也可以给用户一个带日志的dll去替换,但是这种方法至少存在两个问题:版本控制(新的dll和用户原来的dll一致吗)和日志查看(用户怎样将日志提交给开发人员,不要高估了小白)。于是就想到要在服务器端控制日志的启用,以及将日志内容发送到服务器进行分析。
yaolog v1.3的代码和demo在这里
另外我在codeproject上发了一篇详细说明,地址在这里
如果你觉得这个工具好用请回帖支持一下。本人毕竟水平有限,如果你发现bug或其他不足之处,也请回帖多多指教哈!
下面贴一段简单的测试代码:
[cpp]
#include
#include "yaolog.h"
#define LOGID_I "info"
#define LOGID_C "custom"
#define LOGID_B "bin"
int main()
{
// 初始化,在程序入口点调用
YaoUtil::LogFactory::Init();
// 创建日志对象
YaoUtil::LogFactory::Create(LOGID_I, true);
YaoUtil::LogFactory::Create(LOGID_C, true);
YaoUtil::LogFactory::Create(LOGID_B, true, false);
LOGA__(LOGID_I, "My name is %s! I'm %d!", "neil", 29);
// 设置日志对象的属性:输出日志到控制台窗口和文件
YaoUtil::LogFactory::SetAttr(LOGID_I, true, YaoUtil::LOGOUT_FLAG_STDOUT | YaoUtil::LOGOUT_FLAG_FILE, true, false, true, true);
LOGW__(LOGID_I, L"My name is %s! I'm %d!", L"neil", 29);
// 设置日志对象的属性:输出日志到文件和http服务器
YaoUtil::LogFactory::SetAttr(LOGID_I, true, YaoUtil::LOGOUT_FLAG_FILE | YaoUtil::LOGOUT_FLAG_REMOTE, true, true, true, true, false, "c:\\", "tt.log", "http://192.168.1.200/default.
aspx");
LOG__(LOGID_I, _T("My name is %s! I'm %d!"), _T("neil"), 29);
// 设置日志对象的属性:使用ini文件
YaoUtil::LogFactory::SetAttrFromConfigFile(LOGID_C, "logconfig.ini");
for (int i = 0; i < 100; i++)
{
LOGA__(LOGID_C, "You can modify the ini file and view effect(%d)!", i);
Sleep(500);
}
// 二进制日志
YaoUtil::LogFactory::SetAttrFromConfigFile(LOGID_B, "logconfig.ini");
char buf[10] = { 0,1,2,3,4,5,6,7,8,9 };
LOGBIN__(LOGID_B, buf, 10);
std::cin.get();
// 清理,在程序退出前调用
YaoUtil::LogFactory::Exit();
return 0;
}