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 ...
随机推荐
- POJ 1986 DIstance Query LCA水题
给出一棵树,对于每一个询问,给出2个节点,输出2个节点的距离. 输入中有字母,那个是没有用的,不用管. 思路: 0.选择编号为1的节点作为树的root (注意:有些题的边是单向的,这时候我们要根据节点 ...
- 发布在IIS上的Web程序,调用服务器的COM组件
场景大致是这样的,在工厂中分布着许多的PDA点,这些PDA点都要进行实时的扫描--打印操作.实现方法是采用网络打印机,然后服务器安装驱动,管理着所有的打印机.然后服务器,发布一个WebService, ...
- 转-封装网络请求库,统一处理通用异常 (基于volley网络请求库)
http://blog.csdn.net/kroclin/article/details/40540761 一.前言 volley的发布让网络请求也变得十分便利,但是我们通常懒得很想用一两句代码实现一 ...
- mysql中游标的使用
BEGIN #遍历占领野地表还原军队 # and cityid=cityid) ,) ;#occupyWild表的TroopsId ,) ;#occupyWild表的CityId ,) ;#occup ...
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?(转)
如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见 ...
- SQL 锁的介绍
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...
- nginx 环境搭建(基于linux)
Nginx是一种服务器软件,故而其最主要.最基本的功能当然是可以与服务器硬件结合,让程序员可以将程序放在Nginx服务器上,将程序发布出去,让成千上万的网民可以浏览.除此之外,Nginx是一种高性能的 ...
- sikuli常用方法学习
Screen s = new Screen(); 1.在文本框中填入文本 以下两个方法都可以 type是用来在文本框中输入指定的文本 paste是用来在文本框中复制指定的文本 s.type(imgpa ...
- linux 多网卡 跃点数
centos6.4 配置两块网卡,eth0设置静态IP,8网段,eth1无线配置dhcp,都是开机启动. 但是eth1无线网卡一旦连接至开放网络(需要web登陆),就替换了之前eth0配置的默认网关, ...
- HDU 5808[数位dp]
/* 题意: 给你l和r,范围9e18,求l到r闭区间有多少个数字满足,连续的奇数的个数都为偶数,连续的偶数的个数都为奇数. 例如33433符合要求,44不符合要求.不能含有前导零. 思路: 队友说是 ...