一个跨平台的c++日志模块实现

基于C++高性能、跨平台日志模块的分析与实现 C++高性能、跨平台日志模块的分析与实现 阅读详情

     文件log.h
#ifndef __GUARD_LOG_H
#define __GUARD_LOG_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
#else
    #include <stdarg.h>
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
#endif//WIN32
#ifndef MAX_PATH
#define MAX_PATH 256
#endif
const int LOG_HIT = 0;//提示
const int LOG_WARN = 1;//警告
const int LOG_ERROR = 2;//错误
const int LOG_CRITICAL = 3;//严重错误

class AutoLock
{
    public:
        AutoLock()
        {
#ifdef WIN32
            ::InitializeCriticalSection(&section);
#endif

        }
        virtual ~AutoLock()
        {
#ifdef WIN32
            ::DeleteCriticalSection(&secion);
#endif
        }
    public:
       bool Lock()
       {
#ifdef WIN32
           ::EnterCriticalSection(&section);
#else
           pthread_mutex_lock(§ion);
#endif
           return true;
       }
       bool Unlock()
       {
#ifdef WIN32
           ::LeaveCriticalSection(&section);
#else
           pthread_mutex_unlock(&section);
#endif
           return true;
       }
    private:
    CRITICAL_SECTION section;
};



class LogFile
{
public:
    LogFile();
    virtual ~LogFile();
public:
    void Start(const char* pszFilename);
    void Write(int nErrorLevel, const char* pFormatStr, ...);
    void WriteLine(int nErrorLevel, const char* pFormatStr, ...);
    void Close();
    bool CreateDir(const char * pszLogDir);
protected:
    void CreateFile(char* pszFileName);
protected:
    char file_name_[MAX_PATH*2];
    char file_title_[MAX_PATH*2];
    FILE *pLog_;
    AutoLock lock_;
};
#endif//__GUARD_LOG_H

文件log.cc:


#include "log.h"
#include <time.h>

