code_scanner/common/log_util.h

68 lines
1.5 KiB
C++

#pragma once
// log utility
//
// created on 2022-11-30
//
#include "referer.h"
#include <string>
#include <memory>
#define SIZE_KB(n) (n) * 1024
#define SIZE_MB(n) SIZE_KB((n) * 1024)
#define SIZE_GB(n) SIZE_MB((n) * 1024)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// object event
//
enum log_level
{
LOG_LEVEL_ALL = 0,
LOG_LEVEL_DEBUG,
LOG_LEVEL_WARNING,
LOG_LEVEL_FATAL,
};
class log_cls
{
std::string file_;
int32_t max_size_;
log_level level_;
MUTEX lock_;
FILE *dst_;
static log_cls* inst_;
void create_log_file(void);
protected:
log_cls(const char* path_file, log_level level, int32_t max_size);
~log_cls();
void log_internal(const char* txt);
public:
static void initialize(const char* path_file, log_level level = LOG_LEVEL_ALL, int32_t max_size = SIZE_MB(10));
template<typename ... Args>
static void log(log_level level, const char* fmt, Args ... args)
{
if (level >= log_cls::get_log_level() && log_cls::inst_)
{
size_t size = snprintf(nullptr, 0, fmt, args ...) + 1;
std::unique_ptr<char[]> buf(new char[size]);
snprintf(buf.get(), size, fmt, args ...);
log_cls::inst_->log_internal(buf.get());
}
}
static int32_t log_when_err(int32_t err, const char* oper_desc, log_level level = LOG_LEVEL_WARNING); // log as: oper_desc = strerror(errno)\n. return real error number errno
static log_level get_log_level(void);
static std::string get_log_file(void);
};