在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试。

  下面实现了一个简单的Log类,使用非常简单,仅供参考。

 // CLogHelper.h : header file for log information
// #pragma once class CLogHelper
{
public:
CLogHelper(void);
~CLogHelper(void);
static void WriteLog(LPCTSTR lpszLog); private:
static CString MakeFilePath();
static CString MakeLogMsg(LPCTSTR lpszLog);
};

    

// LogHelper.cpp : implementation file
// #include "StdAfx.h"
#include "LogHelper.h"
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale> #define LOG_FILE_NAME _T("*Log.log") CLogHelper::CLogHelper(void)
{
} CLogHelper::~CLogHelper(void)
{
} void CLogHelper::WriteLog( LPCTSTR lpszLog )
{
// 获取日志文件路径
static CString strLogFilePath = _T("");
if (strLogFilePath.IsEmpty())
{
strLogFilePath = MakeFilePath();
}
// 判断日志文件是否存在,不存在则创建
wchar_t* pwchLogFilePath = strLogFilePath.AllocSysString();
errno_t err = ;
if ((err = _taccess_s(pwchLogFilePath, )) != )
{
CStdioFile file;
if(file.Open(strLogFilePath, CStdioFile::modeCreate))
{
file.Close();
}
}
// 向日志文件写入日志
CStdioFile file;
if (file.Open((LPCTSTR)strLogFilePath, CStdioFile::modeWrite | CStdioFile::shareDenyNone))
{
CString strMsg = MakeLogMsg(lpszLog);
file.SeekToEnd();
char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE, "chs" );  // 设定区域
file.WriteString(strMsg);
setlocale( LC_CTYPE, old_locale );
free( old_locale );        // 还原区域设定
file.Close();
} } CString CLogHelper::MakeLogMsg(LPCTSTR lpszLog)
{
CTime time = CTime::GetCurrentTime();
CString strMsg = time.Format("[%Y-%m-%d %H:%M:%S] ");
strMsg = strMsg + lpszLog + _T("\r\n");
return strMsg;
} CString CLogHelper::MakeFilePath()
{
// 获取当前进程路径
TCHAR szFilePath[MAX_PATH];
memset(szFilePath, , MAX_PATH);
::GetModuleFileName(NULL, szFilePath, MAX_PATH); (_tcsrchr(szFilePath, _T('\\')))[] = ;      // 删除文件名,只获得路径字符串
CString strFilePath = szFilePath;
strFilePath = strFilePath + LOG_FILE_NAME; return strFilePath;
}

  使用方法: 

CString strLogMsg = _T("程序开始运行...");
CLogHelper::WriteLog(strLogMsg);

VC++ 一个简单的Log类的更多相关文章

  1. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  2. Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》

    Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676

  3. Python之自定义封装一个简单的Log类

    参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...

  4. C++定义一个简单的Computer类

    /*定义一个简单的Computer类 有数据成员芯片(cpu).内存(ram).光驱(cdrom)等等, 有两个公有成员函数run.stop.cpu为CPU类的一个对象, ram为RAM类的一个对象, ...

  5. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  6. 一个简单的string类,读书看报系列(一)

    对于这个类,写过程序的都知道应该含有的方法是 初始化.销毁.拼接.求长度.清除.判断是否为空等.还有一些操作符重载 一.先看初始化: 可以想到应该有默认构造的的.带有字符串的.带有默认字符的.还有一个 ...

  7. Python一个简单的数据库类封装

    #encoding:utf-8 #name:mod_db.py '''使用方法:1.在主程序中先实例化DB Mysql数据库操作类.      2.使用方法:db=database()  db.fet ...

  8. 自己写的一个简单的Tab类

    //------------- PS_DOM 功能函数 start----------------var PS_DOM ={ indexOf: function(arr, e){ for(var i= ...

  9. 实现一个简单的Log框架

    实际上算不上框架,只是自己对日志框架的一点理解. 核心接口:Logger,供调用者完成不同等级的日志输出 package com.lichmama.log.service; public interf ...

随机推荐

  1. Nginx搭建https服务器

    HTTPS简介 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单来讲就是HTTP的安全版.即H ...

  2. windows下使用C#获取特定进程网络流量

    最近老板接了一个中船重工的项目,需要做一个有关海军软件系统的组件评估项目,项目中有一个子项目需要获取特定进程的各种系统参数,项目使用.NET平台.在获取特定进程各种系统参数时,其它诸如进程ID,进程名 ...

  3. Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询

    在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...

  4. 基本排序算法的Python实现

    本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性 ...

  5. hashlib 和 hmac

    import hashlib hash = hashlib.md5([bytes('SALT_STRING', encoding='utf-8’)]) #SALT_STRING :加盐 hash.up ...

  6. React2

    1.属性 a. 属性和状态是react中数据传递的载体: b. 属性是声明以后不允许被修改的东西: c. 属性只能在组件初始化的时候声明并传入组件内部,并且在组件内部通过this.props获取: d ...

  7. delphi 取cpu号

    从网上找的取cpu号 在d7中测试通过了 push,move,pop ...有点难 现在的水平我也就只能拿来主义了 /// <summary>/// 取cpu号/// </summa ...

  8. Neural Style学习3——操作

    Basic usage: th neural_style.lua -style_image <image.jpg> -content_image <image.jpg> Ope ...

  9. 【BZOJ-2669】局部极小值 状压DP + 容斥原理

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 561  Solved: 293[Submit][Status ...

  10. Node实践之一

    大家都知道JavaScript的专长就是处理客户端也就是与浏览器打交道了,所有的与服务器端的交互必须交给后台语言处理程序去做,基于JavaScript不能与服务器进行直接交互这样一个现状,Ryan D ...