Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 74199b2

Browse files
committed
add log4cplusplus
1 parent a13c1ee commit 74199b2

File tree

14 files changed

+440
-1
lines changed

14 files changed

+440
-1
lines changed

‎.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/bin
2+
/build

‎.gitmodules

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[submodule "log4cplus"]
2+
path = log4cplus
3+
url = https://github.com/huihut/log4cplus.git
4+
branch = dev_huihut

‎CMakeLists.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
cmake_minimum_required(VERSION 3.6)
2+
project(log4cplusplus)
3+
4+
set(CMAKE_CXX_STANDARD 17)
5+
set(PROJECT_ROOT_DIR ${PROJECT_SOURCE_DIR})
6+
7+
if(WIN32)
8+
link_directories(${PROJECT_ROOT_DIR}/bin/)
9+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_ROOT_DIR}/bin")
10+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_ROOT_DIR}/bin")
11+
endif(WIN32)
12+
13+
add_subdirectory(log4cplus)
14+
add_subdirectory(log4cplusplus)
15+
add_subdirectory(tests)

‎README.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,28 @@
1-
# log4cplus
1+
# log4cplusplus
2+
3+
基于 log4cplus 封装的自用的 C++ 日志库
4+
5+
## 示例
6+
7+
```cpp
8+
#include "log4cplusplus.h"
9+
10+
int main(int argc, char *argv[])
11+
{
12+
log4cplus::Log4CPlusPlus* log = GetLog4CPlusPlusInstance();
13+
if (log)
14+
{
15+
log->Init();
16+
log->EnableDebuggerOutput(true);
17+
log->EnableConsoleOutput(true);
18+
19+
LOG4CPLUSPLUS_DEBUG(L"log test");
20+
LOG4CPLUSPLUS_INFO(L"log test %s", L"info");
21+
LOG4CPLUSPLUS_WARN(L"log test %s %d", L"warn", 123);
22+
LOG4CPLUSPLUS_ERROR(L"log test %f", 3.14);
23+
24+
log->UnInit();
25+
}
26+
return 0;
27+
}
28+
```

‎generate_sln.bat

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
cd %~dp0
2+
set shadowdir=build
3+
if not exist %shadowdir% (
4+
mkdir %shadowdir%
5+
)
6+
cd %~dp0%shadowdir%
7+
8+
cmake.exe -G "Visual Studio 15 2017" -DCMAKE_GENERATOR_TOOLSET=v141 -DCMAKE_VS_EFFECTIVE_PLATFORMS=Win32;x64 ..\
9+
10+
cd %~dp0

‎log4cplus

Submodule log4cplus added at 5d7e51a

‎log4cplusplus/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
cmake_minimum_required(VERSION 3.6)
2+
project(log4cplusplus)
3+
4+
set(CMAKE_CXX_STANDARD 17)
5+
6+
add_subdirectory(src)

‎log4cplusplus/include/log4cplusplus.h

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#ifndef _LOG4CPLUSPLUS_H_
2+
#define _LOG4CPLUSPLUS_H_
3+
4+
#ifdef WIN32
5+
#if defined(LOG4CPLUSPLUS_EXPORT)
6+
#define LOG4CPLUSPLUS_API __declspec(dllexport)
7+
#else
8+
#define LOG4CPLUSPLUS_API __declspec(dllimport)
9+
#endif
10+
#else
11+
#define LOG4CPLUSPLUS_API __attribute__((visibility("default")))
12+
#endif
13+
14+
// 调试日志
15+
#define LOG4CPLUSPLUS_DEBUG(...)\
16+
{\
17+
GetLog4CPlusPlusInstance()->WriteLog(log4cplus::LogDebugLevel, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);\
18+
}
19+
20+
// 普通日志
21+
#define LOG4CPLUSPLUS_INFO(...)\
22+
{\
23+
GetLog4CPlusPlusInstance()->WriteLog(log4cplus::LogInfoLevel, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);\
24+
}
25+
26+
// 警告日志
27+
#define LOG4CPLUSPLUS_WARN(...)\
28+
{\
29+
GetLog4CPlusPlusInstance()->WriteLog(log4cplus::LogWarnLevel, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);\
30+
}
31+
32+
// 错误日志
33+
#define LOG4CPLUSPLUS_ERROR(...)\
34+
{\
35+
GetLog4CPlusPlusInstance()->WriteLog(log4cplus::LogErrorLevel, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);\
36+
}
37+
38+
#define DEFALT_LOG_FILE_NAME L"log.log"
39+
40+
namespace log4cplus
41+
{
42+
enum Log4CPlusPlusLevel
43+
{
44+
LogDebugLevel = 10000,
45+
LogInfoLevel = 20000,
46+
LogWarnLevel = 30000,
47+
LogErrorLevel = 40000
48+
};
49+
50+
class Log4CPlusPlus
51+
{
52+
public:
53+
virtual ~Log4CPlusPlus() {}
54+
55+
public:
56+
/*
57+
初始化日志
58+
* file_path 日志基础文件路径,如传入 D:\\code,最终生成 D:\\code\\log\2020円-6-4\\
59+
* file_name 日志文件名,如 log.log
60+
*/
61+
virtual void Init(const wchar_t *file_path = L"", const wchar_t *file_name = DEFALT_LOG_FILE_NAME) = 0;
62+
63+
/*
64+
反初始化日志
65+
*/
66+
virtual void UnInit() = 0;
67+
68+
/*
69+
日志同时输出到调试器,如 VS调试窗口
70+
*/
71+
virtual void EnableDebuggerOutput(bool enable) = 0;
72+
73+
/*
74+
日志同时输出到控制台,如 cmd
75+
*/
76+
virtual void EnableConsoleOutput(bool enable) = 0;
77+
78+
/*
79+
打印日志,支持格式化字符串
80+
* logLevel 日志等级
81+
* file 打印日志代码所在的文件
82+
* line 打印日志代码所在的行
83+
* function 打印日志代码所在的类及方法
84+
* format, ... 格式化字符串,如 L"Hello %s %d", L"World", 123
85+
*/
86+
virtual void WriteLog(Log4CPlusPlusLevel logLevel, const char* file, int line, const char* function, const wchar_t *format, ...) = 0;
87+
88+
protected:
89+
Log4CPlusPlus() {}
90+
91+
private:
92+
Log4CPlusPlus(const Log4CPlusPlus&) = delete;
93+
Log4CPlusPlus& operator = (const Log4CPlusPlus&) = delete;
94+
95+
};
96+
}
97+
98+
extern "C" LOG4CPLUSPLUS_API log4cplus::Log4CPlusPlus* __cdecl GetLog4CPlusPlusInstance();
99+
100+
#endif // _LOG4CPLUSPLUS_H_

