简单的日志记录类。

分享一个简易的程序日志记录C++类 最近一直在忙实验室的项目开发,很少上博客了,现在总算有一定时间空出来做些总结,今天起陆续更新博客,总结一下半年多来的学习心得。 今天先分享一个简易的程序日志记录类,参考自《一个简单又高效的日志系统》,针对项目本身做了一定的修改和补充,编程水平有限,仅供参考,呵呵 。 头文件: #ifndef _INFO_LOGGER_H_ #define _INFO_LOGGER_H_ /** 阅读详情
 

VS2005的日志应用类

日志类

头文件:WL_LogFile.h

/*20111125 日志处理类*/

class LOG

{

public:

     LOG();

     virtual ~LOG();

 

public:

     //-日志文件-

     //----如果没有指定,则为exe所在路径下的log.log文件----

     static CString GetLogFile();

     static short SetLogFile(LPCTSTR strPath);

     static short ViewLogFile();

 

     //-前缀-

     //----如果多个进程往同一个文件输出日志,可以为每个进程设置一个前缀----

     //----前缀出现在日期时间之前----

     static short SetPrefix(LPCTSTR strPrefix);

 

     //-日志信息-

     //-获取日志字符串,可以另外-

     static CString sOutV(LPCTSTR strType, LPCTSTR strFormat = NULL, va_list valist = NULL);

     static CString sOut0(LPCTSTR strType, LPCTSTR strFormat = NULL,...);

     static CString sOut ( LPCTSTR strFormat = NULL,...);

 

     //-将日志信息输出到文件-

     static short OutV(LPCTSTR strType, LPCTSTR strFormat = NULL, va_list valist = NULL);

     static short Out0(LPCTSTR strType, LPCTSTR strFormat = NULL,...);

     static short Out (LPCTSTR strFormat = NULL,...);

 

protected:

     static CString s_strLogFile;

     static CString s_strLogPrefix;

     static HANDLE s_hWriteEvent;

};

日志源文件:WL_LogFile.cpp

// 得到可执行程序所在目录

// BOOL bIncludeSep -- 是否包含最后的分隔符"\"

CString GetExePath(BOOL bIncludeSep)

{

     // 得到当前的文件名

     CString strFileName;

     GetModuleFileName(AfxGetInstanceHandle(),strFileName.GetBuffer(_MAX_PATH),_MAX_PATH);

     strFileName.ReleaseBuffer();

     // 得到当前目录

     strFileName=strFileName.Left(strFileName.ReverseFind(_T('\\'))+1);

 

     if(bIncludeSep)

         return strFileName;

     else

         return strFileName.Left(strFileName.GetLength()-1);

}

 

//-获取最后的文件名如果给定文件不是全路径,就是相对于exe-

CString GetFileForExePath(LPCTSTR strCurFileName)

{

     CString strPath = strCurFileName;

     if(!strPath.IsEmpty())

     {

         //-相对路径-

         if(strPath.Find(_T(":"))<=0)

         {

              strPath.Format(_T("%s%s"), GetExePath(FALSE), strCurFileName);

         }

     }

     return strPath;

}

 

#define LOG_EVENT _T("ChyLogWrite")

CString LOG::s_strLogFile = _T("");

CString LOG::s_strLogPrefix = _T("");

HANDLE LOG::s_hWriteEvent = NULL;

 

LOG::LOG()

{

}

 

LOG::~LOG()

{

}

 

short LOG::SetLogFile(LPCTSTR strPath)

{

     if(strPath==NULL || strPath[0]==0)

         s_strLogFile = GetFileForExePath(L"log.log");

     else

         s_strLogFile = GetFileForExePath(strPath);

 

     return 1;

}

 

CString LOG::GetLogFile()

{

     return s_strLogFile;

}

 

short LOG::ViewLogFile()

{

     CString strLogFile = GetLogFile();

     ShellExecute(NULL, _T("open"), strLogFile, NULL, NULL, SW_SHOW);

     return strLogFile.IsEmpty()?0:1;

}

 

short LOG::SetPrefix(LPCTSTR strPrefix)

{

     if(strPrefix && strPrefix[0])

     {

         s_strLogPrefix = strPrefix;

     }

 

     return 1;

}

 

CString LOG::sOutV(LPCTSTR strType, LPCTSTR strFormat, va_list valist)

