其他语言

本类阅读TOP10

·基于Solaris 开发环境的整体构思
·使用AutoMake轻松生成Makefile
·BCB数据库图像保存技术
·GNU中的Makefile
·射频芯片nRF401天线设计的分析
·iframe 的自适应高度
·BCB之Socket通信
·软件企业如何实施CMM
·入门系列--OpenGL最简单的入门
·WIN95中日志钩子(JournalRecord Hook)的使用

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
实现一个基于xml的log类

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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




相关文章

相关软件