工具类库系列(七)-Logger

第七个工具类:Logger


就是用于输出日志的一个工具类,很简单,就是封装了一下boost库的log


不熟悉boost的log库的同学,可能就需要提前熟悉一下


本工具类,就是默认用exe的文件名比如“Test.exe”加上“_log”,组成一个文件夹名称“Test.exe_log”,

在Test.exe的同级目录下,创建这个文件夹“Test.exe_log”,所有的log都会输出到这个文件夹(这里就用到了之前的ExePath


每个log对象,会有一个sinkname,用于将不同的日志输出到不同的文件中

比如,定义两个logger对象:

Logger g_SystemLog("System");
Logger g_LogicLog("Logic");


则向g_SystemLog输出的日志信息,将会输出到Test.exe_log/System_年月日.log的文件中

g_LogicLog输出的日志信息,将会输出到Test.exe_log/Logic_年月日.log的文件中


日志文件最后的那个后缀“_年月日”,会按照系统时间,每天换一次,即每到每天的00:00:00

则会以新的日期自动生成一个新文件


具体的日志输出用宏:

比如 :LOG_INFO(g_SystemLog) << "你要输出的日志";


示例代码

#include "Logger.h"

using namespace common::tool;

Logger g_SystemLog("System");

int main(int argc, char* argv[])
{
	LOG_INFO(g_SystemLog) << "hello world";

	unsigned int a = 123;
	std::string b = "345";
	LOG_INFO(g_SystemLog) << "a = " << a << ", b = " << b;

	return 0;
}

输出文件:




最后完整代码:

Logger.h

#ifndef __Logger_h__
#define __Logger_h__

#include <string>
#include <boost/log/trivial.hpp>
#include <boost/log/sources/severity_channel_logger.hpp>

#define LOG_DEBUG(logObj) \
	BOOST_LOG_SEV(logObj.GetLog(), boost::log::trivial::debug) << "file:" << __FILE__ << "(" << __LINE__ << "):" << __FUNCTION__ << ":"
#define LOG_INFO(logObj) \
	BOOST_LOG_SEV(logObj.GetLog(), boost::log::trivial::info) << "file:" << __FILE__ << "(" << __LINE__ << "):" << __FUNCTION__ << ":"
#define LOG_ERROR(logObj) \
	BOOST_LOG_SEV(logObj.GetLog(), boost::log::trivial::error) << "file:" << __FILE__ << "(" << __LINE__ << "):" << __FUNCTION__ << ":"
#define LOG_WARNING(logObj) \
	BOOST_LOG_SEV(logObj.GetLog(), boost::log::trivial::warning) << "file:" << __FILE__ << "(" << __LINE__ << "):" << __FUNCTION__ << ":"

namespace common{
	namespace tool{

		class Logger
		{
		public:
			Logger(const std::string& sink);
			~Logger();

			boost::log::sources::severity_channel_logger<boost::log::trivial::severity_level, std::string>& GetLog()
			{
				return m_log;
			}

		private:
			void Init(const std::string& dir);

			boost::log::sources::severity_channel_logger<boost::log::trivial::severity_level, std::string> m_log;
			std::string m_SinkName;
		};

	}
}

#endif

Logger.cpp

#include "Logger.h"

#include <boost/filesystem.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 <boost/log/sinks/text_ostream_backend.hpp>  
#include <boost/log/attributes/named_scope.hpp>  
#include <boost/log/expressions.hpp>  
#include <boost/log/support/date_time.hpp>  
#include <boost/log/detail/format.hpp>  
#include <boost/log/detail/thread_id.hpp>

#include "ExePath.h"

BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level>)

namespace common{
	namespace tool{

		Logger::Logger(const std::string& sink) : m_SinkName(sink), m_log(boost::log::keywords::channel = sink)
		{
			std::string fullName = GetExePathAndName();
			fullName += "_log";
			Init(fullName);
		}

		Logger::~Logger()
		{

		}

		void Logger::Init(const std::string& dir)
		{
			if (!boost::filesystem::exists(dir))
			{
				boost::filesystem::create_directories(dir);
			}

			boost::shared_ptr<boost::log::sinks::text_file_backend> backend = boost::make_shared<boost::log::sinks::text_file_backend>(
				boost::log::keywords::open_mode = std::ios::app,
				boost::log::keywords::file_name = dir + "/" + m_SinkName + "_%Y%m%d.log",
				boost::log::keywords::rotation_size = 10 * 1024 * 1024,
				boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0));

			typedef boost::log::sinks::synchronous_sink<boost::log::sinks::text_file_backend> TextSink;
			boost::shared_ptr<TextSink> sink(new TextSink(backend));
			sink->set_formatter(
				boost::log::expressions::format("[%1% %2% %3%]:%4%")
				% boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
				% boost::log::expressions::attr<boost::log::aux::thread::id>("ThreadID")
				% boost::log::expressions::attr<boost::log::trivial::severity_level>("Severity")
				% boost::log::expressions::smessage);
			sink->set_filter(boost::log::expressions::attr<std::string>("Channel") == m_SinkName);
			sink->locked_backend()->auto_flush(true);

			boost::log::core::get()->add_sink(sink);

			boost::log::add_common_attributes();
		}

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值