VC++ 一个简单的Log类
在软件开发中,为程序建立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类的更多相关文章
- python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...
- Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》
Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676
- Python之自定义封装一个简单的Log类
参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...
- C++定义一个简单的Computer类
/*定义一个简单的Computer类 有数据成员芯片(cpu).内存(ram).光驱(cdrom)等等, 有两个公有成员函数run.stop.cpu为CPU类的一个对象, ram为RAM类的一个对象, ...
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, cl ...
- 一个简单的string类,读书看报系列(一)
对于这个类,写过程序的都知道应该含有的方法是 初始化.销毁.拼接.求长度.清除.判断是否为空等.还有一些操作符重载 一.先看初始化: 可以想到应该有默认构造的的.带有字符串的.带有默认字符的.还有一个 ...
- Python一个简单的数据库类封装
#encoding:utf-8 #name:mod_db.py '''使用方法:1.在主程序中先实例化DB Mysql数据库操作类. 2.使用方法:db=database() db.fet ...
- 自己写的一个简单的Tab类
//------------- PS_DOM 功能函数 start----------------var PS_DOM ={ indexOf: function(arr, e){ for(var i= ...
- 实现一个简单的Log框架
实际上算不上框架,只是自己对日志框架的一点理解. 核心接口:Logger,供调用者完成不同等级的日志输出 package com.lichmama.log.service; public interf ...
随机推荐
- 分布式缓存Redis使用心得
一.缓存在系统中用来做什么 1. 少量数据存储,高速读写访问.通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景. 2. 海量数据存储, ...
- requests 模块
发送请求 使用Requests发送网络请求非常简单. 一开始要导入Requests模块: >>> import requests 然后,尝试获取某个网页.本例子中,我们来获取Gith ...
- 查询当前Database下所有Datatable及所有记录数
DECLARE @TableName varchar(); CREATE TABLE #GetRecordingTempTable([id] [INT] IDENTITY(,) NOT NULL, [ ...
- UIView的setNeedsDisplay和setNeedsLayout
1,UIView的setNeedsDisplay和setNeedsLayout方法 首先两个方法都是异步执行的.而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到 UI ...
- PHP处理海量样本相似度聚类算法
catalogue . TF-IDF . 基于空间向量的余弦算法 . 最长公共子序列 . 最小编辑距离算法 . similar_text . local sensitive hash 局部非敏感哈希 ...
- npm 使用记录
在 Mint 下安装 pencil,折腾半天,发现它对 firefox 的支持,只到 46.0 .本来打算研究下怎么用 xulrunner 来跑 pencil 这个 web 应用,查看项目资源的时候, ...
- Linux 远程复制文件
Linux 远程复制文件 如果想把机器A上面的dir目录下面的所有文件复制到机器B的dir目录下,我们可以使用nc命令来完成 在机器A的dir目录下面执行: tar -czf - * | nc -l ...
- nginx 499 状态码优化
在grafana界面中发现不少499的状态码,在网上了解到出现499的原因大体都是说服务端处理时间过长,客户端主动关闭了连接. 既然原因可能是服务端处理时间太长了,看一下upstream_resp ...
- 第二轮冲刺-Runner站立会议09
今天:将日历界面和主程序结合起来 明天:查看整个项目,调试是否有问题
- [NHibernate]关联映射
系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate ...