栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

287-重写C++muduo库(日志代码:Logger.h & Logger.cc)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

287-重写C++muduo库(日志代码:Logger.h & Logger.cc)

日志代码 1、Logger.h
  • 使用格式化字符的方式!
  • 在写宏的代码时,分多行的话,每行的末尾都要加,且的后面不能加空格。
  • 我们系统的变量很多都写_开头,我们书写定义成员变量把_放在末尾,去和系统的变量不产生冲突,而且为了区分函数内的变量(局部变量)。

我们创建Logger.h

#pragma once

#include 

#include "noncopyable.h"

//LOG_INFO("%s %d", arg1, arg2)
//__VA_ARGS__获取可变参的宏
//logmsgFormat:字符串,后面...是可变参
#define LOG_INFO(logmsgFormat, ...) 
    do 
    { 
        Logger &logger = Logger::instance(); 
        logger.setLogLevel(INFO); 
        char buf[1024] = {0}; 
        snprintf(buf, 1024, logmsgFormat, ##__VA_ARGS__); 
        logger.log(buf); 
    } while(0) 

#define LOG_ERROR(logmsgFormat, ...) 
    do 
    { 
        Logger &logger = Logger::instance(); 
        logger.setLogLevel(ERROR); 
        char buf[1024] = {0}; 
        snprintf(buf, 1024, logmsgFormat, ##__VA_ARGS__); 
        logger.log(buf); 
    } while(0) 

#define LOG_FATAL(logmsgFormat, ...) 
    do 
    { 
        Logger &logger = Logger::instance(); 
        logger.setLogLevel(FATAL); 
        char buf[1024] = {0}; 
        snprintf(buf, 1024, logmsgFormat, ##__VA_ARGS__); 
        logger.log(buf); 
        exit(-1); 
    } while(0) 

#ifdef MUDEBUG
#define LOG_DEBUG(logmsgFormat, ...) 
    do 
    { 
        Logger &logger = Logger::instance(); 
        logger.setLogLevel(DEBUG); 
        char buf[1024] = {0}; 
        snprintf(buf, 1024, logmsgFormat, ##__VA_ARGS__); 
        logger.log(buf); 
    } while(0) 
#else
    #define LOG_DEBUG(logmsgFormat, ...)
#endif

//定义日志的级别  INFO(正常的日志输出)  ERROR(错误,不影响软件继续向下执行)
//  FATAL(毁灭性的打击,系统无法正常向下运行)  DEBUG(调试信息,一般是关闭的) 
enum LogLevel
{
    INFO, //普通信息
    ERROR,//错误信息
    FATAL,//core信息
    DEBUG,//调试信息
};

//输出一个日志类
class Logger : noncopyable
{
public:
    //获取日志唯一的实例对象
    static Logger& instance();
    //设置日志级别
    void setLogLevel(int level);
    //写日志
    void log(std::string msg);
private:
    int logLevel_;
};

Timestamp里面有两个重要的方法:
now():获取当前时间
使用int64_t的长整型microSecondsSinceEpoch变量来存储的!

tostring():将长整型时间microSecondsSinceEpoch进行转换,转换成年月日,时分秒


DEBUG调试信息会非常多,对调试信息一般运行起来,默认是关闭的,通过宏来进行打开 :

定义了MUDEBUG就正常输出调试信息,没有定义MUDEBUG就输出为空!

2、Logger.cc
#include "Logger.h"
#include "Timestamp.h"

#include 

//获取日志唯一的实例对象
Logger& Logger::instance()
{
    static Logger logger;
    return logger;
}

//设置日志级别
void Logger::setLogLevel(int level)
{
    logLevel_ = level;
}

//写日志  [级别信息] time : msg
void Logger::log(std::string msg)
{
    switch (logLevel_)
    {
    case INFO:
        std::cout << "[INFO]";
        break;
    case ERROR:
        std::cout << "[ERROR]";
        break;
    case FATAL:
        std::cout << "[FATAL]";
        break;
    case DEBUG:
        std::cout << "[DEBUG]";
        break;
    default:
        break;
    }

    //打印时间和msg
    std::cout << Timestamp::now().toString() << " : " << msg << std::endl;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928687.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号