{

     CString strPart_Prefix;

     if(!s_strLogPrefix.IsEmpty())

     {

         strPart_Prefix.Format(_T("[%s]"), s_strLogPrefix);

     }

 

     CString strPart_Time;

     {

     SYSTEMTIME sysTime = {0};

     GetLocalTime(&sysTime);

     strPart_Time.Format(_T("[%2d-%2d %2d:%2d:%2d_%3d]"),

     sysTime.wMonth, sysTime.wDay,

     sysTime.wHour, sysTime.wMinute, sysTime.wSecond,

     sysTime.wMilliseconds);

     }

 

     CString strPart_Type;

     if(strType && strType[0])

     {

         strPart_Type.Format(_T("[%s]"), strType);

     }

 

     CString strPart_Info;

     {

         strPart_Info.FormatV(strFormat, valist);

     }

 

     CString str = strPart_Prefix + strPart_Time + strPart_Type+ strPart_Info;

 

     return str;

}

 

CString LOG::sOut0(LPCTSTR strType, LPCTSTR strFormat,...)

{

     va_list valist;

     va_start(valist, strFormat);

     CString strInfo = sOutV(strType, strFormat, valist);

     va_end(valist);

 

     return strInfo;

}

 

CString LOG::sOut(LPCTSTR strFormat,...)

{

     va_list valist;

     va_start(valist, strFormat);

     CString strInfo = sOutV(NULL, strFormat, valist);

     va_end(valist);

 

     return strInfo;

}

 

 

short LOG::OutV(LPCTSTR strType, LPCTSTR strFormat, va_list valist)

{

     //--

     if(s_hWriteEvent==NULL)

     {

         s_hWriteEvent = OpenEvent(0, FALSE,LOG_EVENT);

         if(s_hWriteEvent==NULL)

              s_hWriteEvent = CreateEvent(NULL, FALSE, TRUE, LOG_EVENT);

     }

 

     WaitForSingleObject(s_hWriteEvent, INFINITE);

 

     //-打开关闭文件-

     if(s_strLogFile.IsEmpty())

         SetLogFile(NULL);

 

     CStdioFile file;

     if(file.Open(s_strLogFile, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))

     {

         CString strPart_NewLine = _T("\n");

         CString strInfo = sOutV(strType, strFormat, valist);

         CString str = strPart_NewLine + strInfo;

 

         file.SeekToEnd();

         file.WriteString(str);

         file.Close();

     }

 

     SetEvent(s_hWriteEvent);

 

     return 1;

}

 

short LOG::Out0(LPCTSTR strType, LPCTSTR strFormat,...)

{

     va_list valist;

     va_start(valist, strFormat);

     short rtn = OutV(strType, strFormat, valist);

     va_end(valist);

 

     return rtn;

}

 

short LOG::Out(LPCTSTR strFormat,...)

{

     va_list valist;

     va_start(valist, strFormat);

     short rtn = OutV(NULL, strFormat, valist);

     va_end(valist);

 

     return rtn;

}

测试代码:

 

//-设定日志文件,建议在Exe初始化时设定-

//-设置相对路径则表示exe所在路径下-

//-如果不设定则为exe所在路径下的log.log文件-

     LOG::SetLogFile(L"bbb.log");

 

     //-获取日志文本串,可以自行处理,例如输出到界面-

     CString str;

     str = LOG::sOut0(L"debug", L"hello");

     str = LOG::sOut0(L"warn5", L"hello %d", 25);

     str = LOG::sOut0(L"warn3", L"hello %s, you have %d apples!", L"libai", 10);

     str = LOG::sOut (L"hello %s, you have %d apples!", "libai", 10);

 

     //-输出到文件-

     LOG::Out0(L"debug", L"hello");

     LOG::Out0(L"warn5", L"hello %d", 25);

     LOG::Out0(L"warn3", L"hello %s, you have %d apples!", L"libai", 10);

     LOG::Out (L"hello %s, you have %d apples!", L"libai", 10);

 

     //-查看日志文件-

     LOG::ViewLogFile();

 

HFSS仿真中如何提取最大E/H场强与频率关系曲线 本文详细讲解了在HFSS仿真中提取最大E/H场强与频率关系曲线的完整流程。通过使用场计算器(Field Calculator)和创建场报告,工程师可以准确获得器件在整个频带内的电场或磁场强度峰值,并进一步推导出关键的功率容量曲线,为高功率射频器件(如滤波器、耦合器)的设计提供至关重要的安全评估依据。 阅读详情

相关推荐

Ubuntu22.04系统安装及配置

