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

#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());
}

 

时间: 2024-10-28 12:09:59

写日志类 vs2010 日志文件按月,每月写一个日志文件的相关文章

C# 日志类

本文代码来自:http://www.oschina.net/code/snippet_1181744_27513 作者:ebola 该类的作用:简单日志类,队列实现.可按天 周 月 年 大小分割文件. 代码如下: using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System

导入个web项目,想在里面写入新的类扩展它的功能,部署到tomcat里运行,没有感应到新写的类,找不到java或class文件,以前的类就会在tomcat编译?

问题描述 今天遇到导入个web项目,想在里面写入新的类扩展它的功能,新建的类,写完了,部署到tomcat里,发现没有感应到新写的类,找不到java和对象的class文件,在work文件夹里和classes文件夹,都找不到新写的类,以前有的类就会在tomcat编译.够郁闷的,没法调.我的其他web项目是可以的.我的工具和环境应该没问题.别人写的,编译的运行都是1.6jdk的.tomca也是用6的,我的也是一样.我的myeclipse是10.6,实在想不出来是哪里错了.唉,郁闷.求解. 解决方案 解

fgets-如何没从一个txt文件中读取数据,然后将这条从txt文件中删除

问题描述 如何没从一个txt文件中读取数据,然后将这条从txt文件中删除 就是用于post的模块,从txt中读取一行post信息之后将它post出去,如果post成功,就将它从日志txt中删除. 感觉这个读取还好说,一行用fgets拉出来就可以post了吧 但是这个删除该如何是好 这就是一个起到日志作用的txt,如果可以Post的情况就一条一条post出去,不可以就存进来,大家来给我一点意见吧 解决方案 从一个txt文件中读取矩阵从一个txt文件中读取矩阵从oracle中读取数据并保存在txt文

javaweb 大文件上传-上传单个大文件和一次上传多个分割文件效果一样吗?

问题描述 上传单个大文件和一次上传多个分割文件效果一样吗? 用struts2上传大文件.直接上传一个大文件,和在一个表单里面上传它的分割个文件效果一样吗?就是多文件上传是一个一个文件的进入内存上传释放内存,还是一次性全部进内存.. 对js不熟,没学过jQuery网上很多上传大文件的都看不懂.今天试着上传2个文件,一个20多M,一个30多M的.内存就到90%了... 解决方案 看你是怎么一个分隔,如果是ajax方式的,一个一个来,那么就是你说的一个一个读取内存再释放.如果是放在一个http会话中,

html5-JS,jQuery代码 封装到一个JS文件的问题

问题描述 JS,jQuery代码 封装到一个JS文件的问题 $(document).ready(function(){ $(".liren_content:odd").css("float",'right'); $('.mall_list').find('ul li:nth-child(3)').css('border','0'); var count=0; $(".jiaru").click(function () { // alert(111

自己发送一个视频文件,聊天记录里是否另外存了一份还是指向指向了原文件

问题描述 问:自己发送一个视频文件,聊天记录里是否另外存了一份还是指向了原文件,另外DEMo里在发送视频文件的时候要转换成mp4格式然后发送,然后就把原来的文件删除了,为什么要删原来的文件. 解决方案 存了一份的,至于删除是省空间啊解决方案二:我认为应该删除那个mp4文件而不是原来的文件,否则用户发送一个视频文件,结果自己的文件不见了变成了mp4的了,IM不应该去改变用户自己的东西,你觉得呢?

C++语言编写写日志类_C 语言

使用C++语言编写写日志类,支持写日志级别设置.支持多线程.支持可变形参表写日志. 主要提供以下接口: 1.设置写日志的级别 2.写关键日志信息 3.写错误日志信息 4.写警告日志信息 5.写一般日志信息 #ifndef COMMAND_DEFINE_H #define COMMAND_DEFINE_H //日志级别的提示信息 static const char * KEYINFOPREFIX = " Key: \n"; static const char * ERRORPREFIX

【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待

 [等待事件]等待事件系列(3+4)--System IO(控制文件)+日志类等待   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 控制文件类等待 ② 日志类等待   2.2  相关参考文章链接 [推荐] 等待事件系列(1)--User I/O类型(下) http://blog.itpub.net/26736162/viewspace-2124435

c++ 多线程写日志的一个很实用的日志类源码(支持 c++ builder)

1.日志基类 .h文件 //--------------------------------------------------------------------------- #ifndef UnitLogWriterH #define UnitLogWriterH #include <vcl.h> #include <time.h> #include <assert.h> //--------------------------------------------