我们可以为boost库

时间:2016-02-02 07:19:02

标签: c++ multithreading logging boost

我想知道我们可以通过执行某些功能或使用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)有没有办法动态创建日志文件?

3 个答案:

答案 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核心和内存。

  1. 内存:确实线程在内存中使用(一次读取/一次写入或两次写入)相同的变量时可能会变慢(即使没有锁定/互斥锁)。你可以阅读这个“eliminate false sharing
  2. Cpu:线程正在共享cpu,一次只能有一个线程在一个核心上运行。因此,如果有多个线程主动运行,而不是计算机上的核心,它们会相互减慢速度。操作系统必须停止执行一个让下一个运行一会儿等等...... see schedulingsee context switch
  3.   

    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)可能每次都有不同的。