下载Ubuntu22.04系统镜像(下载地址:链接:https://caiyun.139.com/m/i?提取码:fLRJ),结合rufus和系统镜像制作USB启动盘,在物理机服务器上通过USB启动盘进行安装;或通过Esxi虚拟化平台创建虚拟机,然后在虚拟机中使用系统镜像进行安装。

cheagoun的博客 8万+

Vs2005之简单日志工具的制作--6.启动

  下面说说系统的启动。  说到启动,就又想起了.net另一个让人郁闷的地方:winform程序相比其他开发工具(比如delphi)产生的程序,启动速度太慢了。启动一个winform程序,可能过了好久系统才真正进入。在这个过程中,如果能将启动条理化,并反应出来,让人看到什么时候程序在做什么,也是一个不错的办法。  打开MyLog3的解决方案,在MyLog3项目中可以找到一个窗口TfrmConver

ie的专栏 699

LTE信令流程及业务流程

eNB返回E-RAB建立响应消息,E-RAB建立列表信息中包含成功建立的承载信息,E-RAB建立失败列表消息中包含没有成功建立的承载消息。3)当下行数据达到时,网络侧先对UE进行寻呼,随后UE发起随机接入过程,并发起service request过程。用户面:S-GW向eNB发送承载建立请求,包含(IMSI, QoS, TFT, TEID, LBI等)控制面:MME向eNB发送E-RAB建立请求,包含E-RAB ID,QoS,S-GW TEID。3)在S1接口上建立S1承载,在Uu接口上建立数据无线承载。

qq_44390640的博客 4581

VB.NET 写日志文件

VB.NET 写日志文件

IT人生 3764

Win11下WSL2安装Ubuntu22.04避坑指南:从镜像源到C++环境配置

本文提供了一份详细的Win11下WSL2安装Ubuntu22.04的实战避坑指南。内容涵盖从WSL2核心安装、自定义安装路径,到更换国内镜像源以解决更新缓慢问题,并一站式配置完整的C++开发环境(包括GCC、CMake、vcpkg等),最后分享提升开发体验的进阶技巧,助你在Windows上打造高效的Linux开发工作站。

weixin_29260291的博客 562

DeepSeek安装教程

两分钟讲述deepseek正确安装教程

weixin_45906703的博客 1662

vb.net 日志类

Imports System.IO Public Class Logger Public Shared Function log(str As String, Optional err As Boolean = False) As Boolean Dim p As String If (err = True) Then p = "err" Else p = "log" End If Dim path As String = Application.StartupPath.

superfans98的专栏 1043

深度学习模型设计的方法和技巧

设计神经网络模型是一个迭代的过程,需要不断试验和调整各个组成部分,以达到最佳性能。同时,遵循良好的工程实践,如模块化设计、版本控制、文档记录等,也是成功的关键。

xw555666的博客 4026

C++基础——virtual相关总结

virtual相关总结 静态函数与虚函数 静态函数不可以声明为虚函数,同时也不能被const 和 volatile关键字修饰,原因如下: static成员函数不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义; 虚函数依靠vptr和vtable来处理。vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,静态成员函数没有this指针,所以无法访问vptr。 构造函数与虚函数 构造函数不可以声明为虚函数;原因如下: 1. 从存储空间角度 虚函数.

qq_25065595的博客 277

22、自动化地图制作与Pandas数据处理

本文介绍了在ArcGIS Pro中使用arcpy.mp模块进行自动化地图制作的关键技术,涵盖地图元素的访问、移动与文本修改,以及将布局批量导出为JPEG、PNG和PDF格式的方法。同时,文章深入探讨了Pandas在数据处理和地理空间分析中的应用,特别是Spatially Enabled DataFrames(SEDFs)的使用。通过综合案例展示了地图更新与数据清洗、分析的结合,提升了地图制作与数据处理的效率,为GIS自动化工作流提供了实用指南。

w8x9y0z1的博客 78

【vsomeip3 教程】SOME/IP中间件去抖策略全解析

本文探讨了在SOME/IP中间件中实现Debounce(去抖动)机制的必要性和实现原理。文章首先分析了中间件层进行Debounce的四大动机:多订阅者共享收益、语义显式化、协议噪声屏蔽和入口处背压控制。接着详细阐述了Debounce的底层原理,包括变化检测机制(ignore和mask的应用)、时间门控策略(interval的两种时间基准)以及超时补发机制,并通过表格清晰展示了不同参数组合的效果和适用场景。最后,文章提出了工程落地的具体方法,包括策略选型、ignore/mask的设计方法论以及分层验证调试的实

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 231

自己写的C++日志类log

主要功能是在服务器运行的时候可以打印日志到日志文件中,主要运用到的知识点有线程, 线程锁,条件变量,STL的deque。大致思路是这样的:             这个类提供一个接口,可以直接调用他,并且可以打印日志到日志文件中。但是不能影响到服务器的正常运行,也就是说不能进行大量的文件操作; 大致 实现流程:     对象初始化时候创建一个线程在后台读取队列,并将读到的数据写入到日志文

u012314708的博客 7786

YOLOv5_DeepSORT_Pytorch训练自己的多目标跟踪模型

