工具类库系列(七)-Logger
来源:互联网 发布:酒店管理系统sql语句 编辑:程序博客网 时间:2024/06/14 09:06
第七个工具类: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();}}}
0 0
- 工具类库系列(七)-Logger
- 开源工具库Logger的使用
- ZooKeeper系列之七:ZooKeeper命令行工具
- ZooKeeper系列之七:ZooKeeper命令行工具
- ZooKeeper系列之七:ZooKeeper命令行工具
- ZooKeeper系列之七:ZooKeeper命令行工具
- jvm系列(七):jvm调优-工具篇
- jvm系列(七):jvm调优-工具篇
- jvm系列(七):jvm调优-工具篇
- jvm系列(七):jvm调优-工具篇
- 数据库MySql类库系列(七)-PrepareOperatorSelect
- Android使用BuildConfig类制作Logger工具类
- Code Fragment-设置自己的Logger工具类
- Logger-功能强大使用方便的Log日志打印工具类
- Logger类
- 【强烈推荐】开源C#工具类MSCL系列(七)Date时间日期帮助类
- 【玩转SQLite系列】(七)打造轻量级ORM工具类SQLiteDbUtil操作数据库
- 【玩转SQLite系列】(七)打造轻量级ORM工具类SQLiteDbUtil操作数据库
- 使用任务并行库(1)
- 验证码
- 小程序的初体验
- Xshell 5鼠标选中,终端立即退出(ctrl+c)
- Model 连贯操作
- 工具类库系列(七)-Logger
- openwrt 查看 lan口的 UP,DOWN 状态
- RxJava理解系列(三)--subscribeOn
- 万网域名修改 DNS 方法
- HTML5学习笔记7-增强的页面元素
- datanode 下线步骤
- 查询操作及参数传递
- ExtJS学习笔记(一) Panel
- 艺术编程-技术之声第三期