def init_logger(log_level: str) -> None: """ Init logging system to use unified style. :param log_level: log_level: must one of [INFO ERROR WARNING DEBUG CRITICAL] """ validation_log_level = ['INFO', 'ERROR', 'WARNING', 'DEBUG', 'CRITICAL'] if log_level not in validation_log_level: raise Exception(f'{log_level} must one of {validation_log_level}') handler = logging.StreamHandler() log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(module)s.%(filename)s:%(lineno)d - %(' 'message)s') handler.setFormatter(log_format) root_logger = logging.getLogger() root_logger.setLevel(log_level) root_logger.addHandler(handler)
时间: 2024-04-25 20:27:57 浏览: 34
这是一个 Python 代码段,用于初始化日志记录系统。这个函数接受一个参数 log_level,用于指定日志记录的级别,必须是以下之一:INFO、ERROR、WARNING、DEBUG、CRITICAL。
如果 log_level 不是这些值之一,函数将抛出一个异常。
该函数将日志记录输出到标准输出流,使用统一的日志记录格式。日志记录格式包括时间戳、日志级别、记录器名称、所在模块、源文件名、源代码行号和日志信息。日志级别按照从低到高的顺序包括 DEBUG、INFO、WARNING、ERROR 和 CRITICAL。
该函数将设置根记录器的级别以及处理器和格式器。如果您想要自定义日志记录系统,可以使用该函数作为起点。
相关问题
std::shared_ptr<spdlog::logger>tes::log
看起来您想创建一个名为 "log" 的 spdlog 日志记录器,并将其存储在名为 "tes" 的命名空间中的 `shared_ptr` 中。但是,我注意到您的代码中存在一些问题。
首先,请确保已正确包含 spdlog 头文件,例如 `#include <spdlog/spdlog.h>`。
然后,您可以按照以下方式创建和使用日志记录器:
```cpp
#include <spdlog/spdlog.h>
namespace tes {
std::shared_ptr<spdlog::logger> log = spdlog::stdout_logger_mt("log");
}
int main() {
tes::log->info("Logging message"); // 使用日志记录器输出日志消息
return 0;
}
```
请注意,`stdout_logger_mt` 是 spdlog 提供的一个工厂函数,用于创建将消息输出到标准输出的日志记录器。您可以根据需要选择其他日志记录器类型和输出位置。
如果您仍然遇到错误,请提供具体的错误信息,以便我能够更好地帮助您解决问题。
#ifndef MYSPDLOG_H #define MYSPDLOG_H #include <fstream> #include <iostream> #define SPDLOG_HEADER_ONLY #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_DEBUG #include "spdlog/spdlog.h" #include "spdlog/logger.h" #include "spdlog/sinks/basic_file_sink.h" #include "spdlog/sinks/rotating_file_sink.h" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/sinks/daily_file_sink.h" class MySpdlog { public: static MySpdlog*getInstace() { static MySpdlog MySpdlogStatic; return &MySpdlogStatic; } int init() { std::string formatStr="%Y-%m-%dT%H:%M:%S.%e[%l][%s:%#][%!]%v"; // auto myLogger1 = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("spdlog", "logs/myspdlog.log", 1024 * 1024 * 10, 10); // auto myLogger1 = std::make_shared<spdlog::sinks::daily_file_sink>("spdlog", "logs/log.txt", 0, 0); auto myLogger1 = spdlog::daily_logger_mt("spdlog", "logs/log.txt", 0, 0); // myLogger1 = spdlog::rotating_logger_mt("spdlog", "logs/myspdlog.log", 1024 * 1024 * 10, 10); spdlog::set_default_logger(myLogger1); myLogger1->set_level(spdlog::level::debug); myLogger1->set_pattern(formatStr); myLogger2 = spdlog::stdout_color_mt("baseLogger2"); spdlog::set_default_logger(myLogger2); myLogger2->set_level(spdlog::level::debug); myLogger2->set_pattern(formatStr); return 0; } void uninit() { } std::shared_ptr<spdlog::logger> myLogger1; std::shared_ptr<spdlog::logger> myLogger2; private: MySpdlog() {} ~MySpdlog() {} }; #define SPLOG_INIT() MySpdlog::getInstace()->init() #define SPLOG_UNINIT() MySpdlog::getInstace()->uninit() #define SPLOG_DEBUG(...) do {SPDLOG_LOGGER_DEBUG(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_DEBUG(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPLOG_INFO(...) do {SPDLOG_LOGGER_INFO(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_INFO(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPLOG_ERROR(...) do {SPDLOG_LOGGER_ERROR(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_ERROR(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPDLOG_CLRAR(a) do{std::fstream fout((a),std::ios::out|std::ios::trunc);fout.close();}while(0); #endif // MYSPDLOG_H运行之后调用SPLOG_INFO时报错
根据您提供的代码,我看到您定义了一个名为`SPLOG_INFO`的宏,其实现方式为:
```
#define SPLOG_INFO(...) do {SPDLOG_LOGGER_INFO(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\
SPDLOG_LOGGER_INFO(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0)
```
这个宏展开后会调用`SPDLOG_LOGGER_INFO`来输出日志信息,而`SPDLOG_LOGGER_INFO`需要传入一个有效的logger对象作为第一个参数。在您的代码中,您定义了一个名为`myLogger1`的logger对象,但是您没有在宏中使用它,而是在`MySpdlog`类中以成员变量的形式定义。因此,当您调用`SPLOG_INFO`时,会找不到有效的logger对象,从而导致编译错误。
要解决这个问题,您可以将`myLogger1`和`myLogger2`定义为静态成员变量,并在`MySpdlog`类外初始化它们。然后,在宏中使用这两个静态成员变量。
例如,您可以将`MySpdlog`类的定义改为:
```
class MySpdlog {
public:
static MySpdlog*getInstace()
{
static MySpdlog MySpdlogStatic;
return &MySpdlogStatic;
}
int init()
{
std::string formatStr="%Y-%m-%dT%H:%M:%S.%e[%l][%s:%#][%!]%v";
auto myLogger1 = spdlog::daily_logger_mt("spdlog", "logs/log.txt", 0, 0);
spdlog::set_default_logger(myLogger1);
myLogger1->set_level(spdlog::level::debug);
myLogger1->set_pattern(formatStr);
auto myLogger2 = spdlog::stdout_color_mt("baseLogger2");
spdlog::set_default_logger(myLogger2);
myLogger2->set_level(spdlog::level::debug);
myLogger2->set_pattern(formatStr);
return 0;
}
void uninit()
{
}
static std::shared_ptr<spdlog::logger> myLogger1;
static std::shared_ptr<spdlog::logger> myLogger2;
private:
MySpdlog() {}
~MySpdlog() {}
};
std::shared_ptr<spdlog::logger> MySpdlog::myLogger1;
std::shared_ptr<spdlog::logger> MySpdlog::myLogger2;
```
然后,您可以在代码的其他地方使用这两个静态成员变量。例如,在`SPLOG_INFO`中,您可以这样使用:
```
#define SPLOG_INFO(...) \
do { \
SPDLOG_LOGGER_INFO(MySpdlog::myLogger1, __VA_ARGS__); \
SPDLOG_LOGGER_INFO(MySpdlog::myLogger2, __VA_ARGS__); \
} while(0)
```
这样,当您调用`SPLOG_INFO`时,就会使用正确的logger对象输出日志信息,从而避免编译错误。