1 准备 环境配置:https://blog.youkuaiyun.com/weixin_50008473/article/details/115250986?spm=1001.2014.3001.5501 YOLOv5_DeepSORT_Pytorch代码地址: https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch DeepSORT论文:https://arxiv.org/pdf/1703.07402.pdf 2 训练目标检测模型 训练自己的目标检测模

weixin_50008473的博客 1万+

c# 简单日志记录类 log

共享一下很久写的一个日志记录类 网上的日志记录DLL,复杂繁多,最典型的就是log4net 但是往往你又不需要这么高级的东东(唉!配置麻烦),干脆自己弄一个简单的日志记录工具类,还算凑合着用(主要是并发记录日志和多线程的问题). 喜欢的就拿去用吧! 以后有时间把它改成多线程的就完美了。 上代码: using System; namespace NatureSex.C...

211

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

一个c#的简单日志记录类,避免使用Nuget依赖

可以实现滚动记录日志,效率不算高,如果追求效率考虑使用seriallog库等,这个库只适合简单工具,不想依赖其他库的情况下使用。

秋月的私语 449

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

最简单的C#日志记录类

日常写代码经常要记录各种运行日志,网上开源的免费,功能强大的很多,但是有时候感觉为了写一个几百甚至几十行代码的小程序去下载一个“庞大的日志记录组建(xxlog.dll)” 不太值得,因此简单自己写一个类,使用简单,体积小!基本满足记录功能! using Gaofajin.Attribute;using System;using System.Collections.Generic;u...

diaohuofu0847的博客 701

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

php日志操作类,PHP封装一个简单的日志记录类

小项目中简单的日志日志记录可以使用,本文采用json格式来进行日志记录。PHP写日志文件需要打开、写入和关闭文件等操作,PHP有fopen(),fwrite()和fclose()三个函数与之对应,而另一个函数file_put_contents()它也能字符串写入文件,其实这个函数实现了依次调用 fopen(),fwrite() 以及 fclose()。所以我们使用file_put_contents...

weixin_29944883的博客 586

简单日志记录类

1 public class LogWriter 2 { 3 public void WriteToLog(string source,string targetSite,string message, string logPath) 4 { 5 try 6 { 7 ...

weixin_30949361的博客 88

自定义简单日志记录类

说明: 实在被log4net折磨的无语了,就自己写了一个简单的日志记录操作类。 源码如下(VS2015): /************************************************** * *命名空间: Common * 类名: FuncMyLog * 作者: 贾胜杰(2017/11/24/周五 9:22:34 ) *模块说明: 自定义日志类 *

Jia_ShengJie 1506

C++实现一个简单的异常日志记录类

头文件#pragma once ///////////////////////////////////////////////////////////////////////////////// //异常信息记录类 #include #ifdef UNICODE #define tstring std::wstring #else #define tstring std::st

https://github.com/JelinYao 4298

[原创]自己写的一个简单的程序日志记录类

[原创]自己写的一个简单的日志记录类 用C++写的一个简单的日志记录类,用于跟踪程序运行状况 用途:输出程序的调试信息,记录程序运行状况,记录程序日志以便分析 用于记录程序运行过程的一些变量值和输出一些信息。可以用于DLL和exe。 写这个的初衷是由于窗口程序没有控制台,不好输出一些信息,虽然可以使用messagebox,但是如果信息过于频繁,会严重影响程序的运行。同时为了将dll中的一些...

weixin_30784501的博客 91

Postsharp简单试用——在业务逻辑类上添加日志记录

1.首先添加PostSharp引用 2.添加特性(Attribute)类 [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class UserLogAttribute : OnMethodBoundaryAspect...

weixin_30613343的博客 158

c++超简单日志记录函数仅用于简单测试

有时候写了一个非常简单的小工具,想要记录日志测试,甚至都不想添加一个头文件,这个时候希望有个非常简单的日志记录类,能够直接复制粘贴就能使用,不用考虑线程问题等复杂场景,于是就有了下面这个类,亲测可用。支持输入日志到终端或者文件。

秋月的私语 371

代码简单示意:利用log4j将一个类中不同业务日志记录到不同位置

为什么80%的码农都做不了架构师?>>> ...

weixin_33843947的博客 107

C++日志类

//Log.h头文件 /* 简单日志类 */ #ifndef LOGGER_H_ #define LOGGER_H_ #include #include #include using namespace std; //日志级别枚举 typedef enum LogLevel { 信息 = 0, //什么都不记录 错误, //只记录严重错误 警告,

Syee001的专栏 500
上一篇: VS2005和Matlab2010b的联合编程的配置。
下一篇: S32v234 VS2013 demo环境搭建
FroSuccess
博客等级 码龄15年 4粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值