当前位置: 首页 > article >正文

c++日志单例实现

为了使项目的所有日志都打印到同一个日志中,必须使得所有类使用同一个日志,因此将日志类实现为单例。

.h文件

#pragma once

#include<fstream>

class LogHablee
{
private:
	LogHablee(std::string& dbg_dir);
	LogHablee(const LogHablee&) = delete;
	LogHablee& operator=(const LogHablee&) = delete;


	static LogHablee* _ins;	

public:
	void getNowTimePrefix(std::string& now_time_prefix);


public:
	static LogHablee* getInstance(std::string& dbg_dir)
	{
		if (_ins == nullptr)
		{
			_ins = new LogHablee(dbg_dir);
		}
		return _ins;
	}

	std::ofstream log;
};

.cpp文件

#include "LogHablee.h"
#include<string>


LogHablee* LogHablee::_ins = nullptr;

LogHablee::LogHablee(std::string& dbg_dir)
{
	std::string nowTimePrefix;
	getNowTimePrefix(nowTimePrefix);

	std::string logFilePath(dbg_dir + "/" + nowTimePrefix + "_log.txt");
	this->log.open(logFilePath, std::ios::trunc);
}

void LogHablee::getNowTimePrefix(std::string& now_time_prefix)
{
	std::time_t now_time;
	struct tm* p = new tm;
	std::time(&now_time);
	localtime_s(p, &now_time);
	int year = p->tm_year + 1900;
	int month = p->tm_mon + 1;
	int day = p->tm_mday;
	int hour = p->tm_hour;
	int minute = p->tm_min;
	int second = p->tm_sec;
	delete p;
	// 20221130_134024: 2022年11月30日13点40分24秒
	now_time_prefix = std::to_string(year)
		+ std::string(2 - std::to_string(month).length(), '0') + std::to_string(month)
		+ std::string(2 - std::to_string(day).length(), '0') + std::to_string(day)
		+ "_"
		+ std::string(2 - std::to_string(hour).length(), '0') + std::to_string(hour)
		+ std::string(2 - std::to_string(minute).length(), '0') + std::to_string(minute)
		+ std::string(2 - std::to_string(second).length(), '0') + std::to_string(second);
}

另一个使用到log的类的.h文件

#pragma once
#include<string>


class AClass
{
public:
	AClass(std::string& dbg_dir):_dbgDir(dbg_dir) {}

	void test();

private:
	std::string _dbgDir;
};

# 另一个使用到log的类的.cpp文件

#include "AClass.h"
#include"LogHablee.h"

void AClass::test()
{
	std::string nowTimePrefix;

	LogHablee* pHablee = LogHablee::getInstance(this->_dbgDir);

	pHablee->getNowTimePrefix(nowTimePrefix);
	pHablee->log << nowTimePrefix
		<< ": in AClass::test function"
		<< std::endl;
}

main函数

#include"LogHablee.h"
#include<iostream>
#include"AClass.h"

int main()
{
	std::string nowTimePrefix;

	std::string dbgDir("./");
	LogHablee* pHablee = LogHablee::getInstance(dbgDir);


	pHablee->getNowTimePrefix(nowTimePrefix);
	pHablee->log << nowTimePrefix
		<< ": PROGRAM START, version 1.0.0.0"
		<< std::endl;


	AClass a(dbgDir);
	a.test(); // a.test()里面的日志内容也会写入到一开始创建的日志中

	return 0;
}

http://www.kler.cn/a/147227.html

相关文章:

  • 基于SpringBoot的旅游网站(程序+数据库+报告)
  • GitLab 降级安装出现 500 错误,如何解决?
  • mybatis-plus: mapper-locations: “classpath*:/mapper/**/*.xml“配置!!!解释
  • torchvision库在进行图片转换操作中报antialias参数没有显式设置会导致不同图片后端中的值不统一的警告信息
  • 《C语言程序设计现代方法》note-5 数组
  • onlyoffice Command service(命令服务)使用示例
  • Mysql解决随机选取问题
  • 前端入门(三)Vue生命周期、组件原理、脚手架、插槽插件、存储、组件事件、动画、跨域与代理
  • docker部署flask服务
  • 【Docker】从零开始:11.Harbor搭建企业镜像仓库
  • VM安装Centos
  • ## spring-@Autowired实现
  • Python实现WOA智能鲸鱼优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战
  • 【硬核HeyGen平替】在window平台上使用MyHeyGen
  • 第13周 预习、实验与作业:Java网络编程
  • 技术人如何实现颠覆式成长
  • kafka2.x常用命令:创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费
  • C语言:输出所有“水仙花数”。“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身,如153=1^3 +5^3+3^3
  • 深度强化学习(Double DQN)
  • 正则表达式详解
  • 深度学习之十一(扩散模型--Diffusion Variational Autoencoder,DVAE)
  • 3D数字孪生场景编辑器
  • 51单片机的智能窗帘系统【含proteus仿真+程序+报告+原理图】
  • 软件建模与文档:架构师怎样绘制系统架构蓝图?
  • 2023_Spark_实验二十一:Zookeeper单机安装与配置
  • python:傅里叶分析,傅里叶变换 FFT