写日志类 vs2010 日志文件按月,每月写一个日志文件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: #pragma once class LogFile { protected: CRITICAL_SECTION _csLock; char * _szFileName; HANDLE _hFile; bool OpenFile();//打开文件, ...
#pragma once
class LogFile
{
protected:
    CRITICAL_SECTION _csLock;
    char * _szFileName;
    HANDLE _hFile;
    bool OpenFile();//打开文件, 指针到文件尾
    DWORD Write(LPCVOID lpBuffer, DWORD dwLength);
    virtual void WriteLog( LPCVOID lpBuffer, DWORD dwLength);//写日志, 可以扩展修改
    void Lock()  {::EnterCriticalSection(&_csLock); }
    void Unlock() {::LeaveCriticalSection(&_csLock);} 
    char szFileSuffix[32]; //文件后缀
public:
    LogFile(char*szFileName);
    virtual ~LogFile();
    const char * GetFileName()
    {
        return _szFileName;
    }

    void SetFileName(const char *szName);//修改文件名, 同时关闭上一个日志文件
    bool IsOpen()
    {
        return _hFile != INVALID_HANDLE_VALUE;
    }

    void Close();
    void Log(LPCVOID lpBuffer, DWORD dwLength);//追加日志内容
    void Log(const char *szText){
        Log(szText, strlen(szText));}
    void Log(CString str);
    void Log(TCHAR *buffer);
private://屏蔽函数
    LogFile(const LogFile&);
    LogFile&operator = (const LogFile&);
};

 

#include "StdAfx.h"
#include "LogFile.h"



LogFile::LogFile(char*szFileNameParam)
{
    memset(szFileSuffix,0,sizeof(szFileSuffix));
    strcat_s(szFileSuffix,szFileNameParam);  //文件后辍,不带日期
    _szFileName = NULL;
    _hFile = INVALID_HANDLE_VALUE;
    ::InitializeCriticalSection(&_csLock);

    //求出当前日期
    time_t now;
    time(&now);
    char szCurDate[256] = {0};
    struct tm newtime;
    localtime_s(&newtime,&now);
    strftime(szCurDate,19,"%Y%m",&newtime);

    char szFileName[64] = {0};
    strcat_s(szFileName,10,szCurDate); //日期在前面
    strcat_s(szFileName,szFileSuffix);  //追加文件名
    SetFileName(szFileName);
}