LogFile::LogFile()
{
    pLog_ = NULL;
    memset(file_name_, 0, MAX_PATH * 2);
    memset(file_title_, 0, MAX_PATH * 2);
}
LogFile::~LogFile()
{
    if(pLog_){
        fclose(pLog_);
        pLog_ = NULL;
    }
}
void LogFile::Start(const char* pszFilename)
{
    if (strlen(pszFilename) <= 0){
        return;
    }
    lock_.Lock();
    strcpy(file_title_, pszFilename);
    this->CreateFile(file_title_);
    lock_.Unlock();
}
void LogFile::Write(int nErrorLevel, const char* pFormatStr, ...)
{
    this->CreateFile(file_title_);
    lock_.Lock();
    if (pLog_ == NULL){
        return;
    }
    const int nBufSize = 50 * 1024;
    char Buf[nBufSize];
    const int nLevelSize = 32;
    char Level[nLevelSize];

    if (nErrorLevel == LOG_HIT){
        strcpy(Level, "HIT");
    }
    else if (nErrorLevel == LOG_WARN){
        strcpy(Level, "WARN");
    }
    else if (nErrorLevel == LOG_ERROR){
        strcpy(Level, "ERROR");
    }
    else if (nErrorLevel == LOG_CRITICAL){
        strcpy(Level, "CRITICAL");
    }
    else{
        strcpy(Level, "UNKNOW");
    }

    //输出时间
    time_t timer;
    time(&timer);
    struct tm *today = localtime(&timer);
    //[2005-03-25 11:29:16]
    sprintf(Buf,"[%04d-%02d-%02d %02d:%02d:%02d LEVEL = %s] ",
            today->tm_year + 1900,
            today->tm_mon + 1,
            today->tm_mday,
            today->tm_hour,
            today->tm_min,
            today->tm_sec,
            Level);

    //写到LOG文件.
    fwrite(Buf,strlen(Buf), 1, pLog_);
    memset(Buf, 0, nBufSize);

    //分析输入可变参数.
    va_list args;
    va_start(args, pFormatStr);
    vsprintf(Buf, pFormatStr, args);
    va_end(args);

    //写到LOG文件
    fwrite(Buf, strlen(Buf), 1, pLog_);
    //缓冲区写到文件
    fflush(pLog_);
    lock_.Unlock();
}
void LogFile::WriteLine(int nErrorLevel, const char* pFormatStr, ...)
{
    lock_.Lock();
    this->CreateFile(file_title_);
    if (pLog_ == NULL){
        return;
    }

    const int nBufSize = 50 * 1024;
    char Buf[nBufSize];

    const int nLevelSize = 32;
    char Level[nLevelSize];
    if (nErrorLevel == LOG_HIT){
        strcpy(Level, "HIT");
    }
    else if (nErrorLevel == LOG_WARN){
        strcpy(Level, "WARN");
    }
    else if (nErrorLevel == LOG_ERROR){
        strcpy(Level, "ERROR");
    }
    else if (nErrorLevel == LOG_CRITICAL){
        strcpy(Level, "CRITICAL");
    }
    else{
        strcpy(Level, "UNKNOW");
    }

    //输出时间
    time_t timer;
    time(&timer);
    struct tm *today = localtime(&timer);
    //[2005-03-25 11:29:16]
    sprintf(Buf,"[%04d-%02d-%02d %02d:%02d:%02d LEVEL = %s] ",
            today->tm_year + 1900,
            today->tm_mon + 1,
            today->tm_mday,
            today->tm_hour,
            today->tm_min,
            today->tm_sec,
            Level);

    //写到LOG文件.
    fprintf(pLog_, "%s", Buf);
    memset(Buf, 0, nBufSize);
    //分析输入可变参数.
    va_list args;
    va_start(args, pFormatStr);
    vsprintf(Buf, pFormatStr, args);
    va_end(args);

    //写到LOG文件.
    fwrite(Buf, strlen(Buf), 1, pLog_);

    //缓冲区写到文件.
    fflush(pLog_);
    lock_.Unlock();
}
void LogFile::Close(void)
{
    lock_.Lock();
    if (pLog_){
        fclose(pLog_);
        pLog_ = NULL;
    }
    lock_.Unlock();
}
void LogFile::CreateFile(char* pszFileName)
{
    lock_.Lock();
    //输出时间.
    time_t timer;
    time(&timer);
    struct tm *today = localtime(&timer);
    char chBuf[MAX_PATH] = {0};
    sprintf(chBuf, "%s%04d%02d%02d%s",
            pszFileName,
            today->tm_year + 1900,
            today->tm_mon + 1,
            today->tm_mday,
            ".log");

    if (memcmp(file_name_, chBuf, strlen(chBuf)) != 0){
        if (pLog_){
            this->Close();
            pLog_ = NULL;
        }

        memcpy(file_name_, chBuf, strlen(chBuf));
        pLog_ = fopen(file_name_, "a");
    }
    lock_.Unlock();
}







        
log4cpp vs spdlog:C++日志库性能对比与选型指南(2024实测版) 本文基于2024年实测数据,深入对比了log4cpp与spdlog两大C++日志库在架构设计、性能表现、平台适配及高级功能上的差异。spdlog凭借其零分配、无锁队列等现代设计,在多线程高并发场景下展现出显著性能优势,尤其适合对性能有严格要求的现代C++项目。log4cpp则以其灵活的三层架构和丰富的功能,在需要复杂日志路由或与Java生态集成的场景中仍有价值。文章为不同应用场景提供了清晰的选型指南。 阅读详情

相关推荐

cpp-httplib文件上传实战:用C++实现跨平台HTTP文件传输服务

本文详细介绍了如何使用cpp-httplib库在C++中构建跨平台的HTTP文件传输服务。内容涵盖从库的安装与集成、服务端稳健接收文件(包括大文件流式处理思路)、客户端实现基础与分片上传,到生产环境所需的错误处理、日志记录与安全加固等全流程实战指南,帮助开发者快速实现高效可靠的文件上传功能。

weixin_29216957的博客 517

C++简易日志类(跨平台、支持日志文件和VS输出窗口打印)

C++简易日志类(跨平台、支持日志文件和VS输出窗口打印)

Allen Roson 4205

CLion实战:基于CMake构建跨平台C++日志库

CMake作为C/C++跨平台构建的事实标准,通过抽象项目描述与本地构建工具,实现了“一次编写,到处构建”的核心价值。其原理在于将平台差异封装在生成器(如Makefiles、Visual Studio解决方案)中,开发者只需维护统一的CMakeLists.txt。这种模式极大提升了工程实践效率,尤其在开发需要部署于Windows、Linux、macOS等多环境的应用程序时,例如日志系统、网络服务等基础组件。CLion作为深度集成CMake的智能IDE,将代码分析、重构、调试与跨平台构建无缝衔接,提供了统一的

