我想知道我们可以通过执行某些功能或使用add_file_log
函数为每个线程创建单独的日志文件。
以下程序根据创建的线程数创建多个日志文件。但是我们正在执行相同数量的相同代码。对于大量线程,它可能会导致应用程序速度变慢。
#include <iostream>
#include <boost/move/utility.hpp>
#include <boost/log/sources/logger.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <cstring>
#include <stdlib.h>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
namespace logging = boost::log;
namespace src = boost::log::sources;
namespace keywords = boost::log::keywords;
int count = 0;
class class_logging {
public:
void logging_function() {
char filename[15] = "sample";
char extension[5] = ".log";
int c = count++;
char num[10];
std::sprintf(num, "%d", c);
std::strcat(filename, num);
std::strcat(filename, extension);
logging::add_file_log(filename);
logging::add_common_attributes();
src::logger lg;
logging::record rec = lg.open_record();
if (rec) {
logging::record_ostream strm(rec);
strm << "Count Value :" << c;
strm.flush();
lg.push_record(boost::move(rec));
}
}
};
int main(int, char* []) {
class_logging object[100];
int total;
std::cout << "\nEnter no. of threads to produce : ";
std::cin >> total;
for (int i = 0; i < total; i++) {
boost::thread thread1(&class_logging::logging_function, &object[i]);
std::cout << "\nThread " << i
<< " is created whose id is : " << thread1.get_id();
thread1.join();
std::cout << "\nThread " << i << " is done...";
thread1.detach();
}
return 0;
}
Q-1)有没有办法动态创建日志文件?
答案 0 :(得分:0)
实质上,在给定执行的个别(此处为线程)任务的情况下将日志写入单独的文件没有任何问题。如果卷太多,减少日志记录将有助于减少日志文件数量。
另一个策略是将一个线程专用于日志记录。然后将所有日志消息发送到该线程/任务以进行处理。它可以使用生产者/消费者模式实现。
在日志记录中添加时间戳也是一个好主意。它将有助于您可能需要处理的任何排序问题或日志。
在这行代码中count
看起来有一个竞争条件:int c = count++;
增量不是原子的。
我会在创建时将“count”传递给线程,或者将count
变量修改为原子(使用std::atomic
types之一)。
std::atomic<int> count = 0;
答案 1 :(得分:0)
我想知道我们可以通过执行某些功能或使用add_file_log函数为每个线程创建单独的日志文件。
我对这个升级lib不熟悉。如果你想要一个线程的本地变量,你可以使用thread_local
see this page
以下程序根据创建的线程数创建多个日志文件。但是我们正在执行相同数量的相同代码。它可能会导致大量线程的应用程序速度变慢
正确和错误:线程不会因执行相同的代码而变慢。线程通过共享资源相互减慢。我想到的主要资源是cpu核心和内存。
Q-1)有没有办法动态创建日志文件?
在您的代码中,您应该使用以下内容int count
:
std::atomic<int> count = 0;
...
int c = count.fetch_add(1); // this is thread safe
int c = ++count; // or this
您不必在代码的末尾调用thread1.detach();
。在thread1.join()之后; thread1已经停止。
答案 2 :(得分:0)
是的,可以通过给出单独的名称likethis,
为每个文件创建单独的日志文件void ownlogger::start_logger(LPSTR filename, LPSTR file_location)
{
logging::add_file_log
(
keywords::file_name = filename, /*< file name pattern >*/
keywords::time_based_rotation = sinks::file::rotation_at_time_interval(boost::posix_time::seconds(6)),
keywords::format =
(
expr::stream
//<< std::hex //To print the LineID in Hexadecimal format
<< std::setw(8) << std::setfill('0')
<< expr::attr< unsigned int >("LineID")
<< "\t"
<< expr::format_date_time<boost::posix_time::ptime>("TimeStamp","%H:%M:%S.%f")
<< "\t: <" << logging::trivial::severity
<< "> \t" << expr::smessage
)
)->locked_backend()->set_file_collector
(
sinks::file::make_collector
(
keywords::target = file_location,
keywords::max_size = 5 * 1024 * 1024 // just for test limit to 5M
)
);
logging::add_common_attributes();
WRITE_TO_LOG << "Logger Starts";
}
此处文件名(ieargument)可能每次都有不同的。