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

c++ 简单的日志类 CCLog

此日志类,简单地实现了向标准输出控制台和文件输出日志信息的功能,并能在这两者之间进行切换输出,满足输出日志的不同需求。

代码如下:

/**  CCLog.h*  c++_common_codes**  Created by xichen on 12-1-12.*  Copyright 2012 cc_team. All rights reserved.*
*/
#ifndef CC_LOG_H
#define CC_LOG_H#include "ccString.h"
#include <cstdio>typedef enum _LOG_TYPE
{LOG_TYPE_CONSOLE,LOG_TYPE_FILE,LOG_TYPE_MAX
}LOG_TYPE;class CCLog
{
public:CCLog(const char * fileName = NULL, const char * mode = "at+");    // by default, open file by "at+" mode~CCLog();public:unsigned	write(const CCString & str);unsigned	writeEndl();void	clearAllData();	    // if a file is opened, all contents of the file will be cleared, the file will be opened a second time.public:void	setWriteToConsole();void	setWriteToFile();public:LOG_TYPE	getLogType() const { return _logType; }CCString	getLogFileName() const { return _fileName; }private:    void	clearConsole()	    // not coding ok{}private:CCLog(const CCLog & log);CCLog & operator=(const CCLog & log);private:FILE	*_file;FILE	*_backupFile;CCString	_fileName;LOG_TYPE	_logType;
};#endif

/**  CCLog.cpp*  c++_common_codes**  Created by xichen on 12-1-12.*  Copyright 2012 cc_team. All rights reserved.*
*/
#include "ccLog.h"CCLog::CCLog( const char * fileName /*= NULL*/, const char * mode /*= "at+"*/ )
{if(fileName == NULL){_file = _backupFile = NULL;_logType = LOG_TYPE_CONSOLE;return;}_logType = LOG_TYPE_FILE;_file = fopen(fileName, mode);_backupFile = _file;if(_file == NULL)std::cerr << "Open file error" << std::endl;else_fileName = CCString(fileName);
}CCLog::~CCLog()
{if(_logType == LOG_TYPE_FILE){if(_file != NULL){fclose(_file);return;}if(_backupFile != NULL){fclose(_backupFile);}}
}unsigned CCLog::write( const CCString & str )
{if(_logType == LOG_TYPE_CONSOLE){std::cout << str;return str.length();	// it's not accurate. ????}fseek(_file, 0, SEEK_END);return fwrite(str.c_str(), str.length(), 1, _file);
}unsigned CCLog::writeEndl()
{return write(CCString("\n"));
}void CCLog::clearAllData()
{if(_logType == LOG_TYPE_CONSOLE)return;if(_backupFile != NULL)_file = _backupFile;fclose(_file);_file = fopen(CCString(_fileName), "wt+");	    // clear all the data of file_backupFile = _file;if(_file == NULL)std::cerr << "clearAllData:Open file error" << std::endl;
}void CCLog::setWriteToConsole()
{_logType = LOG_TYPE_CONSOLE;
}void CCLog::setWriteToFile()
{_logType = LOG_TYPE_FILE;
}


简单地测试代码如下:

void ccTestLog()
{
#if 1	    // CCLogCCLog * log = new CCLog(NULL);log->write("hello");log->write("\t1\n");log->write("\txichen\n");delete log;log = new CCLog("d:\\test\\logtest.txt");log->write("ab\t\n1");delete log;log = new CCLog("d:\\test\\logtest.txt");log->write("xiche\t123");log->clearAllData();log->write("after clear");log->setWriteToConsole();log->write("the console info");log->setWriteToFile();log->write("the file content");log->writeEndl();log->write("the next line\nhehe");delete log;
#endif
}


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

相关文章:

  • SpringMVC:拦截器(Interceptor)
  • Python | 排队取奶茶
  • 老旧机子装LINUX——xubuntu
  • 自制植物大战僵尸:HTML5与JavaScript实现的简单游戏
  • JavaScript入门宝典:核心知识全攻略(下)
  • RabbitMQ怎么保证可靠性
  • [C#]使用OpenCvSharp图像滤波中值滤波均值滤波高通滤波双边滤波锐化滤波自定义滤波
  • 国产操作系统上Vim的详解03--使用Vundle插件管理器来安装和使用插件 _ 统信 _ 麒麟 _ 中科方德
  • 数据结构与算法笔记:基础篇 - 散列表(下):为什么散列表和链表经常会一起使用?
  • linux flask | 接口保持在后台一直运行、python后端接口长期调用、python后台持续运行方法、python提供后端接口
  • 2024上海初中生古诗文大会倒计时4个多月:单选题真题和独家解析
  • 使用亮数据代理IP爬取PubMed文章链接和邮箱地址
  • 常见八大排序(纯C语言版)
  • Vue2工程化
  • python的视频处理FFmpeg库使用
  • 深入了解以太坊
  • codis proxy处理流程
  • ECS应用管理最佳实践
  • Javascript 原型链
  • session共享问题解决方案
  • uva 10370 Above Average
  • 从0实现一个tiny react(三)生命周期
  • 使用Swoole加速Laravel(正式环境中)
  • 消息队列系列二(IOT中消息队列的应用)
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Spring Batch JSON 支持
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​虚拟化系列介绍(十)
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • ![CDATA[ ]] 是什么东东
  • # Kafka_深入探秘者(2):kafka 生产者
  • #laravel 通过手动安装依赖PHPExcel#
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2)leetcode 234.回文链表 141.环形链表
  • (70min)字节暑假实习二面(已挂)
  • (9)STL算法之逆转旋转
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Java入门)学生管理系统
  • (JS基础)String 类型
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)为C# Windows服务添加安装程序
  • .axf 转化 .bin文件 的方法
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net Signalr 使用笔记
  • .NET 指南:抽象化实现的基类