weixin_33845881的博客 489

C++类设计:一个不同版本的日志类(完整源码)

C++类设计:一个不同版本的日志类(完整源码)

编程之道在明明德在亲民在止于至善 1209

C++的后端框架从头开发

基于C++的后端框架Ratel 简介: 从开发到现在已经半个月了,我会进行长期地开发、维护和优化,直到它变得完善。各种建议和错误读者都可以和我联系,从公众号中就可以找到我的联系方式~ Ratel后端框架目前采用C++作为开发语言,理想的效果是实现一个通用的、灵活的、高效的后端开发框架,可以自由选择不同的I/O复用机制,可以自由选择采用多线程、多进程或协程方式实现,并且可以跨平台Linux和Window平台编译和运行。 目前已有功能: Linux和Windows跨平台运行

hailong66666的博客 5241

C++跨平台日志系统设计与实现

在现代软件开发中,日志系统是不可或缺的组件之一。它不仅仅是一个记录运行时信息的工具,更是定位和分析问题的利器。一个设计良好的日志系统,可以提高软件的可维护性和系统的可观测性。C++作为一种性能优秀且灵活的编程语言,在实现日志系统方面具备独特的优势,无论是因为其对内存和资源管理的精细控制,还是由于其支持底层系统调用的能力。在本章中,我们将对C++实现的日志系统做一个基础的介绍。我们首先会探讨日志系统在软件开发中的重要性,然后概述C++语言在实现日志系统时的特性。

weixin_29317963的博客 717

Google C++ Style Guide 笔记1

无意中看到了 Google C++ Style Guide ,开始简简单单的的看了一下,发现很有意思,很久都没看英文文档了,这次碰到了,我就简单的翻译了一下,途中才知道英文没学好就罢了,中文也是一塌糊涂,真是“少壮不努力,老大徒伤悲”呀!Google C++ Style Guide,姑且我翻译为Google C++ 风格向导。每个单位,每个团队,每个人都有自己的编码习惯,也不能说谁的一定好,谁的一定差,总之,我认为有很好的可读性,和有很好的维护性的代码风格为好。看别人的东西是很有快感的,英文也是那样,但是

ccing的专栏 1304

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

【小沐学C++】C++实现日志功能:log4cplus(Win10+VS2017)

log4cplus 是一个简单易用的 C++ 日志 API,提供线程安全、灵活和任意粒度的日志管理和配置控制。它以 Java log4j API 为模型。

爱看书的小沐 1万+

CST软件中SPICE模型的高效导出与转换技巧(txt到cir实战指南)

本文详细介绍了在CST Studio Suite中高效导出与转换SPICE模型的实战技巧,重点讲解了如何将txt格式的模型转换为通用的cir格式。内容涵盖三种模型存在形式的处理方法、格式检查与内容清理、端口一致性验证等关键步骤,并提供了利用LTspice Export功能、批处理脚本以及结果一致性校验等进阶指南,帮助工程师实现场路协同仿真模型的无缝迁移与应用。

silver的专栏 1185

arduino esp8266_Arduino传感器教程 第22章ESP8266 控制 5V 继电器

ESP8266控制5V继电器目录一、NodeMCU二、工作原理本文将使用亚马逊 AlexaEcho 和 ESP8266 控制 5V 继电器。NodeMCUNodeMCU 是一个开源的 IoT 物联网硬件开发板,由于它支持 WIFI 功能且使用方法十分类似 Arduino 开发板,所以近些年获得了越来越多来自全世界的创客朋友们的青睐。NodeMCU 尺寸与 Arduino Nano 类似。...

weixin_39611722的博客 3456

【C++模块实现】| 【01】日志系统实现

代码】【C++模块实现】|【01】日志系统实现。

weixin_45926547的博客 3674

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 578

【Linux系统编程】线程池项目实战与基于策略模式的日志系统

你的程序还在std::cout << hello吗?如何用一条精巧优雅的日志替代呢?线程同步互斥我们已经学过了,那如何让我们的任务高并发的运行?

Miun123的博客 4016

AgentScope 实战训练营-构建元规划智能体(Meta Planner Agent)—— 从 0 到 1 完整实现

