新写的c++日志库:log4K
网是开源的c/c++日志库也不少,但用起来总觉得不方便,于是动手写了一个C++日志框架Log4K。
测试代码:
#include "log4k.h" #pragma comment(lib, "log4k.lib") static int g_Cnt = ;
void LogTestThread1(LPVOID lpPara)
{
DEBUG_FUNCTION(); LOGFMTT(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTD(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTI(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTW(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTE(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__); for (int i = ; i < ;)
{
LOGFMTT(L"[%d] %s", i++, __FUNCTIONW__);
//Sleep(10);
}
} void LogTestThread2(LPVOID lpPara)
{
DEBUG_FUNCTION(); LOGFMTT_A("----------Function:%s, Line:%d", __FUNCTION__, __LINE__);
LOGFMTD(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTI_A("----------Function:%s, Line:%d", __FUNCTION__, __LINE__);
LOGFMTW(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTE_A("----------Function:%s, Line:%d", __FUNCTION__, __LINE__); for (int i = ; i < ;)
{
LOGFMTI(L"[%d] %s", i++, __FUNCTIONW__);
//Sleep(10);
}
} int main()
{
DEBUG_FUNCTION(); LOG4K_SET_OUT(Kevin55::OUT_TO_STDOUT_AND_LOG);
LOGFMTT(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTD(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTI(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTW(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTE(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__); LOGFMTT_A("----------Function:%s, Line:%d", __FUNCTION__, __LINE__);
LOGFMTD_A("----------Function:%s, Line:%d", __FUNCTION__, __LINE__);
LOGFMTI_A("----------Function:%s, Line:%d", __FUNCTION__, __LINE__);
LOGFMTW_A("----------Function:%s, Line:%d", __FUNCTION__, __LINE__);
LOGFMTE_A("----------Function:%s, Line:%d", __FUNCTION__, __LINE__); HANDLE hThread[];
ZeroMemory(hThread, sizeof(HANDLE) * ); hThread[] = CreateThread(NULL, , (LPTHREAD_START_ROUTINE)LogTestThread1, NULL, , NULL);
hThread[] = CreateThread(NULL, , (LPTHREAD_START_ROUTINE)LogTestThread2, NULL, , NULL); for (int i = ; i < ; i++)
{
LOGFMTD(L"[%d]======%s", i, __FUNCTIONW__);
} WaitForMultipleObjects(, hThread, true, INFINITE);
//LOG4K_SET_OUT(OUT_TO_STDOUT); LOGFMTT(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTD(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTI(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTW(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__);
LOGFMTE(L"----------Function:%s, Line:%d", __FUNCTIONW__, __LINE__); return ;
}

使用nmake编译及链接完成后,还有error信息,下面是所有nmake输出:
cl /c /Zi /W3 /WX- /sdl /O2 /Oi /Oy- /GL /D WIN32 /D NDEBUG /D _CONSOLE /D _LIB /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /FoD:\code\CPP_Code\KernalMainApp\Log4Z\Log4Z\out\Log4K.obj /FdD:\code\CPP_Code\KernalMainApp\Log4Z\Log4Z\out\vc120.pdb /Gd /TP /analyze- /errorReport:prompt D:\code\CPP_Code\KernalMainApp\Log4Z\Log4Z\Log4K.cpp
Log4K.cpp
link /ERRORREPORT:PROMPT /OUT:D:\code\CPP_Code\KernalMainApp\Log4Z\Log4Z\out\Log4K.exe /INCREMENTAL /NOLOGO /LIBPATH:"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib";"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib" kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /DEBUG /PDB:D:\code\CPP_Code\KernalMainApp\Log4Z\Log4Z\out\Log4K.pdp /LTCG /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /IMPLIB:D:\code\CPP_Code\KernalMainApp\Log4Z\Log4Z\out\Log4Z.lib /MACHINE:X86 D:\code\CPP_Code\KernalMainApp\Log4Z\Log4Z\out\log4k.obj
LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/LTCG' specification
Generating code
Finished generating code
cl Log4K.cpp
Log4K.cpp
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xlocale(337) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
Log4K.cpp(427) : error C2664: 'BOOL SetConsoleTitleA(LPCSTR)' : cannot convert argument 1 from 'const wchar_t [14]' to 'LPCSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Log4K.cpp(513) : error C2664: 'DWORD GetModuleFileNameA(HMODULE,LPSTR,DWORD)' : cannot convert argument 2 from 'wchar_t [128]' to 'LPSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
网上好像有人提交过类似的问题:https://connect.microsoft.com/VisualStudio/feedback/details/808657/vs2013-compiler-fails-on-function-templates-with-c-11-alternate-declaration-syntax,这个问题可能是编译器的一个bug。
新写的c++日志库:log4K的更多相关文章
- Go第三方日志库logrus
日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...
- 第三方日志库logrus使用
日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...
- Go语言项目中使用zap日志库(翻译)
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...
- Go之第三方日志库logrus使用
文章引用自 第三方日志库logrus使用 日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库 ...
- 从0写一个Golang日志处理包
WHY 日志概述 日志几乎是每个实际的软件项目从开发到最后实际运行过程中都必不可少的东西.它对于查看代码运行流程,记录发生的事情等方面都是很重要的. 一个好的日志系统应当能准确地记录需要记录的信息,同 ...
- golang-Zap和Go Logger日志库
目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...
- Go之Zap日志库集成Gin
简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...
- Go语言系列之自定义实现日志库
日志库logo gitee地址传送门:https://gitee.com/zhangyafeii/logo 日志库需求分析 1. 支持往不同的地方输出日志 2. 日志分级别 Debug Trace I ...
随机推荐
- cf 605B B. Lazy Student 构造 好题
题意: 一个n个节点的图,有m条边,已知这个图的一个mst 现在如果我们知道这个图的m条边,和知道mst的n-1条边是哪些,问能不能构造出一个满足条件的图 思路:排序+构造 数组deg[i]表示节点i ...
- hdu 5437 Alisha’s Party 模拟 优先队列
Problem Description Princess Alisha invites her friends to come to her birthday party. Each of her f ...
- mvc无法找到资源
昨天装了vs2015,但是第二步没有完成.今天急急忙忙的用13打开一个mvc的项目,但是添加的控制器怎么都不能访问. 无法找到资源. 说明: HTTP 404.您正在查找的资源(或者它的一个依赖项)可 ...
- C++模板元编程 - 2 模仿haskell的列表以及相关操作
这是昨天和今天写的东西,利用C++的可变模板参数包以及包展开,模式匹配的一些东西做的,感觉用typename...比轮子叔那个List<A,List<B, List<C, D> ...
- iframe替代方案
自己写一个pagelet框架.封装成JSP的Taglib. <tms:view header="common-header" footer="common-foot ...
- 1小时vpn coding让开发更简单 或https://www.imfreevpn.org/
- 使用SVN进行项目版本管理
1.摘要 本文描述了利用SVN进行项目版本管理的方法,涉及项目版本号命名规则.SVN目录结构.第三方代码库的管理.版本创建.发布.修订.合并等行为的方法和原则. 2.版本号命名规则 版本号采用主版本号 ...
- Python进阶09 动态类型
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢TeaEra, 猫咪cat 动态类型(dynamic typing)是Pyth ...
- Jquery动态进行图片缩略
//页面加载完执行resizeImage()函数 $(document).ready(resizeImage()); function resizeImage(){ $(".pic a im ...
- 算法库:OpenCV3编译配置
2016-01-20 23:55 更新: 关于Opencv3.1的lib文件 opencv_aruco310d.libopencv_bgsegm310d.libopencv_bioinspired3 ...