C++记录debug信息的log类
取自:http://www.viksoe.dk/code/all_mfc.htm,里面有各种MFC常用的类
// LogFile.h: interface for the CLogFile class.
//
// Written by Bjarke Viksoe (bjarke@viksoe.dk)
// Copyright (c) 2000.
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed by any means PROVIDING it is
// not sold for profit without the authors written consent, and
// providing that this notice and the authors name is included.
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage to you or your
// computer whatsoever. It's free, so don't hassle me about it.
//
// Beware of bugs.
//////////////////////////////////////////////////////////////////////// #if !defined(AFX_LOGFILE_H__0EE45201_E8F9_11D1_93C1_241C08C10000__INCLUDED_)
#define AFX_LOGFILE_H__0EE45201_E8F9_11D1_93C1_241C08C10000__INCLUDED_ #if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000 // A small class implementing a debug log file.
class CLogFile : public CObject
{
public:
CLogFile();
CLogFile(LPCTSTR Filename);
virtual ~CLogFile(); // Methods
public:
// Creates (removes previous) log file.
RETCODE Create(LPCTSTR Filename, LPCTSTR Text);
// Set the filename of the log fil to use.
RETCODE SetFilename(LPCTSTR Filename);
// Creates or appends to an exisiting log file.
RETCODE AppendText(LPCTSTR Text, ...);
// Writes System Information to the log
RETCODE LogSystemInformation(); // Variables
protected:
CString m_Filename; // The log file we're currently writing to.
}; #endif // !defined(AFX_LOGFILE_H__0EE45201_E8F9_11D1_93C1_241C08C10000__INCLUDED_)
LogFile.cpp
// LogFile.cpp: implementation of the CLogFile class.
//
// A small class which can be used for debug logs.
//
////////////////////////////////////////////////////////////////////// #include "stdafx.h"
#include "LogFile.h" #ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif //////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////// CLogFile::CLogFile()
{
} CLogFile::CLogFile(LPCTSTR Filename)
{
SetFilename( Filename );
} CLogFile::~CLogFile()
{
} //////////////////////////////////////////////////////////////////////
// Methods
////////////////////////////////////////////////////////////////////// RETCODE CLogFile::Create(LPCTSTR Filename, LPCTSTR Text)
{
ASSERT( Filename );
ASSERT( Text );
m_Filename = Filename;
ASSERT( !m_Filename.IsEmpty() );
if( m_Filename.IsEmpty() ) return RET_INVALIDARGS;
// Write text to (text)file
CStdioFile f;
TRY
{
BOOL res = f.Open( Filename, CFile::modeCreate|CFile::modeWrite|CFile::typeText );
if( res ) {
f.WriteString( Text );
f.WriteString( _T("\n") );
f.Close();
};
}
CATCH_ALL(e)
{
f.Abort();
#ifdef _DEBUG
e->ReportError();
#endif
return RET_ERROR;
}
END_CATCH_ALL;
return RET_OK;
}; RETCODE CLogFile::AppendText(LPCTSTR Text, ...)
{
ASSERT(AfxIsValidString(Text));
ASSERT(!m_Filename.IsEmpty());
if( m_Filename.IsEmpty() ) return RET_NOTINITIALIZED;
// Append text to (text)file
CStdioFile f;
CString sText;
va_list args;
va_start(args, Text);
sText.FormatV(Text, args);
TRY
{
BOOL res = f.Open( m_Filename, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::typeText );
if( res ) {
f.SeekToEnd();
f.WriteString( sText );
f.WriteString( _T("\n") );
f.Close();
};
}
CATCH_ALL(e)
{
f.Abort();
#ifdef _DEBUG
e->ReportError();
#endif
return RET_FILEERROR;
}
END_CATCH_ALL;
return RET_OK;
}; RETCODE CLogFile::SetFilename(LPCTSTR Filename)
// Sets the log filename. A new log file will
// be created if the file does not exist.
{
ASSERT(AfxIsValidString(Filename));
m_Filename = Filename;
if( m_Filename.IsEmpty() ) return RET_INVALIDARGS;
return RET_OK;
} RETCODE CLogFile::LogSystemInformation()
// Write some standard system information to
// the log file.
{
ASSERT(!m_Filename.IsEmpty());
if( m_Filename.IsEmpty() ) return RET_NOTINITIALIZED; SYSTEMTIME time;
::GetLocalTime( &time );
AppendText(_T("Date: %04d-%02d-%02d Time: %02d:%02d:%02d"),
time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond); OSVERSIONINFO verinfo;
verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
::GetVersionEx(&verinfo);
AppendText(_T("Win%s Version %d.%.2d (build %d) %s\n"),
(verinfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? _T("NT") : _T("")),
verinfo.dwMajorVersion,
verinfo.dwMinorVersion,
verinfo.dwBuildNumber,
verinfo.szCSDVersion); SYSTEM_INFO sysinfo;
LPCTSTR pszProcessor;
::GetSystemInfo(&sysinfo);
switch( sysinfo.dwProcessorType ) {
case PROCESSOR_INTEL_386:
case PROCESSOR_INTEL_486:
case PROCESSOR_INTEL_PENTIUM:
pszProcessor = _T("Intel ");
break;
case PROCESSOR_MIPS_R4000:
pszProcessor = _T("MIPS R");
break;
case PROCESSOR_ALPHA_21064:
pszProcessor = _T("DEC Alpha ");
break;
default:
pszProcessor = _T("Chipset ");
break;
}
return AppendText(_T("%s%d, %d Processor(s)\n"),
(LPCTSTR)pszProcessor,
sysinfo.dwProcessorType,
sysinfo.dwNumberOfProcessors);
};
C++记录debug信息的log类的更多相关文章
- 【技巧】Java工程中的Debug信息分级输出接口
也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...
- 【技巧】Java工程中的Debug信息分级输出接口及部署模式
也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...
- 谁记录了mysql error log中的超长信息
[问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...
- 谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)
[问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...
- CentOS下查看最后登录的用户信息以及LOG记录
CentOS下查看最后登录的用户信息tail /var/log/messagestail /var/log/secure 我们知道,在redhat下可以用lastlog查看各用户最后登录的信息,用la ...
- Android学习笔记Log类输出日志信息
Log类提供的方法 代码示例 .. Log.e(TAG,"[错误信息]"); Log.w(TAG,"[警告信息]"); Log.i(TAG,"[普通信 ...
- .net 创建属于自己的log类
实习到现在已经接近三个月了,由于是校企联合培养计划,所以没有工资,所幸公司对于我们这些实习生并没有什么要求,刚开始我还觉得要做点什么才能学得快,可是到了后来,发现公司安排给我们的任务并不紧要,也不算太 ...
- Log4Net在MVC下的配置以及运用线程队列记录异常信息
Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...
- VC++ 一个简单的Log类
在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...
随机推荐
- HDU 1011 Starship Troopers 树形DP 有坑点
本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...
- image和字节流之间的相互转换
//将图片转化为长二进制 public Byte[] SetImgToByte(string imgPath) { FileStream file = new FileStream(imgPath, ...
- 图片--android 图片占用内存与什么有关
原文链接:http://blog.csdn.net/zjl5211314/article/details/7041813 在开发手机应用的时候,内存是有限的,那使用的时候,就要合理的运用和释放. 那么 ...
- GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍
一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...
- js实现的新闻列表垂直滚动实现详解
js实现的新闻列表垂直滚动实现详解:新闻列表垂直滚动效果在大量的网站都有应用,有点自然是不言而喻的,首先由于网页的空间有限,使用滚动代码可以使用最小的空间提供更多的信息量,还有让网页有了动态的效果,更 ...
- html table单双行颜色间隔(转载)
直接上代码: <html> <head> <meta http-equiv="Content-Type" content="text/htm ...
- Python基础05 缩进和选择
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例. ...
- MVC 4 与WebForm 混合应用 WebApi 发布常见问题
1.所有应用的MVC相关程序集编译时要选择复制到本地,需要用到的程序如下图 2.IIS设置: 因为 IIS 7/8 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改.运 ...
- (*medium)LeetCode 211.Add and Search Word - Data structure design
Design a data structure that supports the following two operations: void addWord(word) bool search(w ...
- iOS 模态视图
模态视图不是专门的某个类,而是通过视图控制器的presentViewController方法弹出的视图,我们称为模态视图. 模态视图出现的场景一般是临时弹出的窗口,譬如:登录窗口: 模态视图弹出时通过 ...