日志类库框架

  一个错误报告日志的框架,编译成动态库,不过功能还不够完善。

  利用C++输出文件流的类ofstream 来实现日志记录功能:

  使用ios::out和ios::app的方式打开(文件以输出方式打开(内存数据输出到文件);以追加方式打开文件)

private:
	__Log()
	{
		 StreamObject.open( "刘大大.log", std::ios::out | std::ios::app );
	}
	__Log(const __Log&) = delete;
	__Log& operator = (const __Log&) = delete;

private:
	ofstream StreamObject;

  

  效果:

  

  源代码:

 1 #pragma once
 2 #include <windows.h>
 3 #include <iostream>
 4 #include <fstream>
 5 #include <ctime>
 6 #include <cstdio>
 7 using namespace std;
 8 enum _LOG_LEVEL_
 9 {
10     Fatal = 0,
11     Error,
12     Critical,
13     Warning,
14     Normal,
15     Verbose
16 };
17
18
19 class __Log
20 {
21 public:
22     ~__Log();
23     static __Log& Instance()
24     {
25         static __Log LogObject;
26         return LogObject;
27     }
28
29     BOOL __Log::RecordLogEx(_LOG_LEVEL_ LogLevel, const char* Format, ...);
30     BOOL __Log::RecordLog(_LOG_LEVEL_ LogLevel, const char* Format, va_list ParameterData);
31 private:
32     __Log()
33     {
34         //以输出方式打开(内存数据输出到文件);以追加的方式打开文件
35          StreamObject.open( "刘大大.log", std::ios::out | std::ios::app );
36     }
37     __Log(const __Log&) = delete;
38     __Log& operator = (const __Log&) = delete;
39
40 private:
41     ofstream StreamObject;
42 };

__Log.h

 1 #include "Common.h"
 2
 3 static const char* __LogLevel[] = { "*致命*", "*错误*", "*关键*", "*警告*", "*普通*", "*冗长*" };
 4 __Log::~__Log()
 5 {
 6     StreamObject << endl;
 7 }
 8 BOOL __Log::RecordLogEx(_LOG_LEVEL_ LogLevel,const char* Format, ...)
 9 {
10     //初始化指向可变参数列表的指针
11     va_list ParameterData;
12     bool IsOk = FALSE;
13     //将第一个可变参数的地址付给ap,即ap指向可变参数列表的开始
14     va_start(ParameterData, Format);
15     IsOk = RecordLog(LogLevel, Format, ParameterData);
16     //ParameterData赋值为0,没什么实际用处,主要是为程序健壮性
17     va_end(ParameterData);
18
19     return IsOk;
20 }
21 BOOL __Log::RecordLog(_LOG_LEVEL_ LogLevel,const char* Format, va_list ParameterData)
22 {
23     char BufferData[2048] = { 0 };
24     char MessageData[0x1000] = { 0 };
25     char TimeData[256] = { 0 };
26
27     auto TimeObject = time(NULL);
28     tm v1;
29     localtime_s(&v1, &TimeObject);
30     strftime(TimeData, _countof(TimeData), "%Y-%m-%d %H:%M:%S", &v1);
31     //将参数fmt、ap指向的可变参数一起转换成格式化字符串,放string数组中,其作用同sprintf,只是参数类型不同
32     vsprintf_s(BufferData, _countof(BufferData), Format, ParameterData);
33     sprintf_s(MessageData, _countof(MessageData), "%s %-5s %s", TimeData,
34         __LogLevel[LogLevel], BufferData);
35
36     StreamObject << MessageData << std::endl;  //写入到日志
37
38     return true;
39 }

__Log.cpp

 1 #pragma once
 2 #include <windows.h>
 3 #include <iostream>
 4 #include <fstream>
 5 #include <ctime>
 6 #include <cstdio>
 7 using namespace std;
 8
 9 enum _LOG_LEVEL_
10 {
11     Fatal = 0,
12     Error,
13     Critical,
14     Warning,
15     Normal,
16     Verbose
17 };
18
19 //用__declspec(dllexport)显式的定义dll接口给调用它的exe或dll文件,
20 class _declspec (dllexport) __Log
21 {
22 public:
23     __Log();
24     ~__Log();
25     static __Log& __Log::Instance();
26     BOOL __Log::RecordLogEx(_LOG_LEVEL_ LogLevel, const char* Format, ...);
27     BOOL __Log::RecordLog(_LOG_LEVEL_ LogLevel,const char* Format, va_list ParameterData);
28
29 protected:
30 private:
31     std::ofstream StreamObject;
32
33 };

Common.h

 1 #include "Common.h"
 2
 3 BOOL APIENTRY DllMain( HMODULE hModule,
 4                        DWORD  ul_reason_for_call,
 5                        LPVOID lpReserved
 6                      )
 7 {
 8     switch (ul_reason_for_call)
 9     {
10     case DLL_PROCESS_ATTACH:
11     case DLL_THREAD_ATTACH:
12     case DLL_THREAD_DETACH:
13     case DLL_PROCESS_DETACH:
14         break;
15     }
16     return TRUE;
17 }

dllmain.cpp

 1 // Log.cpp : 定义控制台应用程序的入口点。
 2 //
 3 #include <windows.h>
 4 #include <iostream>
 5
 6 using namespace std;
 7 #include "..\__Log\__Log.h"
 8
 9 #ifdef _WIN64
10 #pragma comment(lib,"..\\x64\\debug\\__log.lib")
11 #else
12 #pragma comment(lib,"..\\debug\\__Log.lib")
13 #endif
14 int main()
15 {
16     /*
17     int   v1 = 10;
18     char* v2 = "函数错误";
19     __Log::Instance().RecordLogEx(Warning,"%d %s",v1,v2);
20     __Log::Instance().RecordLogEx(Fatal,"%s",v2);
21     __Log::Instance().RecordLogEx(Fatal,"%s %f %f %d %s",v2,4.1,4.4,100,"HelloWorld");
22     */
23
24
25     //char* v1 = NULL;
26
27
28     __try
29     {
30         int a = 1;
31         a = a / 0;
32         //memcpy(v1,"HelloWorld",10);
33
34     }
35     __except(EXCEPTION_EXECUTE_HANDLER)
36     {
37         int LastError = GetLastError();
38         __Log::Instance().RecordLogEx(Fatal,"%d %s",LastError,"继续努力");
39     }
40     return 0;
41 }

Log.cpp

				
时间: 2024-10-11 20:47:47

日志类库框架的相关文章

在android中配置 slf4j + log4j 日志记录框架

需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j 框架来实现.slf4j 是日志记录的一个facade,支持多种日志框架.log4j是个很优秀的日志记录框架. 实现: 下载类库: 先到各主站点下载类库 slf4j 网址 :http://www.slf4j.org/download.html log4j网址: http://logging.apach

日志收集框架 Exceptionless

日志收集框架 Exceptionless 前言 从去年就答应过Eric(Exceptionless的作者之一),在中国会帮助给 Exceptionless 做推广,但是由于各种原因一直没有做这件事情,在此对Eric表示歉意.:) Exceptionless 简介 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,Console,MVC 等技术栈的应用程序中,并且提供了Rest接口可以

Atitit.编程语言新特性&#160;通过类库框架模式增强&#160;提升草案&#160;v3&#160;q27

Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27 1. 修改历史2 2. 适用语言::几乎所有编程语言.语言提升的三个渠道::语法,类库,框架,ide2 2.1. 单根继承 vs  多跟继承3 2.2. 默认参数3 2.3. 等号判断相等,儿不是equ3 2.4. 隐式类型,类型推导3 2.5. 匿名类型3 2.6. 初始化器  对象初始化器 与 集合初始化器 { }4 2.7. 委托4 2.8. 内置委托 Func / Action 4 2.9. 标准查询运算符 St

Java日志系统框架的设计与实现

推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程序状态记录.数据恢复等功能有重要作用 日志系统一般作为服务进程或者系统调用存在,我们一般程序中使用系统调用 常用日志系统包括log4j的简单介绍 日志系统的系统架构 日志系统的信息分级 日志输出的设计 下面是全文的引用: 在Java领域,存在大量的日志组件,open-open收录了21个日志组件.日

日志采集框架Flume的安装及使用

日志采集框架Flume的安装及使用 1.Flume介绍 1.1.Flume概述 Flume是一个分布式.可靠.和高可用(旧版Flume og才有高可用)的海量日志采集.传输和聚合的系统. Flume可以采集文件,socket数据包等各种形式源数据, 又可以将采集到的数据输出到HDFS.hbase.hive.kafka等众多外部存储系统中 一般的采集需求,通过对flume的简单配置即可实现 Flume针对特殊场景也具备良好的自定义扩展能力,因此,flume可以适用于大部分的日常数据采集场景 1.2

flume日志采集框架使用

flume日志采集框架使用 本次学习使用的全部过程均不在集群上,均在本机环境,供学习参考 先决条件: flume-ng-1.6.0-cdh5.8.3.tar  去cloudrea下载flume框架,笔者是用cdh5.8.3的套餐 flume的使用环境: 采集特定目录到hdfs环境以供分析离线数据 监听特定端口的socket流数据 本次将以上两种情况的使用加以记录供以后参考 解压 flume-ng-1.6.0-cdh5.8.3.tar mv flume-ng-1.6.0-cdh5.8.3 flum

做了个Android的常用类库框架,希望能帮助大家

做了个Android的常用类库框架,希望能帮助大家.包括了View Injection,ORM,Asynchronous Http and Image,User scenario testing.等等 希望大家多提意见,谢谢. 同时还有TripleDes Utils,WebViewUtils,Md5Utils 之类的方便大家使用. github的地址如下: https://github.com/cymcsg/CommonLibsForAndroid 目前大量的不完善,但是在不断改进. 做了个An

Net Core平台灵活简单的日志记录框架NLog初体验

Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblogs.com/yilezhu/p/9339017.html]" 有人说比较重量,生产环境部署也比较麻烦.因此就有了今天的这篇文章.如果你的项目(网站或者中小型项目)不是很大,日志量也不多的话可以考虑NLog+Mysql的组合.因为NLog具有高性能,易于使用,易于扩展和灵活配置的特点能够让你快速集成日

日志收集框架 Flume 组件之Source使用

上一篇简单介绍了Flume几个组件,今天介绍下组件其一的source,整理这些,也是二次学习的过程,也是梳理知识的过程. Source 中文译为来源,源作用:采集数据,然后把数据传输到channel上.例如:监控某个文件或者某个端口或某个目录,新增数据,新增文件的变化,然后传输到channel. 常用的的source类型,也是平常用的比较多的几种类型,如下: source类型 说明 Avro Source 支持avro协议,内置支持 Thrift Source 支持Thirft rpc ,内置支