1.linux spdlog默认同步日志
logger.h
#pragma once
#include <memory>
#include <vector>
#include <string>
#include <ctime>
#include "spdlog/spdlog.h"
class CLogger {
public:
CLogger(const CLogger &) = delete;
CLogger &operator=(const CLogger &) = delete;
virtual ~CLogger() {}
static CLogger *GetInstance();
public:
int init();
int fint();
private:
std::string file_name;
std::vector<spdlog::sink_ptr> m_sinks;
protected:
CLogger() = default;
};
logger.c
#include "logger.h"
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
CLogger* CLogger::GetInstance() {
static CLogger s_logger;
return &s_logger;
}
int CLogger::init() {
if (access("./logs", F_OK) == -1) { // 如果文件夹不存在
mkdir("./logs",
S_IRWXU | S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
}
m_sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
m_sinks.push_back(std::make_shared<spdlog::sinks::daily_file_sink_mt>(
"./logs/test", 23, 59));
return 0;
}
int CLogger::fint() {
spdlog::drop_all(); // 必须在main退出前释放所有logger
return 0;
}
std::shared_ptr<spdlog::logger> CLogger::GetLogger(const std::string &name) {
auto combined_logger = spdlog::get(name);
if (!combined_logger) {
// 同步日志
combined_logger = std::make_shared<spdlog::logger>(name,
std::begin(m_sinks), std::end(m_sinks));
// 格式应用到所有注册的logger
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [thread %t] %v");
// 注册
spdlog::register_logger(combined_logger);
combined_logger->flush_on(spdlog::level::info);
}
return combined_logger;
}
2.异步日志使用
logger.h
#pragma once
#include <memory>
#include <vector>
#include <string>
#include <ctime>
#include "spdlog/spdlog.h"
class CLogger {
public:
CLogger(const CLogger &) = delete;
CLogger &operator=(const CLogger &) = delete;
virtual ~CLogger() {}
static CLogger *GetInstance();
public:
int init();
int fint();
std::shared_ptr<spdlog::logger> GetLogger(const std::string &name);
private:
std::string file_name;
protected:
CLogger() = default;
};
logger.c
#include "tools/logger/logger.h"
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "spdlog/async.h"
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/basic_file_sink.h"
CLogger* CLogger::GetInstance() {
static CLogger s_logger;
return &s_logger;
}
int CLogger::init() {
if (access("./logs", F_OK) == -1) { // 如果文件夹不存在
mkdir("./logs",
S_IRWXU | S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
}
time_t curtime = time(NULL);
struct tm nowtime;
localtime_r(&curtime, &nowtime); // 线程安全可重入
file_name = "./logs/test_" +
std::to_string(1900+nowtime.tm_year) + "-" +
std::to_string(1+nowtime.tm_mon) + "-" +
std::to_string(nowtime.tm_mday);
return 0;
}
int CLogger::fint() {
spdlog::drop_all(); // 必须在main退出前释放所有logger
return 0;
}
std::shared_ptr<spdlog::logger> CLogger::GetLogger(const std::string &name) {
auto combined_logger = spdlog::get(name);
if (!combined_logger) {
// 异步日志
combined_logger =
spdlog::create_async<spdlog::sinks::basic_file_sink_mt>(name,
file_name);
// 格式应用到所有注册的logger
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [thread %t] %v");
combined_logger->flush_on(spdlog::level::info);
}
return combined_logger;
}