1. 程式人生 > >boost::log庫,示例程式碼

boost::log庫,示例程式碼

測試環境:

[1]boost 1.57

[2]VS2013Update3

主要來源
[1]boost官網,做了些微小的改動。

最簡單的示例

// TestBoostLog.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>

#include <boost/log/trivial.hpp>

//////////////////////////////////////////////////////////////////////////
// Title: Test Boost Log, Example 1
// Environment: VS2013Upate4, boost 1.57
// description: output trace to the console!
//////////////////////////////////////////////////////////////////////////
// The example dependent 6 boost library
// boost_chrono
// boost_date_time
// boost_filesystem
// boost_log
// boost_system
// boost_thread
//////////////////////////////////////////////////////////////////////////

namespace logging = boost::log;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace sinks = boost::log::sinks;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;


int _tmain(int argc, _TCHAR* argv[])
{
	BOOST_LOG_TRIVIAL(trace) << "測試中文能否正確輸出(GBK編碼)";

	BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
	BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
	BOOST_LOG_TRIVIAL(info) << "An informational severity message";
	BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
	BOOST_LOG_TRIVIAL(error) << "An error severity message";
	BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";


	std::cin.get();

	return 0;
}


最實用的示例

#include "KagulaLog.h"


#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/record_ostream.hpp>

namespace logging = boost::log;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;


//[ example_tutorial_file_advanced
void init()
{
	auto file_sink = logging::add_file_log
		(
		keywords::file_name = "sample_%N.log",                                        /*< file name pattern >*/
		keywords::rotation_size = 10 * 1024 * 1024,                                   /*< rotate files every 10 MiB... >*/
		keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0), /*< ...or at midnight >*/
		keywords::format = "[%TimeStamp%]: %Message%"                                 /*< log record format >*/
		);

	file_sink->locked_backend()->set_file_collector(sinks::file::make_collector(
		keywords::target = "logs",        //folder name.
		keywords::max_size = 50 * 1024 * 1024,    //The maximum amount of space of the folder.
		keywords::min_free_space = 100 * 1024 * 1024  //Reserved disk space minimum.
		));

	file_sink->locked_backend()->scan_for_files();
	
	logging::core::get()->set_filter
	(
		logging::trivial::severity >= logging::trivial::info
	);
}
//]


namespace kagula
{
	void test()
	{
		init();
		logging::add_common_attributes();

		using namespace logging::trivial;
		src::severity_logger< severity_level > lg;

		BOOST_LOG_SEV(lg, trace) << "A trace severity message (測試中文能否正確輸出(GBK編碼))";
		BOOST_LOG_SEV(lg, debug) << "A debug severity message";
		BOOST_LOG_SEV(lg, info) << "An informational severity message";
		BOOST_LOG_SEV(lg, warning) << "A warning severity message";
		BOOST_LOG_SEV(lg, error) << "An error severity message";
		BOOST_LOG_SEV(lg, fatal) << "A fatal severity message";
		BOOST_LOG_SEV(lg, fatal) << "測試中文能否正確輸出(GBK編碼)";
	}
}


多執行緒示例

/*
*          Copyright Andrey Semashev 2007 - 2013.
* Distributed under the Boost Software License, Version 1.0.
*    (See accompanying file LICENSE_1_0.txt or copy at
*          http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file   main.cpp
* \author Andrey Semashev
* \date   30.08.2009
*
* \brief  An example of asynchronous logging with bounded log record queue in multiple threads.
*/

// #define BOOST_LOG_DYN_LINK 1

#include <stdexcept>
#include <string>
#include <iostream>
#include <fstream>
#include <functional>
#include <boost/ref.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/barrier.hpp>

#include <boost/log/common.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/sinks.hpp>
#include <boost/log/sources/logger.hpp>
#include <boost/log/utility/empty_deleter.hpp>
#include <boost/log/utility/record_ordering.hpp>

namespace logging = boost::log;
namespace attrs = boost::log::attributes;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace expr = boost::log::expressions;
namespace keywords = boost::log::keywords;

using boost::shared_ptr;

enum
{
	LOG_RECORDS_TO_WRITE = 10000,
	THREAD_COUNT = 2
};

BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(test_lg, src::logger_mt)