‎log4cplusplus/src/CMakeLists.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
cmake_minimum_required(VERSION 3.6)
2+
project(log4cplusplus)
3+
4+
set(CMAKE_CXX_STANDARD 17)
5+
6+
add_definitions(-DLOG4CPLUSPLUS_EXPORT)
7+
add_definitions(-DUNICODE -D_UNICODE)
8+
9+
set(INCLUDE_DIRECTORY
10+
${PROJECT_ROOT_DIR}/log4cplusplus/include
11+
${PROJECT_ROOT_DIR}/log4cplus/include
12+
)
13+
14+
include_directories(${INCLUDE_DIRECTORY})
15+
16+
add_library(log4cplusplus SHARED
17+
log4cplusplusimp.cpp
18+
log4cplusplusimp.h
19+
)
20+
21+
target_link_libraries(log4cplusplus debug log4cplusUD optimized log4cplusU)

‎log4cplusplus/src/log4cplusplusimp.cpp

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
#include "log4cplusplusimp.h"
2+
3+
#include <iostream>
4+
#include <ctime>
5+
6+
#include <log4cplus/layout.h>
7+
#include <log4cplus/loggingmacros.h>
8+
#include <log4cplus/consoleappender.h>
9+
#include <log4cplus/win32debugappender.h>
10+
#include <log4cplus/win32consoleappender.h>
11+
12+
#define DEBUGGER_APPENDER_NAME LOG4CPLUS_TEXT("debuggerAppender")
13+
#define CONSOLE_APPENDER_NAME LOG4CPLUS_TEXT("consoleAppender")
14+
#define FILE_APPENDER_NAME LOG4CPLUS_TEXT("fileAppender")
15+
16+
namespace log4cplus
17+
{
18+
Log4CPlusPlusImp::Log4CPlusPlusImp()
19+
:m_isInit(false)
20+
{
21+
}
22+
23+
void Log4CPlusPlusImp::Init(const wchar_t *file_path, const wchar_t *file_name)
24+
{
25+
if (m_isInit)
26+
return;
27+
28+
std::locale::global(std::locale("chs"));
29+
30+
m_pInitializer = std::make_unique<log4cplus::Initializer>();
31+
m_logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));
32+
33+
{
34+
// 主日志文件
35+
std::wstring& main_filename = GetFullLogFileName(file_path, file_name);
36+
log4cplus::SharedFileAppenderPtr mainAppender(
37+
new RollingFileAppender(
38+
main_filename.c_str(),
39+
10 * 1024 * 1024,
40+
9999,
41+
true,
42+
true));
43+
mainAppender->setName(FILE_APPENDER_NAME);
44+
mainAppender->getloc();
45+
mainAppender->setLayout(std::unique_ptr<Layout>(
46+
new PatternLayout(LOG4CPLUS_TEXT("[%D{%Y-%m-%d %H:%M:%S.%q}] [%t] %-5p (%F:%L::%M) %m%n"))));
47+
m_logger.addAppender(SharedAppenderPtr(mainAppender.get()));
48+
}
49+
50+
m_isInit = true;
51+
}
52+
53+
void Log4CPlusPlusImp::UnInit()
54+
{
55+
m_logger.shutdown();
56+
m_pInitializer.reset();
57+
m_isInit = false;
58+
}
59+
60+
Log4CPlusPlusImp::~Log4CPlusPlusImp()
61+
{
62+
}
63+
64+
Log4CPlusPlusImp* Log4CPlusPlusImp::GetInstance()
65+
{
66+
static Log4CPlusPlusImp instance;
67+
return &instance;
68+
}
69+
70+
// 获取完全的日志路径名
71+
std::wstring Log4CPlusPlusImp::GetFullLogFileName(const wchar_t *file_path_base, const wchar_t *file_name)
72+
{
73+
time_t now = time(0);
74+
tm *ltm = localtime(&now);
75+
std::wstring data = std::to_wstring(1900 + ltm->tm_year) + L"-" + std::to_wstring(1 + ltm->tm_mon) + L"-" + std::to_wstring(ltm->tm_mday);
76+
77+
std::wstring s_file_path_base(file_path_base);
78+
std::wstring s_file_name(file_name);
79+
if (s_file_path_base.size() == 0)
80+
{
81+
return L"./log/" + data + L"/" + s_file_name;
82+
}
83+
84+
std::wstring filename;
85+
auto& end_char = s_file_path_base.back();
86+
if (end_char == L'/' || end_char == L'\\')
87+
{
88+
filename = s_file_path_base + L"log/" + data + L"/" + s_file_name;
89+
}
90+
else
91+
{
92+
filename = s_file_path_base + L"/log/" + data + L"/" + s_file_name;
93+
}
94+
return filename;
95+
}
96+
97+
// 调试日志
98+
void Log4CPlusPlusImp::EnableDebuggerOutput(bool enable)
99+
{
100+
SharedAppenderPtr debuggerAppender = m_logger.getAppender(DEBUGGER_APPENDER_NAME);
101+
102+
// 若需启用,且没有添加,则添加
103+
if (enable && !debuggerAppender)
104+
{
105+
debuggerAppender = new Win32DebugAppender();
106+
debuggerAppender->setName(DEBUGGER_APPENDER_NAME);
107+
debuggerAppender->setLayout(std::unique_ptr<Layout>(
108+
new PatternLayout(LOG4CPLUS_TEXT("[%D{%Y-%m-%d %H:%M:%S.%q}] [%t] %-5p (%F:%L::%M) %m%n"))));
109+
m_logger.addAppender(SharedAppenderPtr(debuggerAppender.get()));
110+
}
111+
// 若需禁用,且已经添加,则移除
112+
else if(!enable && debuggerAppender)
113+
{
114+
m_logger.removeAppender(DEBUGGER_APPENDER_NAME);
115+
}
116+
}
117+
118+
// 控制台日志
119+
void Log4CPlusPlusImp::EnableConsoleOutput(bool enable)
120+
{
121+
SharedAppenderPtr consoleAppender = m_logger.getAppender(CONSOLE_APPENDER_NAME);
122+
123+
// 若需启用,且没有添加,则添加
124+
if (enable && !consoleAppender)
125+
{
126+
consoleAppender = new Win32ConsoleAppender();
127+
consoleAppender->setName(CONSOLE_APPENDER_NAME);
128+
consoleAppender->setLayout(std::unique_ptr<Layout>(
129+
new PatternLayout(LOG4CPLUS_TEXT("[%D{%Y-%m-%d %H:%M:%S.%q}] [%t] %-5p (%F:%L::%M) %m%n"))));
130+
m_logger.addAppender(SharedAppenderPtr(consoleAppender.get()));
131+
}
132+
// 若需禁用,且已经添加,则移除
133+
else if (!enable && consoleAppender)
134+
{
135+
m_logger.removeAppender(CONSOLE_APPENDER_NAME);
136+
}
137+
}
138+
139+
// 打印日志
140+
void Log4CPlusPlusImp::WriteLog(Log4CPlusPlusLevel logLevel, const char* file, int line, const char* function, const wchar_t *format, ...)
141+
{
142+
if (!m_isInit)
143+
return;
144+
145+
assert(format);
146+
LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var);
147+
148+
tchar const * msg = nullptr;
149+
int ret = 0;
150+
std::va_list args;
151+
152+
do
153+
{
154+
va_start(args, format);
155+
ret = var.print_va_list(msg, format, args);
156+
va_end(args);
157+
} while (ret == -1);
158+
159+
if (msg)
160+
{
161+
m_logger.forcedLog(logLevel, msg, file, line, function);
162+
}
163+
}
164+
}
165+
166+
log4cplus::Log4CPlusPlus* GetLog4CPlusPlusInstance()
167+
{
168+
return log4cplus::Log4CPlusPlusImp::GetInstance();
169+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /