很多程序都有个log功能,可以把运行时的一些信息存到一个文件中,这样可以在Release的时候查看信息,也可以帮助调试,下面这个类接受一个文件名为参数,可以将信息生成为xml文件,然后借助xsl文件直接可以看到html格式的信息
applog.h
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class CAppLog
{
public:
CAppLog(char* fileName);
bool LogMessage(char* msg, ...);
virtual ~CAppLog();
private:
void writeXMLHead();
void writeXMLEnd();
void beginXMLRecord(ofstream& os);
void endXMLRecord(ofstream& os);
string m_sFileName;
};
实现applog.cpp
CAppLog::CAppLog(char* fileName)
{
if(fileName)
this->m_sFileName = fileName;
else
m_sFileName = "app.xml";
writeXMLHead();
}
CAppLog::~CAppLog()
{
writeXMLEnd();
}
bool CAppLog::LogMessage(char* msg, ...)
{
ofstream os(m_sFileName.c_str(), ios_base::app | ios_base::out);
if(os)
{
beginXMLRecord(os);
va_list argp;
va_start(argp, msg);
char szTmp[1024];
vsprintf(szTmp, msg, argp);
va_end(argp);
os<<szTmp;
endXMLRecord(os);
os.close();
return true;
}
return false;
}
void CAppLog::writeXMLHead()
{
string head = "<?xml version=\"1.0\" encoding=\"GB2312\"?>\n"
"<?xml-stylesheet href=\"log.xsl\" type=\"text/xsl\"?>\n"
"<LogInfo>\n\t<AppName>AppName</AppName>\n";
ofstream os(m_sFileName.c_str(), ios_base::app | ios_base::out);
if(os)
{
os<<head<<endl;
os.close();
}
}
void CAppLog::writeXMLEnd()
{
string end = "</LogInfo>";
ofstream os(m_sFileName.c_str(), ios_base::app | ios_base::out);
if(os)
{
os<<end<<endl;
os.close();
}
}
void CAppLog::beginXMLRecord(ofstream& os)
{
string msgHead ="\t<Message>\r\n";
time_t now;
now = time(NULL);
string sTime = ctime(&now);
int n = sTime.find('\n');
if(n > 0)
{
sTime[n] = '\0';
}
string msgTime = "\t\t<time>";
msgTime += sTime;
os<<msgHead<<msgTime;
msgTime = "</time>\r\n\t\t<content>";
os<<msgTime;
return;
}
void CAppLog::endXMLRecord(ofstream& os)
{
string msgEnd = "</content>\r\n\t</Message>\r\n";
os<<msgEnd;
}
使用的时候如下:
CAppLog appLog("c:\\log.xml");
char* s = "hello";
int n = 100;
appLog.LogMessage("My log info %d %s", n, s);
将这个log.xsl文件放在同一目录下
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title><xsl:value-of select="LogFile/AppName" /> ÈÕÖ¾Îļþ</title>
</head>
<body>
<h1><center><xsl:value-of select="LogFile/AppName" /> ÔËÐÐÈÕÖ¾Îļþ</center></h1>
<table border="0" cellspacing="1" cellpadding="0">
<tr>
<td bgcolor="#dddddd">
<table border="1" cellpadding="3" cellspacing="1">
<xsl:for-each select="LogInfo/Message">
<tr onMouseover="">
<td bgcolor="#ffffff" valign="top"><xsl:number count="Message" />.</td>
<td bgcolor="#ffffff" valign="top"><nobr><xsl:value-of select="time" /></nobr><xsl:value-of select="Time" /></td>
<td bgcolor="#ffffff" valign="top"><xsl:value-of select="content" /></td>
</tr>
</xsl:for-each>
</table>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>