//! This function is executed in multiple threads
void thread_fun(boost::barrier& bar)
{
	// Wait until all threads are created
	bar.wait();

	// Here we go. First, identify the thread.
	BOOST_LOG_SCOPED_THREAD_TAG("ThreadID", boost::this_thread::get_id());

	// Now, do some logging
	for (unsigned int i = 0; i < LOG_RECORDS_TO_WRITE; ++i)
	{
		BOOST_LOG(test_lg::get()) << "Log record " << i;
	}
}

int main(int argc, char* argv[])
{
	try
	{
		// Open a rotating text file
		shared_ptr< std::ostream > strm(new std::ofstream("test.log"));
		if (!strm->good())
			throw std::runtime_error("Failed to open a text log file");

		// Create a text file sink
		typedef sinks::text_ostream_backend backend_t;
		typedef sinks::asynchronous_sink<
			backend_t,
			sinks::bounded_ordering_queue<
			logging::attribute_value_ordering< unsigned int, std::less< unsigned int > >,
			128,                        // queue no more than 128 log records
			sinks::block_on_overflow    // wait until records are processed
			>
		> sink_t;
		shared_ptr< sink_t > sink(new sink_t(
			boost::make_shared< backend_t >(),
			// We'll apply record ordering to ensure that records from different threads go sequentially in the file
			keywords::order = logging::make_attr_ordering("RecordID", std::less< unsigned int >())));

		sink->locked_backend()->add_stream(strm);

		sink->set_formatter
			(
			expr::format("%1%: [%2%] [%3%] - %4%")
			% expr::attr< unsigned int >("RecordID")
			% expr::attr< boost::posix_time::ptime >("TimeStamp")
			% expr::attr< boost::thread::id >("ThreadID")
			% expr::smessage
			);

		// Add it to the core
		logging::core::get()->add_sink(sink);

		// Add some attributes too
		logging::core::get()->add_global_attribute("TimeStamp", attrs::local_clock());
		logging::core::get()->add_global_attribute("RecordID", attrs::counter< unsigned int >());

		// Create logging threads
		boost::barrier bar(THREAD_COUNT);
		boost::thread_group threads;
		for (unsigned int i = 0; i < THREAD_COUNT; ++i)
			threads.create_thread(boost::bind(&thread_fun, boost::ref(bar)));

		// Wait until all action ends
		threads.join_all();

		// Flush all buffered records
		sink->stop();
		sink->flush();

		return 0;
	}
	catch (std::exception& e)
	{
		std::cout << "FAILURE: " << e.what() << std::endl;
		return 1;
	}
}


相關推薦

boost::log示例程式碼

測試環境: [1]boost 1.57 [2]VS2013Update3 主要來源 [1]boost官網,做了些微小的改動。 最簡單的示例 // TestBoostLog.cpp : Defines the entry point for the console app

python:簡單爬蟲示例含分析文件程式程式碼

環境:ubantu18.04,mysql5.7,python3.6 1.分析文件 1.1 目標 爬取笑話集-最新兒童笑話大全前三頁的笑話題目,訪問量,發表時間 1.2 URL 第一頁:www.jokeji.cn/list7_1.htm 第三頁:www.jokej

boost thread奇怪的文件沒有Tutorial的但是卻仍然相當強大

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

常用的670個Python示例程式碼(快速上手+必備收藏)

一個不錯的搜尋Example的網站:http://www.programcreek.com/python/ 通過分析github上5000個開源python專案,找出最常用的庫。下面是前670個。括號裡的數字代表出現的頻率,最大為5000。

boost log學習一

對日誌的思考 為什麼需要日誌? 如今的應用程式都非常大,程式碼變得難以測試及除錯。而且更多的時候,這些程式執行在遠離開發人員的遠處,使得開發人員幾乎沒有機會監視程式的執行情況,並且一旦發生錯誤,很難找出錯誤的原因。此外,如果應用程式行為嚴重依非同步事件,

boost log使用 十二 架構研究和主要使用總結

架構下面是boost log庫的架構圖:簡單使用 下面總結一下和這個架構相關的知識:如何獲得Logging core#include <boost/log/core.hpp> ... boost::shared_ptr<logging::core> c

