网是开源的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的更多相关文章

  1. Go第三方日志库logrus

    日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...

  2. 第三方日志库logrus使用

    日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...

  3. Go语言项目中使用zap日志库(翻译)

    本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...

  4. Go之第三方日志库logrus使用

    文章引用自 第三方日志库logrus使用 日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库 ...

  5. 从0写一个Golang日志处理包

    WHY 日志概述 日志几乎是每个实际的软件项目从开发到最后实际运行过程中都必不可少的东西.它对于查看代码运行流程,记录发生的事情等方面都是很重要的. 一个好的日志系统应当能准确地记录需要记录的信息,同 ...

  6. golang-Zap和Go Logger日志库

    目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...

  7. Go之Zap日志库集成Gin

    简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...

  8. 在Go语言项目中使用Zap日志库

    在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...

  9. Go语言系列之自定义实现日志库

    日志库logo gitee地址传送门:https://gitee.com/zhangyafeii/logo 日志库需求分析 1. 支持往不同的地方输出日志 2. 日志分级别 Debug Trace I ...

随机推荐

  1. 读《java核心技术卷一》有感

    过去一个多月了吧.才囫囵吞枣地把这书过了一遍.话说这书也够长的,一共706页.我从来不是个喜欢记录的人,一直以来看什么书都是看完了就扔一边去,可能有时候有那么一点想记录下来的冲动,但算算时间太紧,很多 ...

  2. 动态WebService方法

    [转] 调用Webservice的方法一般是通过右击项目-->添加服务引用-->输入Webservice地址-->前往-->确定,这样可以顺利调用服,但是需要注意的一点是:如果 ...

  3. MySQL优化技巧之四(数据库设计中的一些技巧)

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  4. SVN---脱离SVN控制

    创建一个记事本文件,然后吧这句话复制进去for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn&qu ...

  5. DSS 搭建手机流媒体服务器

    最近研究了一下手机流媒体服务器的搭建,目的是实现通过3G手机看在线视频. 开始的时候研究了一下 Tudou手机版 ,可它哪并没有实现在线播放,因为视频地址是 http 协议的.参看了许多文章,终于了解 ...

  6. gc 辅助打印信息

    cat xx.xml|grep GC <jvm-arg>-XX:+PrintGCDetails</jvm-arg> <jvm-arg>-XX:+PrintGCDat ...

  7. 九度OJ1207

    题目给你了一个很大的n,然后让你去计算它的质因数.对N进行开方得到的是一个大约在32000左右的数,我们可以用埃氏筛法进行素数打表.对所有prime[i]<=sqrt(n),分别看prime[i ...

  8. 在delphi下TClientSocket的使用技巧 转

    http://blog.csdn.net/newzhhsh/article/details/2905874 如果你是在线程的构造函数中创建TClientSocket,那么TClientSocket还是 ...

  9. (easy)LeetCode 235.Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  10. android依赖工程,子工程覆盖父工程的相同属性

    当业务复杂,开始拆分工程后,就会遇到如下问题: 工程A为lib父工程, 工程B为子工程.  两个工程中均有资源文件(比如strings.xml),且资源文件中有相同的key, 那么值到底使用谁的? 实 ...