C++应用日志模块(printf风格,基于easylogging++,单例封装,谷歌C++规范)

目录

 

1 概述

2 实现

3 使用示例


1 概述

基于easylogging++,单例封装。使用谷歌C++编码规范。easylogging++短小精悍,屡试不爽,在此不作过多介绍。

2 实现

先到https://gitee.com/mirrors/easylogging/tree/master/src  或者 https://github.com/amrayn/easyloggingpp 下载easylogging++源码,就一个头文件和一个源文件,直接包含到工程内。

2.1 logger.h

// logger.h
// ...
//
// Created by xxx on 2021/3/28.
// Copyright 2021 xxx, Inc. All rights reserved.
//
#ifndef LOGGER_LOGGER_H_
#define LOGGER_LOGGER_H_

#include <memory>

#ifndef LOGGING
#define LOGGING Logger::self()
#endif

enum LogLevel {
  L_INFO = 0,
  L_DEBUG = 1,
  L_ERROR = 2,
  L_WARNING = 3
};

class Logger {
 public:
  static std::shared_ptr<Logger> self();
  ~Logger();
  void Log(LogLevel level, const char *format, ...);
 private:
  Logger();
  Logger(const Logger&) {}
  Logger & operator=(const Logger &) {}

 private:
  static std::shared_ptr<Logger> self_;
};

#endif  // LOGGER_LOGGER_H_

2.2 logger.cpp

// logger.cpp
// ...
//
// Created by xxx on 2021/3/28.
// Copyright 2021 xxx, Inc. All rights reserved.
//
#include "logger/logger.h"
#include "easyloggingpp/easylogging++.h"

INITIALIZE_EASYLOGGINGPP

std::shared_ptr<Logger> Logger::self_ = nullptr;
std::shared_ptr<Logger> Logger::self() {
  if (self_ == nullptr) {
      self_ = std::shared_ptr<Logger>(new Logger());
  }
  return self_;
}

Logger::Logger() {
  el::Configurations conf("etc/app_log.conf");
  el::Loggers::reconfigureAllLoggers(conf);
}

Logger::~Logger() {
}

void Logger::Log(LogLevel level, const char *format, ...) {
  el::Logger* logger = el::Loggers::getLogger("default");
  if (logger == nullptr)
      return;
  if (format == nullptr)
      return;

  int max_log_size = logger->typedConfigurations()->maxLogFileSize(
    el::Level::Global);

  switch (level) {
  case L_INFO:
      max_log_size = logger->typedConfigurations()->maxLogFileSize(
        el::Level::Info);
      break;
  case L_DEBUG:
      max_log_size = logger->typedConfigurations()->maxLogFileSize(
        el::Level::Debug);
      break;
  case L_WARNING:
      max_log_size = logger->typedConfigurations()->maxLogFileSize(
        el::Level::Warning);
      break;
  case L_ERROR:
      max_log_size = logger->typedConfigurations()->maxLogFileSize(
        el::Level::Error);
      break;
  default:
      break;
  }

  char *str = new char[max_log_size];
  if (str == nullptr)
    return;

  memset(str, 0, max_log_size);

  va_list ap;
  va_start(ap, format);
  vsnprintf(str, max_log_size, format, ap);
  va_end(ap);

  switch (level) {
  case L_INFO:
      LOG(INFO) << str;
      break;
  case L_DEBUG:
      LOG(DEBUG) << str;
      break;
  case L_WARNING:
      LOG(WARNING) << str;
      break;
  case L_ERROR:
      LOG(ERROR) << str;
      break;
  default:
      break;
  }

  delete[] str;
}

2.3 app_log.conf

* GLOBAL:  
    ENABLED                 =   true  
    TO_FILE                 =   true  
    TO_STANDARD_OUTPUT      =   true  
    FORMAT                  =   "%datetime{%H:%m:%s:%g} [%level] %msg"  
    FILENAME                =   "log/%datetime{%Y-%M-%d}.log"  
    MILLISECONDS_WIDTH      =   3  
    PERFORMANCE_TRACKING    =   false  
    MAX_LOG_FILE_SIZE       =   1048576  
    LOG_FLUSH_THRESHOLD     =   0  
      
* TRACE:  
    FILENAME                =   "log/%datetime{%Y-%M-%d}.log"  
      
* DEBUG:  
    FILENAME                =   "log/%datetime{%Y-%M-%d}.log"  
      
* FATAL:  
    ENABLED                 =   false  
      
* ERROR:  
    FILENAME                =   "log/%datetime{%Y-%M-%d}.log"  
      
* WARNING:  
    FILENAME                =   "log/%datetime{%Y-%M-%d}.log"  
      
* INFO:  
    FILENAME                =   "log/%datetime{%Y-%M-%d}.log"  
      
* VERBOSE:  
    ENABLED                 =   false

3 使用示例

// main.cpp
// ...
//
// Created by xxx on 2021/3/28.
// Copyright 2021 xxx, Inc. All rights reserved.
//
#include "logger/logger.h"

int main(int argc , char *argv[]) {

  LOGGING->Log(L_INFO , "application start...");
  // other

  LOGGING->Log(L_INFO , "application end");
  return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值