boost log學習使用三(輸出日誌到檔案)

程式日誌帶來的問題? 上面幾個例子都是將日誌資訊輸出到控制檯上,實際應用中不常用,最常用的情況是我們將日誌資訊輸出到文字檔案中,方便我們以後檢視,同時程式不執行時日誌資訊也不會丟掉。輸出到檔案中後,又帶來一些問題。假如程式一直執行,日誌資訊就要無限的記錄下去嗎

boost log使用六

這次演示如何在一個程式中使用兩個sink. 這兩個sink有不同的filter,生成兩個日誌檔案,採用不同的日誌格式。完整程式碼如下:#include <fstream> #include <boost/shared_ptr.hpp> #include

前端介面操作資料表(知識點描述思維導圖示例程式碼效果截圖)

SqlConnection sqlConnection = new SqlConnection(); //宣告並例項化SQL連線; sqlConnection.ConnectionString

libJPEG-turbo使用示例程式碼

1 #include <iostream> 2 #include <stdio.h> 3 #include <setjmp.h> 4 #include <string.h> 5 #include <stdlib.h&g

Android Architecture 1 -- Guide to App Architecture(App架構入門示例程式碼演示)

面臨的問題 Android的各大元件可以隨意跳轉,可不遵守順序。比如QQ分享調相簿APP,相簿APP跳檔案管理APP。 還可能被系統殺死。所以最好 you should not store any app data or state in your app

boost log使用一

pan 需要 tail 文件 ios key logs ger 結果 我的英文博客參考:http://csfreebird.blogspot.com/2013/12/use-boost-log-step1.html 我過去習慣使用cppcms提供的日誌庫,簡單好用。從1.

boost log學習二(日誌過濾)

為什麼要日誌分級,日誌過濾? 在程式中,經常將日誌分級,比如以下boost log常用的分級,當然我們可以根據自己需要新增或刪除一些日誌等級,後面的文章會講到。日誌分級的好處有很多,比如使日誌讀起來更加清晰,程式出錯時,我們就可以首先檢視error等級以上的日

CGOGOLANG呼叫C呼叫程式碼、靜態或動態

CGO CGO可以讓golang和c互相呼叫,譬如x264或者aac編解碼,用go再實現一遍比較麻煩,直接呼叫c的函式會更合適。 CGO可以直接用C的程式碼,或者C的靜態庫,或者動態庫,當然C++也是可以的。 在import “C”之前加pre

boost log使用四

現在,將boost log應用到一個已經存在的C++程式中用來替代CppCMS log。我用它完成一些任務,單個日誌檔案尺寸小於10M,磁碟剩餘空間最小要保持3G。要達到這個目的,有些事情需要注意:1. 包含正確的標頭檔案:#include <boost/log/cor

Boost log

本文首先介紹了boost.log的幾個重要的概念,然後分析其框架結構,最後詳細解析了一段示例程式碼,並總結了將boost.log應用到自己的程式中時的步驟。 1. 幾個概念 日誌記錄:一個獨立的訊息包,這個訊息包還不是實際寫到日誌裡的訊息,它只是一個候選的訊息。 屬性:日

Boost log的使用

1. Boost的log庫最簡單的用法 #include <boost/log/trivial.hpp> void log_test() { BOOST_LOG_TRIVIAL(trace) << "A trace sev

mongoDB官網中Storing Log Data的python示例程式碼有誤

如題,    在這篇文章中的python程式碼中, 構造一個記錄的程式碼如下:     >>> event = { ... _id: bson.ObjectId(), ... host: "127.0.0.1"

使用boost無法釋放udp端口的問題

timeout udp端口 p s image logs 來講 red 本地 spa 在使用boost的socket封裝庫的時候,遇見一個奇怪的問題,就是關閉boost的udp socket,但是 udp的端口一直沒有釋放,這是一個很嚴重的問題,因為對於服務器來講,由於一直

Boost 1.59.0 編譯支援Python3的連結生成vc120或vc140

Boost 1.59.0 編譯支援Python3的連結庫,生成vc120或vc140 官方編譯的Boost中只帶了Python2的連結庫,Python3的連結庫需要自己特別編譯,官方編譯版下載地址:http://sourceforge.net/projects/boost/files/boo