/************************************************************************/
/*
* 文件名称:write_log.cpp
* 摘 要:此文件实现了普通WINDOWS程序中的日志功能
* 主要有以下特点:
* 1. 根据日期创建日志文件目录,每天的日志分别存放在不同的日志目录中;
* 2. 日志内容分三种类型,根据不同需要,写不同的日志类型的日志文件,
* 方便通过日志定位、分析问题;
* 3. 函数经过比较好的封装,便于复用;
* 待改进点:
* 1. 为了方便,日志内容打印时使用了time函数,其精确度较低;
* 2. 可将这些函数封装为一个日志类,或者动态库,使其更通用;
* 3. 没有考虑跨平台情景,目前只使用于WINDOWS下
* 4. 日志文件内容还可进一步改进,比如打印出当前文件名与行号,使用日志功能
* 更加实用;
*
*/
/************************************************************************/
#ifndef __WRITELOG_H__
#define __WRITELOG_H__
#include "stdafx.h"
#include <time.h>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <windows.h>
#define _LOG_WRITE_STATE_ 1 /* 条件编译开关,1:写日志,0:不写日志 */
#define LOG_SUCCESS (0)
#define LOG_FAILED (-1)
#define LOG_BOOL_TRUE (1)
#define LOG_BOOL_FALSE (0)
#define DWORD_NULL (0xFFFFFFFF)
#define MAX_LOGTEXT_LEN (2048) /* 每行日志的最大长度*/
#define MAX_FILE_PATH (255) /* 日志文件路径的最大长度*/
#define MAX_LOG_FILE_SIZE (512 * 1024) /* 日志文件内容的最大长度*/
#define MAX_LOG_FILE_NAME_LEN (256) /* 日志文件名的最大长度*/
#define LOG_TYPE_INFO 0 /* 日志类型: 信息类型*/
#define LOG_TYPE_ERROR 1 /* 日志类型: 错误类型*/
#define LOG_TYPE_SYSTEM 2 /* 日志类型: 系统类型*/
#define TEST_CASE_MAX_FILE_LEN (1024) /* 测试函数中文件内容最大长度*/
const char g_LogRootPath[] = "C:\\My_APPLOG"; /*日志文件根路径,由用户指定*/
#pragma pack(push, 1)
typedef struct tagLOG_DATA /* 日志内容结构体*/
{
char strDate[11]; /* 日期:格式为如:2009-10-11*/
char strTime[9]; /* 时间:格式为如:16:10:57*/
unsigned int iType; /* 日志类型:3种:INFO(0)/ERROR(1)/SYSTEM(2)*/
char strText[MAX_LOGTEXT_LEN]; /*日志内容*/
}LOG_DATA, *LPLOG_DATA;
#pragma pack(pop)
int Create_LogDir(const char *pStrPath);
int Create_LogFile(const char *pStrFile, int iPos);
int IsFileExist(const char *pStrFile);
int GetLogPath(char *pStrPath);
DWORD GetFileLenth(const char *pFile);
int Write_Log_Text(LPLOG_DATA lpLogData);
void Write_Log(unsigned int uiLogType, char *pstrFmt, ...);
void TestLogCase_One();
int main(int argc, char* argv[])
{
Write_Log(LOG_TYPE_SYSTEM, "Program begin.");
TestLogCase_One();
Write_Log(LOG_TYPE_SYSTEM, "Program end.");
return 0;
}
/*********************************************************************
* 函数名称:void TestLogCase_One()
* 说明:简单的测试函数,读文件
* 调用者:main
* 输入参数:
* 无
* 输出参数:
* 无
* 返回值:
* void --
*********************************************************************/
void TestLogCase_One()
{
FILE *pFile = NULL;
char *pFieldContent = NULL;
char szFileName[] = "test_case.txt";
pFieldContent = (char *)malloc(TEST_CASE_MAX_FILE_LEN);
if(NULL == pFieldContent)
{
Write_Log(LOG_TYPE_ERROR, "malloc memory failed,program exit!");
return;
}
memset(pFieldContent, 0, TEST_CASE_MAX_FILE_LEN);
Write_Log(LOG_TYPE_INFO, "malloc memory for pFiled successful,memory size is: %ld",
TEST_CASE_MAX_FILE_LEN);
pFile = fopen(szFileName, "r");
if(NULL == pFile)
{
fprintf(stderr, "open file failed.");
Write_Log(LOG_TYPE_ERROR, "Open file %s failed. program exit!", szFileName);
return;
}
Write_Log(LOG_TYPE_INFO, "Open file %s successful.", szFileName);
fread(pFieldContent, 1, TEST_CASE_MAX_FILE_LEN, pFile);
pFieldContent[TEST_CASE_MAX_FILE_LEN -1] = '\0';
fclose(pFile);
printf("The file %s content is: \n%s\n", szFileName, pFieldContent);
Write_Log(LOG_TYPE_INFO, "The file %s content is: \n%s\n", szFileName, pFieldContent);
}
/*********************************************************************
* 函数名称:void Write_Log(unsigned int uiLogType, char *pstrFmt, ...)
* 说明:日志写函数,支持变长参数
* 调用者:任何需要写日志的地方
* 输入参数:
* unsigned iType -- 日志类别
* char *pstrFmt -- 日志内容
* ... -- 变长参数
* 输出参数:
* 无
* 返回值:
* void --
*********************************************************************/
void Write_Log(unsigned int uiLogType, char *pstrFmt, ...)
{
#if _LOG_WRITE_STATE_ /* 写日志与否的编译开关*/
LOG_DATA data;
time_t curTime;
struct tm *mt;
va_list v1;
memset(&data, 0, sizeof(LOG_DATA));
va_start(v1, pstrFmt);
_vsnprintf(data.strText, MAX_LOGTEXT_LEN, pstrFmt, v1);
va_end(v1);
data.iType = uiLogType;
curTime = time(NULL);
mt = localtime(&curTime);
strftime(data.strDate, sizeof(data.strDate), "%Y-%m-%d", mt);
strftime(data.strTime, sizeof(data.strTime), "%H:%M:%S", mt);
Write_Log_Text(&data);
#endif _LOG_WRITE_STATE_
}
/*********************************************************************
* 函数名称:int GetLogPath(char *pStrPath)
* 说明:获取日志文件路径
* 调用者:Write_Log_Text
* 输入参数:
* 无
* 输出参数:
* char *pStrPath
* 返回值:
* int -- LOG_FAILED: 失败
* -- LOG_SUCCESS: 成功
*********************************************************************/
int GetLogPath(char *pStrPath)
{
if(NULL == pStrPath)
{
return LOG_FAILED;
}
int iRet = 0;
time_t curTime = time(NULL);
struct tm *mt = localtime(&curTime);
/* 根据日期组成文件夹名称*/
sprintf(pStrPath, "%s\\%d%02d%02d", g_LogRootPath, mt->tm_year + 1900, mt->tm_mon + 1, mt->tm_mday);
iRet = Create_LogDir(pStrPath);
return iRet;
}
/*********************************************************************
* 函数名称:int GetLogFileName(int iLogType, const char *pStrPath, char *pStrName)
* 说明:获取日志文件名
* 调用者:Write_Log_Text
* 输入参数:
* int iLogType -- 日志类型 3种:INFO(0)/ERROR(1)/SYSTEM(2)
* const char *pStrPath -- 日志路径 由GetLogPath得到
* 输出参数:
* char *pStrName -- 日志文件名
* 返回值:
* int -- LOG_FAILED: 失败
* -- LOG_SUCCESS: 成功
*********************************************************************/
int GetLogFileName(int iLogType, const char *pStrPath, char *pStrName)
{
if(NULL == pStrPath)
{
return LOG_FAILED;
}
char szLogName[MAX_FILE_PATH];
FILE *pFile = NULL;
memset(szLogName, 0, MAX_FILE_PATH);
switch (iLogType)
{
case LOG_TYPE_INFO:
sprintf(szLogName, "%s\\app_info", pStrPath);
break;
case LOG_TYPE_ERROR:
sprintf(szLogName, "%s\\app_error", pStrPath);
break;
case LOG_TYPE_SYSTEM:
sprintf(szLogName, "%s\\app_system", pStrPath);
break;
default:
return LOG_FAILED;
break;
}
strcat(szLogName, ".log");
if(IsFileExist(szLogName))
{
/* 如果文件长度大于指定的最大长度,重新创建一文件,覆盖原文件*/
if((int)GetFileLenth(szLogName) + 256 >= MAX_LOG_FILE_SIZE)
{
Create_LogFile(szLogName, 0);
}
}
else
{
Create_LogFile(szLogName, 0);
}
sprintf(pStrName, "%s", szLogName);
return LOG_SUCCESS;
}
/*********************************************************************
* 函数名称:int Create_LogDir(const char *pStrPath)
* 说明:创建日志存放路径
* 调用者:GetLogPath
* 输入参数:
* const char *pStrPath --用户指定的根路径
* 输出参数:
* 无
* 返回值:
* int -- LOG_FAILED: 失败
* -- LOG_SUCCESS: 成功
*********************************************************************/
int Create_LogDir(const char *pStrPath)
{
if(NULL == pStrPath)
{
return LOG_FAILED;
}
int iRet = 0;
char szSub[MAX_FILE_PATH];
char *pSub = NULL;
int iIndex = 0;
int iLen = 0;
int bFind = 0;
memset(szSub, 0, sizeof(MAX_FILE_PATH));
/* 逐层创建目录*/
while(1)
{
pSub = strchr(pStrPath + iLen, '\\');
if(NULL == pSub)
{
if(iLen == 0)
{
return LOG_FAILED;
}
iRet = CreateDirectory(pStrPath, NULL);
if(0 == iRet)
{
iRet = GetLastError();
if(ERROR_ALREADY_EXISTS == iRet)
{
return LOG_SUCCESS;
}
return LOG_FAILED;
}
return LOG_SUCCESS;
}
else
{
if (!bFind)
{
bFind = 1;
}
else
{
memset(szSub, 0, sizeof(szSub));
strncpy(szSub, pStrPath, pSub - pStrPath);
CreateDirectory(szSub, NULL);
}
iLen = pSub - pStrPath + 1;
}
}
return LOG_SUCCESS;
}
/*********************************************************************
* 函数名称:int Create_LogFile(const char *pStrFile, int iPos)
* 说明:创建日志文件
* 调用者:GetLogFileName
* 输入参数:
* const char *pStrFile --文件名
* int iPos --文件指针位置
* 输出参数:
* 无
* 返回值:
* int -- LOG_FAILED: 失败
* -- LOG_SUCCESS: 成功
*********************************************************************/
int Create_LogFile(const char *pStrFile, int iPos)
{
HANDLE hd = 0;
int iRet = 0;
if(NULL == pStrFile)
{
return LOG_FAILED;
}
hd = CreateFile(pStrFile,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if(INVALID_HANDLE_VALUE == hd)
{
return LOG_FAILED;
}
if(DWORD_NULL == SetFilePointer(hd, iPos, NULL, FILE_BEGIN))
{
return LOG_FAILED;
}
iRet = SetEndOfFile(hd);
CloseHandle(hd);
return iRet;
}
/*********************************************************************
* 函数名称:int IsFileExist(const char *pStrFile)
* 说明:判断指定的文件是否存在
* 调用者:GetLogFileName
* 输入参数:
* const char *pStrFile --文件名
* 输出参数:
* 无
* 返回值:
* int -- LOG_BOOL_FALSE: 不存在
* -- LOG_BOOL_TRUE: 存在
*********************************************************************/
int IsFileExist(const char *pStrFile)
{
int iLen = 0;
WIN32_FIND_DATA finddata;
memset(&finddata, 0, sizeof(WIN32_FIND_DATA));
HANDLE hd = FindFirstFile(pStrFile, &finddata);
if(INVALID_HANDLE_VALUE == hd)
{
DWORD dwRet = GetLastError();
if(ERROR_FILE_NOT_FOUND == dwRet || ERROR_PATH_NOT_FOUND == dwRet)
{
return LOG_BOOL_FALSE;
}
}
FindClose(hd);
return LOG_BOOL_TRUE;
}
/*********************************************************************
* 函数名称:DWORD GetFileLenth(const char *pFile)
* 说明:判断指定的文件大小
* 调用者:GetLogFileName
* 输入参数:
* const char *pFile --文件名
* 输出参数:
* 无
* 返回值:
* DWORD -- 文件大小
*********************************************************************/
DWORD GetFileLenth(const char *pFile)
{
WIN32_FIND_DATA buff;
HANDLE hd = NULL;
memset(&buff, 0, sizeof(WIN32_FIND_DATA));
hd = FindFirstFile(pFile, &buff);
FindClose(hd);
return (buff.nFileSizeHigh * MAXDWORD) + buff.nFileSizeLow;
}
/*********************************************************************
* 函数名称:int Write_Log_Text(LPLOG_DATA lpLogData)
* 说明:写日志内容
* 调用者:Write_Log
* 输入参数:
* LPLOG_DATA lpLogData --日志内容结构体量
* 输出参数:
* 无
* 返回值:
* int -- LOG_FAILED: 失败
* -- LOG_SUCCESS: 成功
*********************************************************************/
int Write_Log_Text(LPLOG_DATA lpLogData)
{
char szFilePath[MAX_FILE_PATH];
char szFileName[MAX_LOG_FILE_NAME_LEN];
FILE *pFile = NULL;
char szLogText[MAX_LOGTEXT_LEN];
memset(szFilePath, 0, MAX_FILE_PATH);
memset(szFileName, 0, MAX_LOG_FILE_NAME_LEN);
memset(szLogText, 0, MAX_LOGTEXT_LEN);
GetLogPath(szFilePath);
GetLogFileName(lpLogData->iType, szFilePath, szFileName);
pFile = fopen(szFileName, "a+");
if(NULL == pFile)
{
return LOG_FAILED;
}
sprintf(szLogText, "%s %s %s\n", lpLogData->strDate, lpLogData->strTime, lpLogData->strText);
fwrite(szLogText, 1, strlen(szLogText), pFile);
fclose(pFile);
return LOG_SUCCESS;
}
相关推荐
基于C++ spdlog日志库的完善封装
spdlog是一个C++编写的极速日志打印库,支持异步写日志以及多种模式和格式化选项。以下基于spdlog库封装了一个简单易用的功能类,采用的是header-only方式,便于项目集成。 代码 #pragma once #include <iostream> #include <string> #include <memory> #include <time.h> #include <chrono> #include "spdlog/spdl
C++ 简单的日志记录方法
#pragma warning(disable : 4996) #include "stdafx.h" #include <windows.h> #include <ctime> #include <fstream> #include <string> //写入日志文件 void WriteLog(char *lpBuffer) { ch...
从Log4cpp日志框架中学习日志该怎么打印
log4cpp是个开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。Log4cpp中最重要概念有Category(种类)、Appender(附加器)、Layout(布局)、Priorty(优先级)。:表示日志的级别种类。分为EMERG、FATAL、ALERT、CRIT、ERROR、WARN、NOTICE、INFO、DEBUG。:日志的常用优先级:DEBUG < INFO < WARN < ERROR < FATAL。
C++ 实现简易 log 日志库
DEBUG(调试):DEBUG级别的日志用于记录应用程序的调试信息,例如变量的值、函数的执行路径等。TRACE(跟踪):这是最详细的日志级别,通常用于记录应用程序中最细微的操作和事件,以帮助调试和追踪问题。FATAL(致命): FATAL级别的日志用于记录严重的错误,通常表示应用程序遇到了无法继续运行的情况,可能会导致应用程序崩溃。WARN(警告):WARNING级别的日志用于记录警告信息,例如潜在的问题或不正常的情况,但不会导致应用程序终止。由此可见log日志在系统中的重要地位和存在的必要性。
log4cpp C++日志库实战:使用教程与示例代码
log4cpp 是一个灵活的日志记录库,它提供了强大的日志记录功能,支持多种日志级别和多种输出方式。log4cpp 的设计允许程序员控制日志信息的格式和输出目标,从而使得开发者可以方便地记录应用程序的运行状态。log4cpp允许用户扩展和自定义其行为,这主要通过继承现有的类或者实现接口来完成。用户可以创建自己的AppenderLayout或者Filter等组件,以满足特定的需求。例如,用户可能需要一个将日志信息写入数据库的Appender,用户可以实现一个自定义的类。
一个供C++使用的日志类,非常好用
一个拿来就可以用的C++日志类,可以自定义目录,自定义大小(达到大小后自动重新创建日志文件),自定义时间等。
【c++简单log日志类实现】
该类主要功能是输出信息到文本,实现方式类似于printf函数。头文件如下:#pragma once #define FILE_NAME_SIZE 256 //文件名称大小 #define MAX_FILE_SIZE (4*1024) //最大的文件大小(4M) /*功能:log日志类,输入信息到文件 作者:LZH */ class CHLog { public: CHLog(voi...
别再只调A*算法了!聊聊ROS机器人导航中,OpenCV视觉信息如何与激光雷达数据“打配合”
本文探讨了ROS机器人导航中激光雷达与OpenCV视觉融合的实战策略,揭示了如何通过多模态感知提升导航精度。文章详细介绍了视觉特征到代价地图的转化方法、系统级挑战的工程解决方案,以及融合感知下的路径规划进化,帮助开发者优化机器人导航系统。
c++保存最近n天文件夹
由于日志库没有自动保存最近几天日志文件的处理函数。这几天手动编写一个保存最近n天的函数。,我写的c++控制台程序。 日志模块处理逻辑: 创建一个定时器每小时定时检测当前时间。 每天的凌晨一点,就更新新的日志文件和删除旧的日志文件: 1.按日期生成日志文件夹和日志文件 限制最大300m大小,可增长3次的日志文件。 2.保留最近n天的日志文件夹 ① 获取当前所有日志文件夹的路径 ② 根据路径获取文件夹的创建时间 ③ 根据文件夹的创建时间与当前时间进行比较, 这个就是日期相差天数的比较。 超出n天,则删除该文件夹
在带有Intel Arc GPU的Windows上安装IPEX-LLM
本文将介绍在 Intel Arc GPU 环境下安装 IPEX-LLM。
从理论到波形:NE555多谐振荡器设计与示波器实战验证
本文详细介绍了NE555多谐振荡器的设计原理与实战验证方法。从基础理论到电路参数计算,再到面包板搭建与示波器测量,全面解析如何利用NE555芯片实现稳定的方波输出。通过实际案例演示了频率调整、占空比优化等技巧,并提供了常见问题排查指南,帮助电子爱好者快速掌握这一经典电路设计。
windows下写日志文件的代码
void CreateLogFile() { ofstream file(LOG_FILE_PATH,ios::binary); file.close(); } bool isLogFileExist() { bool bRet = false; fstream file; file.open(LOG_FILE_PATH, ios::binary |ios::in); if(!fi
GMSL Strapping Pins CFG0/CFG1 应用
如果 0x13.bit3 = 0, 则是链路没有 Locked,需要去排查下具体问题(通常是工作模式配置问题)如果遇到 Link 无法建立(Locked),电源没有问题的情况下,多半是加串器和解串器的工作模式不匹配。芯片在上电时,会检测这两个管脚的电压,根据不同的电压值,芯片进入到不同的工作模式。一对加串器和解串器,只要工作模式匹配得当,Link Locked,便能够正常工作。ADI 已经充分考虑了用户的需求,尽可能的降低的芯片的使用和配置复杂度。GMSL 的解串器也是类似的配置,具体请参考对应的规格书。
C++ 日志库 log4cpp 详解与实践
本文介绍了C++日志库log4cpp的核心概念与使用方法。log4cpp是基于log4j设计的开源日志库,包含Category(日志类别)、Appender(输出器)、Layout(布局)和Priority(优先级)等核心组件。文章详细讲解了Linux系统安装和源码编译两种安装方式,并提供了一个完整的示例代码,展示了如何初始化日志系统、定义日志宏以及输出包含文件名、行号等详细信息的日志。此外,还介绍了通过配置文件管理日志配置的最佳实践,使日志系统更加灵活可配置。示例代码包含了从DEBUG到FATAL不同级别
CAPL学习之路-关键字
在capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称 声明数据类型的关键字 可以用不同的关键字,声明或引用不同类型的数据 byte 声明一个字节的变量 word 声明两个字节的变量 dword 声明四个字节的变量 int 声明两个字节的整数 long 声明四个字节的变量 qword 声明八个字节的变量 char 声明一个字符串 float 声明一个浮点数,8个字节 double 声明一个浮点数,8个字节 定义一个结构体或枚举类型 struct struct Data { .
【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)
本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求。
C++写日志操作
使用C++语言编写写日志类,支持写日志级别设置、支持多线程、支持可变形参表写日志。 主要提供以下接口: ①设置写日志的级别 ②写关键日志信息 ③写错误日志信息 ④写警告日志信息 ⑤写一般日志信息 1.共有变量的定义CommandDefine.h #ifndef COMMAND_DEFINE_H
倍福EL6002实现RS232自由口通信,以称重模块RS232数据接收为例
RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。弄完了,再将CTS设置为1,让A发数据。
TensorFlow设置日志级别的几种方式
TensorFlow中的log共有INFO、WARN、ERROR、FATAL 4种级别。有以下几种设置方式。 1. 通过设置环境变量控制log级别 可以通过环境变量TF_CPP_MIN_LOG_LEVEL进行设置,TF_CPP_MIN_LOG_LEVEL的不同值的含义分别如下: Level Level for Humans Level Description 0 DEBUG all...
SAP 采购订单入库——移动类型
业务场景:采购入库,实物入库至仓库,然后系统同步过账。MIGO:收货、采购订单。 MVT:101 入库,---库存增加。 MVT:移动类型,就是代表业务场景,(比如入库、发货,成本中心发、工单发、报废、盘赢、盘亏等等) 移动类型 1、正向采购入库:101 2、反向冲销(MIGO)102:与101相反,用于错误操作的反向冲销。参考原凭证,全部进行一...
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
C/C++编程:log4cpp使用学习
简介 Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 Log4cpp有如下优点: 提供了可扩展的多种日志记录方式; 提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试; 提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级 可通过配置文件完成所有配置并动态加载; 性能优秀,内存
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
C++ Log4cpp跨平台日志库使用记录(Window与Linux)
介绍log4cpp的项目用法,将在项目中常用的用法代码写下来分享!
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
锂电池充电器电路设计 里面有电路
锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。
【Linux C++】log4cpp日志库的安装和使用详解
log4cpp是一个开源的 C++ 日志库,灵感来源于 Java 的log4j。它提供了灵活的日志记录功能,可以帮助开发者在 C++ 应用程序中记录、管理和格式化日志信息。log4cpp支持多种日志记录策略和输出目标,可以满足各种不同的需求。
glog 设置日志级别_glog C++版本代码分析
本文基于glog CPP版本的0.4.0版本,对glog的实现机制做一些简单的分析记录。概述要记录一条日志,分为两个阶段:首先生成日志。然后将日志内容输出到相应的设备,如标准输出、文件等。以下就分两部分展开对glog的分析。日志的生成一般有两种生成日志数据的方式:类printf的方式,将需要输入的数据格式化。类C++ stream流的方式,提供出来operator <前者的好处在于...
C++日志模块设计
用于格式化输出程序日志,方便从日志中定位程序运行过程中出现的问题。这里的日志除了日志内容本身之外,还应该包括文件名/行号,时间戳,线程/协程号,模块名称,日志级别等额外信息,甚至在打印致命的日志时,还应该附加程序的栈回溯信息,以便于分析和排查问题。
9114



被折叠的 条评论
为什么被折叠?



