在软件开发中,为程序建立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. 最好用的JQuery插件集合以及组合拳

    [Tab页签] Jquery-tab [Table] mmGrid

  2. C 语言学习 第二次作业总结

    本次作业内容,主要有以下几点: 新建 coding 帐号,且使用 coding 上传本次作业的代码 Printf及条件判断语句的使用 作业总结 作业总结: 同学们开始渐入佳境,能够较为流畅的写出合理的 ...

  3. canvas实践1

    今天同学遇到问题,我于是就利用了canvas帮他写了个效果,效果如图 我本来在学习不是很想做,但是昨天感觉自己学的有点累就去帮忙做了,我的思路是每次画一个矩形,然后通过rotate旋转让它自身旋转45 ...

  4. Mysql索引PRIMARY、NORMAL、UNIQUE、FULLTEXT 区别和使用场合

    索引 数据库的索引就像一本书的目录,能够加快数据库的查询速度. MYSQL索引有四种PRIMARY.INDEX.UNIQUE.FULLTEXT, 其中PRIMARY.INDEX.UNIQUE是一类,F ...

  5. 如何让tableViewCell的分割线从边框顶端开始

    在ios8上 [TableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];不起作用 经过测试加入下面方法 在ios7 8上都可以正常工作 -(voi ...

  6. hdu3087 LCA + 暴力

    Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  7. Prince2七大原则(4)

    我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁. 第四个原则:按阶段管理. 阶段管理其实是给高层提供了项目生命周期中相对应的控 ...

  8. BZOJ 2462: [BeiJing2011]矩阵模板

    2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 915  Solved: 432[Submit][Stat ...

  9. BZOJ3209 花神的数论题

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  10. 初识Jsoup之解析HTML

    按照国际惯例,我首先应该介绍下Jsoup是个什么东西,然后在介绍下具体用法,然后在来个demo演示,其实我也是这么想的,小编今天花了一天的时间从学习—>解析页面,总算是成果圆满了吧,啊哈,但是, ...