实现一个基于xml的log类

类别:编程语言 点击:0 评论:0 推荐:

很多程序都有个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>

本文地址:http://com.8s8s.com/it/it26589.htm