//-------------------------------------------------------------------------
LogFile::~LogFile()
{
    ::DeleteCriticalSection(&_csLock);
    Close();
    if(_szFileName)
        delete [] _szFileName;
}
//-------------------------------------------------------------------------
bool LogFile::OpenFile()
{
    if(IsOpen())
        return true;
    if(!_szFileName)
        return false;

    _hFile = CreateFileA(
        _szFileName,
        GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if(!IsOpen() && GetLastError() == 2)//打开不成功, 且因为文件不存在, 创建文件
        _hFile = CreateFileA(
        _szFileName,
        GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if(IsOpen())
        SetFilePointer(_hFile, 0, NULL, FILE_END);
    return IsOpen();
}
//-------------------------------------------------------------------------
DWORD LogFile::Write(LPCVOID lpBuffer, DWORD dwLength)
{
    DWORD dwWriteLength = 0;
    if(IsOpen())
        WriteFile(_hFile, lpBuffer, dwLength, &dwWriteLength, NULL);
    return dwWriteLength;
}
//-------------------------------------------------------------------------
void LogFile::WriteLog( LPCVOID lpBuffer, DWORD dwLength)
{
    DWORD dwWriteLength;
    char buf[1024]={0};
    strcat_s(buf,1000,(char*)lpBuffer);
    if(IsOpen())
    {
        time_t now;
        time(&now);
        char temp[1024];
        struct tm newtime;
        localtime_s(&newtime,&now);
        memset(temp,0,sizeof(temp));
        strftime(temp, 64, "%Y-%m-%d %H:%M:%S   :", &newtime);
        strcat_s(temp,128,"   :");
        strcat_s(temp,1024,buf);
        WriteFile(_hFile, temp,strlen(temp), &dwWriteLength, NULL);
        WriteFile(_hFile, "\r\n",2, &dwWriteLength, NULL);
        FlushFileBuffers(_hFile); //存硬盘

    }
    else
    {
        ;
    }
}
//-------------------------------------------------------------------------
void LogFile::SetFileName(const char *szName)
{
    //assert(szName);

    if(_szFileName != NULL)
    {
        //AfxMessageBox(_T("_szFileName is NULL"));
        delete []_szFileName;
    }
    Close();
    int len = strlen(szName);
    _szFileName = new char[32];
//    assert(_szFileName);
    strcpy_s(_szFileName,30,szName);
}
//-------------------------------------------------------------------------
void LogFile::Close()
{
    if(IsOpen())
    {
        CloseHandle(_hFile);
        _hFile = INVALID_HANDLE_VALUE;
    }
}
//-------------------------------------------------------------------------
void LogFile::Log(LPCVOID lpBuffer, DWORD dwLength)
{
//    assert(lpBuffer);
    __try
    {
        Lock();

        //算出现在应该写日志的文件名
        time_t now;
        time(&now);
        char szCurDate[256] = {0};
        struct tm newtime;
        localtime_s(&newtime,&now);
        strftime(szCurDate,19,"%Y%m",&newtime);
        char szCurFileName[64] = {0};
        strcat_s(szCurFileName,10,szCurDate); //日期在前面
        strcat_s(szCurFileName,szFileSuffix);  //追加文件名
        if(!PathFileExistsA(szCurFileName))
            SetFileName(szCurFileName);

        if(OpenFile())
            WriteLog(lpBuffer, dwLength);
    }
    __finally
    {
        Unlock();
    }
}

void LogFile::Log(TCHAR *buffer)
{
    CT2A buf_str(buffer);
    Log(buf_str);
}
void LogFile::Log(CString str)
{
    Log(str.GetBuffer());
}

 

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
专有云 Serverless 持续交付
亚太唯一,阿里云再度入选Gartner®容器管理魔力象限领导者
Gartner正式发布 2024《容器管理魔力象限》报告,阿里云再度成为中国唯一一家入选「领导者象限」的科技公司。
|
10月前
|
人工智能 搜索推荐 自动驾驶
如何抓住本世纪伟大成就AI的风口脱颖而出?AI到底会带来什么影响?AI对程序员的影响?AI对软件行业的影响?——2025年如何抓住AI的机会-成为AI工程师-程序员可成为高级AI工程师
如何抓住本世纪伟大成就AI的风口脱颖而出?AI到底会带来什么影响?AI对程序员的影响?AI对软件行业的影响?——2025年如何抓住AI的机会-成为AI工程师-程序员可成为高级AI工程师
712 55
|
数据库 开发者 Python
Tornado框架:速度与简洁的完美结合,但它真的适合你吗?
【8月更文挑战第31天】在Web开发领域,框架的选择至关重要,影响着项目的结构、效率及扩展性。Tornado作为一个兼具性能与易用性的框架,提供了非阻塞I/O和异步支持,适用于高性能Web应用。与需配合WSGI服务器的Django和Flask不同,Tornado集成了HTTP服务器,能独立处理高并发请求。通过简单的安装和示例代码即可搭建HTTP服务器,并利用其异步机制提升资源利用率。尽管Tornado在处理I/O密集型任务时表现出色,但对于不熟悉异步编程的开发者来说,学习曲线较陡。总体而言,Tornado适合高并发场景,但在快速开发和复杂业务逻辑上,Django和Flask仍是不错的选择。
555 0
|
移动开发 安全 测试技术
全新完整版H5商城系统源码
H5商城系统设置是实现商城基本功能的核心部分,涵盖了从网站配置、短信和支付配置,到商品、工单、订单、分站和提现管理等多个模块的设置。以下是详细的设置指南,帮助您快速上手并高效管理商城系统。 测试环境:Nginx+PHP7.0+MySQL5.6
303 2
|
SQL 数据可视化 数据挖掘
让项目数据更有说服力:五款必备数据可视化管理工具推荐
在现代企业管理中,数据是决策的重要依据。有效的数据可视化工具能帮助项目经理快速洞察项目进展、评估风险、优化资源配置。本文推荐五款必备的数据可视化管理工具,包括板栗看板、Power BI、Tableau、Google Data Studio和Qlik Sense,从功能、易用性和优缺点等方面进行全面评析,帮助您将数据转化为行动,推动项目高效前行。
482 4
|
传感器 人工智能 自然语言处理
人工智能数据
人工智能数据
646 1
|
存储 算法 开发工具
git文件夹内容详解
git文件夹内容详解
938 1
|
Python
Python软件包管理工具pip实战篇
详细介绍了Python软件包管理工具pip的使用方法,包括安装、搜索、卸载软件包,修改软件源,导出和安装依赖列表,以及查看pip版本和配置信息等操作,并提供了相关命令示例。
345 0
Python软件包管理工具pip实战篇
|
运维 监控 安全
阿里云香港轻量应用服务器评测,1核1G 30M 24元/月,低价VPS
阿里云香港轻量应用服务器评测,1核1G 30M 24元/月,低价VPS
5687 0
三对角矩阵(Triangular Matrix)
三对角矩阵(Triangular Matrix)是一种特殊形式的矩阵,其非零元素仅位于主对角线以及主对角线两侧的相邻对角线上。三对角矩阵在数学、工程和计算机科学等领域中都有广泛应用,特别是在线性代数中。以下是一些关于三对角矩阵的特点和应用:
1715 6