本文介绍了基于AgentScope框架开发的元规划智能体(Meta Planner Agent)系统。该系统通过任务拆解和子代理编排机制,实现复杂任务的自动化处理。核心架构分为用户层、规划器层和子代理层,其中规划器作为"项目经理"负责任务分解、创建子代理并协调执行流程。关键技术包括AgentScope多智能体框架、DashScope大语言模型、PlanNotebook计划管理工具等。

program哲学 359

C#实现图片裁剪 (附完整源码)

C#实现图片裁剪 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 508

HDagger项目架构解析:头文件库的设计哲学与实战指南

前往项目官网免费下载:[https://ar.openeuler.org/ar/](https://ar.openeuler.org/ar/?utm_source=csdn_blog) 在C/C++开发领域,头文件库的设计哲学一直是一个值得深入探讨的话题。今天,我们将全面解析openEuler社区的HDagger项目——一个通过头文件提供base64编码、硬件CRC校验、文件操作、锁操作、日志记

gitblog_06869的博客 186

路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真)

图解A*、Dijkstra、GBFS算法原理,分析三种算法异同,提供C++/Python/Matlab仿真实现

FRIGIDWINTER的博客 2万+

c语言的单线程设置,C语言 单线程

C/C++ code#include #include #include #ifdef WIN32#include #include #include #define MYVOID void#else#include #include #include #define CRITICAL_SECTION pthread_mutex_t#define _vsnprin...

weixin_34434736的博客 398

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

POCO C++简介

POCO C++是一个开源的C++类库的集合,它主要提供简单的、快速的网络和可移植应用程序的C++开发,这个类库和C++标准库可以很好的集成并填补C++标准库的功能空缺。POCO库的模块化、高效的设计及实现使得POCO特别适合嵌入式开发。在嵌入式开发领域,由于C++既适合底层(设备I/O、中断处理等)和高层面向对象开发,越来越流行。当然POCO也准备好了面对企业级挑战。 C++简介" tit

jason1_csdn的专栏 563

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

FFmpegKit跨平台多媒体处理框架深度剖析与架构设计

FFmpegKit作为一个专业级跨平台多媒体处理解决方案,为Android、iOS、Linux、macOS、tvOS、Flutter和React Native应用提供了统一的FFmpeg集成接口。该项目基于FFmpeg v4.5-dev及以上版本构建,通过精心设计的包装层和异步执行模型,实现了在不同平台上的高性能音视频处理能力。FFmpegKit的架构设计体现了现代多媒体处理框架的技术深度,为开发

gitblog_00838的博客 440

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

oneTBB 内存分配器配置完全指南:scalable_allocation_mode / scalable_allocation_command 与环境变量调优

oneTBB(oneAPI Threading Building Blocks)自带一套与库主体分离的可扩展内存分配器(`tbbmalloc`),用于缓解多线程程序中共享内存池带来的可扩展性瓶颈。本文基于 [Allocator_Configuration.rst](https://link.gitcode.com/i/f56a089ba329c93a4b93269d9bfe567e) 展开,系统讲

gitblog_06819的博客 154

C++ Log4cpp跨平台日志库使用记录(Window与Linux)

介绍log4cpp的项目用法,将在项目中常用的用法代码写下来分享!

cpp_learner的博客 8035

C++ Log4cpp跨平台日志库实战:从编译到项目集成(Windows/Linux)

本文详细介绍了C++ Log4cpp跨平台日志库的实战应用,包括Windows和Linux平台的编译指南、项目集成最佳实践以及性能优化技巧。通过模块化设计和配置文件+单例模式的组合方案,帮助开发者高效管理日志系统,提升多线程环境下的日志处理能力。

weixin_33744141的博客 482

一个快速的C++ 日志库--spdlog简介

SPDLog是一个高性能C++11日志库,具有以下核心特点:1)极致的性能表现,支持同步/异步模式;2)丰富的日志目标(控制台、轮转文件、系统日志等);3)强大的格式化功能(基于fmt库);4)完善的线程安全机制,通过互斥锁和无锁队列实现多线程安全;5)灵活的日志级别管理和过滤功能。该库采用MIT许可证,支持跨平台使用,提供头文件和编译两种安装方式,具有轻量易用、扩展性强等优势,广泛应用于各类C++项目中。

dengfuma的专栏 1506
上一篇: 成就vim高手(二)--vim插件
下一篇: 在C/C++程序中打印变量名称
成都未眠
博客等级 码龄16年 20粉丝 16原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值