实现一个基于xml的log类

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值