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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
#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());
}
复制代码

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
Java Apache 开发工具
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
|
14天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
123 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
15天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
15天前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
1月前
|
监控 Linux 应用服务中间件
系统监控:使用日志文件 journalctl的使用
本文介绍了如何使用`journalctl`命令来监控和查看Linux系统的日志文件,包括查看特定行数、过滤日志级别、实时跟踪日志、按时间段查询日志以及日志轮换和压缩的配置。
51 2
系统监控:使用日志文件 journalctl的使用
|
11天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的撤销日志文件和错误日志文件
本文介绍了MySQL的物理存储结构,重点讲解了InnoDB存储引擎中的撤销日志文件(undo log)和错误日志文件。从MySQL 8.0开始,默认生成两个10MB的undo表空间文件,并支持动态扩容和收缩。错误日志文件记录了MySQL启动、运行、关闭过程中的问题,通过示例展示了如何查看和使用这些日志。
|
1月前
|
SQL 数据库
为什么 SQL 日志文件很大,我应该如何处理?
为什么 SQL 日志文件很大,我应该如何处理?
|
1月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
39 1
|
1月前
|
存储 监控 固态存储
如何监控和优化 WAL 日志文件的存储空间使用?
如何监控和优化 WAL 日志文件的存储空间使用?
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
49 2
下一篇
无影云桌面