- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序有几个组件,我希望每个组件都将日志写入一个单独的文件。
我想使用“文本多文件后端”,但根据文档,它不支持文件轮换。
所以我的想法是实现一个日志类并为每个组件创建一个即时并将它们存储在一个映射中,这样我就可以使用映射来获取正确的记录器实例(根据名称)并记录到正确的文件。
我已经这样做了,但这对我不起作用,我可以在所有文件中看到相同的消息(这似乎是一个全局记录器)。
这是我的代码草稿:
记录器.h
struct LogInfo{
std::string log_path;
LogLevel log_level;
long log_file_size;
int log_file_amount;
};
LogLevel stringToLogLevel(const std::string &fileType);
class Logger {
public:
Logger(const LogInfo &log_info, const std::string &component_name);
void writeToLog(LogLevel log_level, const std::string &scope, const std::string &message);
private:
void scanForFiles(const std::string &path, const std::string &component_name);
std::string pid;
std::string log_file_name;
boost::log::sources::severity_logger<boost::log::trivial::severity_level> boost_severity_logger;
};
记录器.cpp
using namespace boost::log;
using namespace std;
namespace fs = boost::filesystem;
LogLevel stringToLogLevel(const string &fileType) {
if (fileType == "TRACE")
return LOGLEVEL_TRACE;
if (fileType == "DEBUG")
return LOGLEVEL_DEBUG;
if (fileType == "INFO")
return LOGLEVEL_INFO;
if (fileType == "WARNING")
return LOGLEVEL_WARNING;
if (fileType == "ERROR")
return LOGLEVEL_ERROR;
throw invalid_argument("Unknown file type");
}
trivial::severity_level logLevelToBoostLogLevel(const LogLevel log_level) {
if (log_level == LOGLEVEL_TRACE)
return trivial::trace;
if (log_level == LOGLEVEL_DEBUG)
return trivial::debug;
if (log_level == LOGLEVEL_INFO)
return trivial::info;
if (log_level == LOGLEVEL_WARNING)
return trivial::warning;
if (log_level == LOGLEVEL_ERROR)
return trivial::error;
throw invalid_argument("Unknown log type");
}
Logger::Logger(const LogInfo &log_info, const string &component_name) {
scanForFiles(log_info.log_path, component_name);
stringstream s;
s << log_info.log_path << component_name << "_%N.log";
add_file_log(
keywords::file_name = s.str(),
keywords::rotation_size = log_info.log_file_size,
keywords::max_size = log_info.log_file_amount * log_info.log_file_size,
keywords::target = log_info.log_path,
keywords::open_mode = std::ios::out | std::ios::app,
keywords::auto_flush = true,
keywords::format =
expressions::format("[%1%] [%2%] [%3%] [%4%] %5%")
% expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
% expressions::attr<unsigned int>("ThreadID")
% expressions::attr<string>("Scope")
% trivial::severity
% expressions::smessage
);
trivial::severity_level requested_level = logLevelToBoostLogLevel(log_info.log_level);
core::get()->set_filter(
trivial::severity >= requested_level
);
add_common_attributes();
}
void Logger::writeToLog(LogLevel log_level, const std::string &scope, const std::string &message) {
BOOST_LOG_SCOPED_THREAD_ATTR("ThreadID", attributes::constant<unsigned int>(OS::getTid()));
BOOST_LOG_SCOPED_THREAD_ATTR("Scope", attributes::constant<string>(scope));
BOOST_LOG_SEV(this->boost_severity_logger, logLevelToBoostLogLevel(log_level))<< message.c_str();
}
有没有可能实现我想要的?
最佳答案
参见 this回复。其中,它描述了如何使用 channel 和过滤器来实现您想要的。
关于c++ - Boost Log 多个文件轮换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36954889/
不同的 LogCat 方法是: Log.v(); // Verbose Log.d(); // Debug Log.i(); // Info Log.w(); // Warning Log.e();
在android群里,经常会有人问我,android log是怎么用的,今天我就把从网上以及sdk里东拼西凑过来,让大家先一睹为快,希望对大家入门android log有一定的帮助. android
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 社区 12
我正在尝试使用 sonarlint 检查代码质量.上面的问题概要,我不明白为什么它要说要大写。但是 this discussion与上述建议相反。哪一个应该被认为是正确的? 最佳答案 这没有正确答案,
随着 n 变大,log*(log n) 和 log(log* n) 这两个函数会更快吗? 这里,log* 函数是迭代对数,定义如下: 我怀疑它们是相同的,只是写法不同,但它们之间有什么区别吗? 最佳答
作为家庭作业,我被要求在 O(log(n)) 中编写一个算法,我可以计算出我编写的算法的复杂度为 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + l
我正在使用 Tomee。日志文件夹包含这样的文件 localhost_access_log.2016-12-02.txt localhost.2016-12-02.log catalina.2016-
Android Log.v、Log.d、Log.i、Log.e 等的 ios 等效项是什么?同样在 android 上,我使用 Android 设备监视器和 logcat 来访问我的手机日志,我需要在
我认为下面的代码是 O(log log n) 因为它里面有 i*i 但我对 log n 感到困惑> 和 log (log n)。 for (i=2; i*i<=number; i++) { if
我正在修改 kvm 模块,并在内核代码中添加了 printk 语句。运行虚拟机后,printk 为我提供了错误地址和有关 guest 操作系统的其他信息。 我需要从这个信息中生成统计信息。当我使用 d
我有一个部署为 Windows Azure Web 角色的 WCF 服务。 我正在使用 Enterprise Library 进行异常处理,并且在我的本地 Development Fabric 中,似
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
在 Go 的生产中使用 log.SetFlags(log.LstdFlags | log.Lshortfile) 是好的做法(至少是一般做法)吗?我想知道在生产中这样做是否存在性能或安全问题。因为它不
我想知道什么更快: double value = Math.log(a) - Math.log(b); 或 double value = Math.log(a/b); 我计算值的方式是否会对性能产生影
我有数百个子例程使用 log.Println() 写入日志文件 我正在使用 log.Println 写入 error.log 文件。 func main() { e, err := os.Open
我将 Nuxt 与 SSR 一起使用,并希望有类似于 apaches 的 access.log 和 error.log 的东西 我特别感兴趣的是每次调用的响应时间。 我在 nuxt 文档中找不到任何内
我知道以前有人问过这个问题,但我相信这是一个不同的问题。 Nginx 在 www-data 下运行: $ ps -eo "%U %G %a" | grep nginx root root
我在我的日志文件中发现了一个非常奇怪的条目 Jan 29 01:35:30 vs-proj-handy sshd[5316]: Received disconnect from 130.207.203
对于我正在开发的应用程序,我希望在开发过程中和发布时简化故障排除。我希望能够检索到对 Log 的调用,以了解在 USB 调试中没有连接手机的情况下运行应用程序时的调用,以便可以检索并发送给我。例如,当
我试图捕获 panic 并记录错误: func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloRep
我是一名优秀的程序员,十分优秀!