0%

MyOTP-2 日志

对于交易系统一般使用两种日志模式,一种是异步落地文件的方式,一种是异步存储数据库方式。存储数据库的方式适合多账户的交易系统方便管理,直接文件落地的方式方便嵌入式日志模块,占用资源少轻量级。

保存本地文件异步落地的日志模块

如下是对SPDLOG的简单封装,通过进程内的“全局启动函数”和宏定义的方式调用spdlog日志库。 对于进程单线程使用线程池可以加速日志输出落地但会乱序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// console
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
// Create a daily logger - a new file is created every day on 6:00am
auto daily_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>(log_file, 6, 00);

// 异步/同步模式
if (use_async) {
spdlog::init_thread_pool(8192, thread_count);
std::vector<spdlog::sink_ptr> log_sinks{console_sink, daily_sink};
auto logger = std::make_shared<spdlog::async_logger>("logger",
log_sinks.begin(),
log_sinks.end(),
spdlog::thread_pool(),
spdlog::async_overflow_policy::block);
if (use_format) {
logger->set_pattern(SPDLOG_LOG_PATTERN);
}
spdlog::set_default_logger(logger);
} else {
spdlog::sinks_init_list log_sinks = {console_sink, daily_sink};
auto logger = std::make_shared<spdlog::logger>("logger", log_sinks);
if (use_format) {
logger->set_pattern(SPDLOG_LOG_PATTERN);
}
spdlog::set_default_logger(logger);
}

// 缓存推送
spdlog::flush_every(std::chrono::seconds(flush_policy));

线程池、多线程、乱序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 多线程,乱序
void test_thread_count(){
const std::string log_file = "clogs/test.log";
const std::string level = "info";
const bool use_async = true;
const bool show_use_level = true;
const bool use_format = true;
const int flush_policy = 5;
const int thread_count = 5;

create_logger(log_file, level, use_async, show_use_level, use_format, flush_policy, thread_count);
SPDLOG_TRACE("Trace from SpdLog!");
SPDLOG_DEBUG("Debug from SpdLog!");
SPDLOG_INFO("Info from SpdLog!");
SPDLOG_WARN("Warn from SpdLog!");
SPDLOG_ERROR("Error from SpdLog!");
SPDLOG_CRITICAL("Critical from SpdLog!");
}

1
2
3
4
5
6
7
8
9
test_thread_count
[06/15 23:52:56.600533000] [ info ] [ 8791/101640] [MyOTP/cpp-dev/tools/logger/logger.h:77#create_logger] Info from SpdLog!
[06/15 23:52:56.600539000] [ error ] [ 8791/101640] [MyOTP/cpp-dev/tools/logger/logger.h:79#create_logger] Error from SpdLog!
[06/15 23:52:56.600566000] [warning ] [ 8791/101640] [MyOTP/cpp-dev/tools/logger/main.cpp:55#test_thread_count] Warn from SpdLog!
[06/15 23:52:56.600540000] [critical] [ 8791/101640] [MyOTP/cpp-dev/tools/logger/logger.h:80#create_logger] Critical from SpdLog!
[06/15 23:52:56.600539000] [warning ] [ 8791/101640] [MyOTP/cpp-dev/tools/logger/logger.h:78#create_logger] Warn from SpdLog!
[06/15 23:52:56.600566000] [ error ] [ 8791/101640] [MyOTP/cpp-dev/tools/logger/main.cpp:56#test_thread_count] Error from SpdLog!
[06/15 23:52:56.600567000] [critical] [ 8791/101640] [MyOTP/cpp-dev/tools/logger/main.cpp:57#test_thread_count] Critical from SpdLog!
[06/15 23:52:56.600565000] [ info ] [ 8791/101640] [MyOTP/cpp-dev/tools/logger/main.cpp:54#test_thread_count] Info from SpdLog!

代码

参考