??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美一级久久久久久久大,久久只有这里有精品4,亚洲精品白浆高清久久久久久http://www.shnenglu.com/daiybh/我的Q我的,q是我的Q!zh-cnWed, 07 May 2025 22:06:17 GMTWed, 07 May 2025 22:06:17 GMT60腾讯TM2008无法卸蝲问题--剔除Windows Installer的安装信?/title><link>http://www.shnenglu.com/daiybh/archive/2010/03/19/110075.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Fri, 19 Mar 2010 02:09:00 GMT</pubDate><guid>http://www.shnenglu.com/daiybh/archive/2010/03/19/110075.html</guid><wfw:comment>http://www.shnenglu.com/daiybh/comments/110075.html</wfw:comment><comments>http://www.shnenglu.com/daiybh/archive/2010/03/19/110075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/daiybh/comments/commentRss/110075.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/daiybh/services/trackbacks/110075.html</trackback:ping><description><![CDATA[<p>-----------------------------------------------------<br>此内{?from: http://blog.163.com/chen_chb/blog/static/29602002009880512839/<br><br>今天启动腾讯TM的时候让升Q没注意点了定Q结果升U完成,TM启动p|?/p> <p>提示“initialization failure 0x00000002”?/p> <p>惛_载tm2008Q结果找不到“tm2008 preview.msi”Q无法卸载,重新安装也要先卸载,实没办法了?/p> <p>后来到网上找{案Q终于解冟?/p> <p style="TEXT-INDENT: 2em">下蝲微Y提供的Windows Installer清理实用工具Q?a ><u><font color=#0000ff>http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe</font></u></a>Q官方说?a ><u><font color=#0000ff>http://support.microsoft.com/kb/290301</font></u></a>Q?/p> <p style="TEXT-INDENT: 2em">安装后在C:\Program Files\Windows Installer Clean Up下有个msicuu.exeQ运行,扑ֈTM2008Q选中它,点removeQ然后就可以重新安装TM2008了?/p> <p style="TEXT-INDENT: 2em">注:实践发现Q不一定会在列表里发现TM2008字眼Q此时可以找是否存在[1.5.535]cM于这L信息Q若有,选中点remove卛_解决?</p> <p style="TEXT-INDENT: 2em">然后重新安装TM2008Q一切正常,OK?/p> ----------------------------------------------<br>ҎQ?br>使用windows Installer  安装的程序会?C:\WINDOWS\Installer 留下痕迹Q,<br>如果哪天手痒l删了,Q估计卸载对应程序就不得行?br>到时候?windows Installer 清理工具吧,Q好像要 多remove 几次。。才能成? <img src ="http://www.shnenglu.com/daiybh/aggbug/110075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/daiybh/" target="_blank">daiybh</a> 2010-03-19 10:09 <a href="http://www.shnenglu.com/daiybh/archive/2010/03/19/110075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mfc 对话框程?启动直接隐藏http://www.shnenglu.com/daiybh/archive/2009/11/20/101457.htmldaiybhdaiybhFri, 20 Nov 2009 02:44:00 GMThttp://www.shnenglu.com/daiybh/archive/2009/11/20/101457.htmlhttp://www.shnenglu.com/daiybh/comments/101457.htmlhttp://www.shnenglu.com/daiybh/archive/2009/11/20/101457.html#Feedback0http://www.shnenglu.com/daiybh/comments/commentRss/101457.htmlhttp://www.shnenglu.com/daiybh/services/trackbacks/101457.html要想?E序启动的时候直接隐藏(或者最化到trayQ有如下办法

1  在OnInitDialog ()?br>     SetTimerQ?,100,null)
   在OnTimer(UINT nIDEvent) ?br>      if( nIDEvent==1)
      {
         ShowWindow(sw_hide);
         KillTimer(1);
      }

    ///q种Ҏ 会出?E序在显C器?闪一下的效果。。即?timer 旉很短 Q也会有?br>
2 重蝲 WM_WINDOWPOSCHANGING

在重载函数内实现Q?br>   OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
   {
       if( !m_bShowWindow)
           lpwndpos->flags &= ~SWP_SHOWWINDOW;
       CDialog::OnWindowPosChanging(lpwndpos);
 
    // TODO: Add your message handler code here
   }
   m_bShowWindow 是我的一个变量,初始gؓfalse

  // 如果 m_bShowWindow  一直ؓfalse Q那么程序就见不Ch了。?br>   所以应该给 True
   在OnInitDialog ()?br>     SetTimerQ?,1000,null)
   在OnTimer(UINT nIDEvent) ?br>      if( nIDEvent==1)
      {
          m_bShowWindow =true;
         KillTimer(1);
      }

 //使用q种Ҏ E序不会闪一下。。?

daiybh 2009-11-20 10:44 发表评论
]]>
[zt] 使用svn——项目的目录布局http://www.shnenglu.com/daiybh/archive/2009/11/03/100056.htmldaiybhdaiybhTue, 03 Nov 2009 07:39:00 GMThttp://www.shnenglu.com/daiybh/archive/2009/11/03/100056.htmlhttp://www.shnenglu.com/daiybh/comments/100056.htmlhttp://www.shnenglu.com/daiybh/archive/2009/11/03/100056.html#Feedback0http://www.shnenglu.com/daiybh/comments/commentRss/100056.htmlhttp://www.shnenglu.com/daiybh/services/trackbacks/100056.htmlhttp://www.cnitblog.com/stomic/archive/2008/03/17/41043.html
Subversion有一个很标准的目录结构,是这L?br>比如目是projQsvn地址为svn://proj/Q那么标准的svn布局?br>
svn://proj/
|
+-trunk
+-branches
+-tags
q是一个标准的布局QtrunkZ开发目录,branches为分支开发目录,tags为tag存档目录Q不允许修改Q。但是具体这几个目录应该如何使用Qsvnq没有明的规范Q更多的q是用户自己的习惯?br>
对于q几个开发目录,一般的使用Ҏ有两U。我更多的是从Y件品的角度出发Q比如freebsdQ,因ؓ互联|的开发模式是完全不一L?br>W一U方法,使用trunk作ؓ主要的开发目录?br>一般的Q我们的所有的开发都是基于trunkq行开发,当一个版?release开发告一D落Q开发、测试、文档、制作安装程序、打包等Q结束后Q代码处于冻l状态(Zؓ规定Q可以通过hook来进行管理)。此时应该基于当前冻l的代码库,打tag。当下一个版?阶段的开发Q务开始,l箋在trunkq行开发?br>此时Q如果发C上一个已发行版本QReleased VersionQ有一些bugQ或者一些很急迫的功能要求,而正在开发的版本QDeveloping VersionQ无法满x间要求,q时候就需要在上一个版本上q行修改了。应该基于发行版对应的tagQ做相应的分支(branchQ进行开发?br>例如Q刚刚发?.0Q正在开?.0Q此时要?.0的基上进行bug修正?br>按照旉的顺?br>
  1. 1.0开发完毕,代码ȝ
  2. Z已经ȝ的trunkQؓrelease1.0打tag
    此时的目录结构ؓ
    svn://proj/
                 +trunk/  (freeze)
                 +branches/
                 +tags/
                         +tag_release_1.0 (copy from trunk)
  3. 2.0开始开发,trunk此时?.0的开发版
  4. 发现1.0有bugQ需要修改,Z1.0的tag做branch
    此时的目录结构ؓ
    svn://proj/
                 +trunk/  ( dev 2.0 )
                 +branches/
                               +dev_1.0_bugfix (copy from tag/release_1.0)
                 +tags/
                         +release_1.0 (copy from trunk)
  5. ?.0 bugfix branchq行1.0 bugfix开发,在trunkq行2.0开?/li>
  6. ?.0 bugfix 完成之后Q基于dev_1.0_bugfix的branch做release{?/li>
  7. Ҏ需要选择性的把dev_1.0_bugfixq个分支merge回trunkQ什么时候进行这步操作,要根据具体情况)
q是一U很标准的开发模式,很多的公叔R是采用这U模式进行开发的。trunk永远是开发的主要目录?br>
W二U方法,在每一个release的branch中进行各自的开发,trunk只做发布使用?br>q种开发模式当中,trunk是不承担具体开发Q务的Q一个版?阶段的开发Q务在开始的时候,Ҏ已经release的版本做新的开发分支,q且Zq个分支q行开发。还是D上面的例子,q里面的时序关系是?br>
  1. 1.0开发,做dev1.0的branch
    此时的目录结?br>svn://proj/
                 +trunk/  (不担负开发Q?)
                 +branches/
                               +dev_1.0 (copy from trunk)
                 +tags/
  2. 1.0开发完成,merge dev1.0到trunk
    此时的目录结?br>svn://proj/
                 +trunk/  (merge from branch dev_1.0)
                 +branches/
                               +dev_1.0 (开发Q务结束,freeze)
                 +tags/
  3. Ҏtrunk?.0的tag
    此时的目录结?br>svn://proj/
                 +trunk/  (merge from branch dev_1.0)
                 +branches/
                               +dev_1.0 (开发Q务结束,freeze)
                 +tags/
                         +tag_release_1.0 (copy from trunk)
  4. 1.0开发,做dev2.0分支
    此时的目录结?br>svn://proj/
                 +trunk/  
                 +branches/
                               +dev_1.0 (开发Q务结束,freeze)
                               +dev_2.0 Q进?.0开发)
                 +tags/
                         +tag_release_1.0 (copy from trunk)
  5. 1.0有bugQ直接在dev1.0的分支上修复
    此时的目录结?br>svn://proj/
                 +trunk/  
                 +branches/
                               +dev_1.0 (1.0bugfix)
                               +dev_2.0 Q进?.0开发)
                 +tags/
                         +tag_release_1.0 (copy from trunk)
  6. 选择性的q行代码merge
q其实是一U分散式的开发,当各个部分相对独立一些(功能性的Q,可以开多个dev的分支进行开发,q样各h/l都不会怺影响。比如dev_2.0_search和dev_2.0_cache{。但是这样mergeh是一个很痛苦的事情?br>
q里要注意一下的Q第六步q行选择性的mergeQ是可以?.0开发结束后一hdev_1.0Qbugfix用)和dev_2.0Q新版本开发用Qmerge回trunk。或者先把dev_1.0 merge到dev_2.0Q进行测试等之后再merge回trunk?br>q两U方法各有利弊,W一U方法是可以得到一个比较纯的dev_2.0的开发分支,而第二种Ҏ则更加的保险Q因试嘛?br>
以上呢,是我说的两U开发模式了Q具体哪U好Qƈ没有定论。这里大致的说一下各自的优缺?br>W一U开发模式(trunkq行主要开发,集中式)Q?br>优点Q管理简?br>~点Q当开发的模块比较多,开发h?团队比较多的时候,很容易生冲H而媄响对方的开发。因为所有的改动都有可能触碰Ҏ的改?br>W二重开发模式(分支q行主要开发,分散式)Q?br>优点Q各自开发独立,不容易相互媄响?br>~点Q管理复杂,merge的时候很ȝQ容易死人?br>
其实Q这里ƈ没有一定之规,更多的时候是两种模式l合使用。我个h来说是采用第一U方式ؓ主,在某些情况下使用W二U方法?br>如果你还有其他的好的ҎQ那么请赐教?)


daiybh 2009-11-03 15:39 发表评论
]]>
让窗体永q显C在桌面?/title><link>http://www.shnenglu.com/daiybh/archive/2009/06/30/88885.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Tue, 30 Jun 2009 05:25:00 GMT</pubDate><guid>http://www.shnenglu.com/daiybh/archive/2009/06/30/88885.html</guid><wfw:comment>http://www.shnenglu.com/daiybh/comments/88885.html</wfw:comment><comments>http://www.shnenglu.com/daiybh/archive/2009/06/30/88885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/daiybh/comments/commentRss/88885.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/daiybh/services/trackbacks/88885.html</trackback:ping><description><![CDATA[<div><font face="Courier New, Courier, mono" size="-1"><div>HWND hDesktop = ::FindWindow(_T("Progman"),_T("Program Manager"));</div><div>::SetParent(this->m_hWnd,hDesktop);</div></font></div> <img src ="http://www.shnenglu.com/daiybh/aggbug/88885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/daiybh/" target="_blank">daiybh</a> 2009-06-30 13:25 <a href="http://www.shnenglu.com/daiybh/archive/2009/06/30/88885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt] CVSNT 用户?密码讄Ҏhttp://www.shnenglu.com/daiybh/archive/2008/10/06/63300.htmldaiybhdaiybhMon, 06 Oct 2008 03:17:00 GMThttp://www.shnenglu.com/daiybh/archive/2008/10/06/63300.htmlhttp://www.shnenglu.com/daiybh/comments/63300.htmlhttp://www.shnenglu.com/daiybh/archive/2008/10/06/63300.html#Feedback0http://www.shnenglu.com/daiybh/comments/commentRss/63300.htmlhttp://www.shnenglu.com/daiybh/services/trackbacks/63300.html

转自Q?span style="line-height: 20px; ">http://hi.baidu.com/sophiaandphilem/blog/item/b63912dff2f17e1263279851.html

Note: http://book.csdn.net/bookfiles/220/10022010453.shtml有非常好的用介l,详细全面?/p>

安装好CVSNT后,需要用命o行设|用P密码Q否则会出现cMI/O错误的问题:
假设装在?: C:/Program Files/CVS ?在命令行中[cmd]中,q入q个文g夹,q行命oQ?br style="line-height: normal; ">cvs -d C:\cvsfile passwd -a giles ,
next step ,input the password for user-giles ,restart the cvs serve ,you can use it now ...
Generally , you need to make user write the repository , so open the control panel---->Advanced -> unselect the All users are read item ...
Then , It is ok for you to enjoy it .. -----------------
---------------
compatibility options 
CvsNT clients 选中前三就好,不选的话,兼容性差点,当然不会影响自己使用?/font>

cvs -d C:\cvsfile passwd -r administrator -a giles ,   q样giles用户有了理员权限。?/font>

最好把cvs的储存库攑֜C盘,不然会发生各L诡异错误?/font>

2. CVS Control Panel 里的 Server Settings 也需要设|, 不然有可能出?no such domain的提C?/font>

3. 支持字符集的问题Q?在徏好服务器后,右键点击Q在属性里面可以修改字W集?/p>

4. 如果本地能连上CVSQ但是局域网内另外的用户q接不上Q那很可能是windows 防火墙的问题 ?/p>

      我们需要在防火墙的例外里面d CVs.exe ?默认?2401端口 。?/p>

好的使用习惯Q?/font>

1. One day ,One Commit   .

2. Update before modifying the code.

3. Update before committing the code, or else you may encounter some conflicts.

Update 的时候,会把server中的代码和本地的代码q行merge Q而不是简单的覆盖本地代码?/p>

如果commit之前不进行updateQ则׃CVS不允许在commit的时候自动进行mergeQ极有可能生冲H?/p>

一般用update和commit可以了?/p>

daiybh 2008-10-06 11:17 发表评论
]]>
[zt]使用StretchBlt之前一定要用SetStretchBltMode(COLORONCOLOR)啊!Q! http://www.shnenglu.com/daiybh/archive/2008/09/28/62986.htmldaiybhdaiybhSun, 28 Sep 2008 06:02:00 GMThttp://www.shnenglu.com/daiybh/archive/2008/09/28/62986.htmlhttp://www.shnenglu.com/daiybh/comments/62986.htmlhttp://www.shnenglu.com/daiybh/archive/2008/09/28/62986.html#Feedback0http://www.shnenglu.com/daiybh/comments/commentRss/62986.htmlhttp://www.shnenglu.com/daiybh/services/trackbacks/62986.htmlq日使用StretchDIBits 发生事故 情况与{?一栗特此标记?/div>
转帖地址  http://blog.vckbase.com/longest/archive/2006/11/21/23194.html


daiybh 2008-09-28 14:02 发表评论
]]>
apache2.2 + php5.2.5 启动p|http://www.shnenglu.com/daiybh/archive/2008/08/09/58370.htmldaiybhdaiybhSat, 09 Aug 2008 03:41:00 GMThttp://www.shnenglu.com/daiybh/archive/2008/08/09/58370.htmlhttp://www.shnenglu.com/daiybh/comments/58370.htmlhttp://www.shnenglu.com/daiybh/archive/2008/08/09/58370.html#Feedback2http://www.shnenglu.com/daiybh/comments/commentRss/58370.htmlhttp://www.shnenglu.com/daiybh/services/trackbacks/58370.htmlapache2.2  + php5.2.5 
启动apache 时失?报错误:

---------------------------
httpd.exe - 应用E序错误
---------------------------
"0x01171a76" 指o引用?"0x020c0161" 内存。该内存不能?"read"?

 


要终止程序,请单?#8220;定”?br>要调试程序,请单?#8220;取消”?br>---------------------------
定   取消  
---------------------------



p|原因Q?br>1 php extension中用了 php_exif.dllq个扩展Q屏蔽之 可以正常启动Q?br>2 l查原因 php_exif.dll依赖php_mbstring.dll 卌没用php_mbstring.dllq个扩展也会报错?br>3 如果扩展中有php_mbstring.dll 也会报错Q?Q?不得哦,那不是真的?br>4 ? 中的那个假设 是存在的。是因ؓphp_exif.dll 在php_mbstring.dll之前初始?当然会错拉。。?br>5 所以需要让php_mbstring.dll先初始化。。改php.ini(php的配|文? 如下
[PHP_MBSTRING]
extension=php_mbstring.dll
[PHP_EXIF]
extension=php_exif.dll
把php_mbstring.dllҎ到php_exif.dll之前。?br> -----------------------------------------------------------
over?br>

 



daiybh 2008-08-09 11:41 发表评论
]]>
vc2008 中局部代码折?/title><link>http://www.shnenglu.com/daiybh/archive/2008/08/08/58340.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Fri, 08 Aug 2008 06:45:00 GMT</pubDate><guid>http://www.shnenglu.com/daiybh/archive/2008/08/08/58340.html</guid><wfw:comment>http://www.shnenglu.com/daiybh/comments/58340.html</wfw:comment><comments>http://www.shnenglu.com/daiybh/archive/2008/08/08/58340.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/daiybh/comments/commentRss/58340.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/daiybh/services/trackbacks/58340.html</trackback:ping><description><![CDATA[    使用中发?vc2008 team System 中代码折叠只到函敎ͼ不具体到语句块的折叠。。?br>    先前使用vc2008 Express Edition 的时候还有该功能Q难道teamqq掉了?br>    郁闷了半天,咱就是奔q个功能来的呀。。?img src="http://www.shnenglu.com/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absmiddle" border="0"><br>    后来在设|项里面发现了秘密。。原来team l藏hQ一般h不给用?br>   具体讄方式Q?br>   工具(tools) -> 选项(Options) -> 文本~辑?Text Editor) -> C/C++ -> 格式讄(Formatting) -> 语句块的自动大纲昄(Automatic outlining of statement blocks)<br><hr style="width: 100%; height: 2px;">over.<br><img src ="http://www.shnenglu.com/daiybh/aggbug/58340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/daiybh/" target="_blank">daiybh</a> 2008-08-08 14:45 <a href="http://www.shnenglu.com/daiybh/archive/2008/08/08/58340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转一个log4cxx的教E?出处不明http://www.shnenglu.com/daiybh/archive/2008/01/25/41875.htmldaiybhdaiybhFri, 25 Jan 2008 03:31:00 GMThttp://www.shnenglu.com/daiybh/archive/2008/01/25/41875.htmlhttp://www.shnenglu.com/daiybh/comments/41875.htmlhttp://www.shnenglu.com/daiybh/archive/2008/01/25/41875.html#Feedback0http://www.shnenglu.com/daiybh/comments/commentRss/41875.htmlhttp://www.shnenglu.com/daiybh/services/trackbacks/41875.html
l盟U技
2003 q?9 ?

log4cpp是个ZLGPL的开源项目,是基于优U的日志处理跟t项目Java语言的log4jULq来的。log4j介绍的文档很多,在java领域使用的也比较q泛Q而这个功能强大的库对国内的C++语言开发h员却使用的不多。这里从开发h员用的角度介绍q个库,使开发h员用最的代h快掌握q种技术。下面先单介l一下这个项目的优点Q也是log4j的优点)Q然后分原理Q手动用步骤,配置文g驱动方式使用步骤Q其他考虑{方面进行讨论。以下讨论基于log4cpp0.3.4b?/p>

0. 优点

提供应用E序q行上下文,方便跟踪调试Q?br/>可扩展的、多U方式记录日志,包括命o行、文件、回h件、内存、syslog服务器、Win事g日志{;
可以动态控制日志记录别,在效率和功能中进行调_
所有配|可以通过配置文gq行动态调_
多语a支持Q包括JavaQlog4jQ,C++Qlog4cpp、log4cplusQ,CQlog4cQ,pythonQlog4pQ等Q?br/>...

1. 原理

log4cpp?个主要的lgQcategoriesQ类别)、appendersQ附加目的地Q、和 layoutsQ布局Q。(Z方便大家理解Q文中尽量用英文原词)

layoutcL制输出日志消息的昄样式Q看h像什么)。log4cpp当前提供以下layout格式Q?/p>

log4cpp::BasicLayout     // ?旉?优先U(priorityQ下文介l)
                        // cdQcategoryQ下文介l)
     // NDC标签Qnested diagnostic contexts 下文介绍Q? 日志信息"?              // 如:1056638652 INFO main : This is some info
log4cpp::PatternLayout  // 让用h据类g C 语言 printf 函数的{换模式来指定输出格式。格式定义见代码附带文档?log4cpp::SimpleLayout  // ?优先U(priorityQ?- 日志信息"格式昄?

appendercȝ来输出日志(被layout格式化后的)C些设备上。比如文件、syslog服务、某个socket{。可以定义自q appenderc输出日志信息到别的讑֤上,比如应用自n的日子处理进E、数据库{。appender和layout的关pLlayout附在 appender上,appenderc调用layout处理完日志消息后Q记录到某个讑֤上。log4cpp当前提供以下appenderQ?/p>

log4cpp::IdsaAppender    // 发送到IDS或者logger, 详细?http://jade.cs.uct.ac.za/idsa/
log4cpp::FileAppender    // 输出到文?log4cpp::RollingFileAppender  // 输出到回hӞ卛_文g到达某个大小后回?log4cpp::OstreamAppender   // 输出C个ostreamc?log4cpp::RemoteSyslogAppender  // 输出到远Esyslog服务?log4cpp::StringQueueAppender  // 内存队列
log4cpp::SyslogAppender   // 本地syslog
log4cpp::Win32DebugAppender  // 发送到~省pȝ调试?log4cpp::NTEventLogAppender  // 发送到win 事g日志

category cȝ正完成记录日志功能,两个主要l成部分是appenders和priorityQ优先Q。优先控制哪类日志信息可以被这个category记录Q当前优先分ؓQNOTSET, DEBUG, INFO, NOTICE, WARN, ERROR, CRIT, ALERT ?FATAL/EMERG 。每个日志信息有个优先Q每个category有个优先U,当消息的优先U大于等于category的优先Ӟq个消息才会被category记录Q否则被忽略。优先的关pd下。categorycdappender的关pLQ多个appender附在category上,q样一个日志消息可以同时输出到多个讑֤上?/p>

NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG

category被组l成一个树Q子category创徏时优先~省NOTSETQcategory~省会承父category?appender。而如果不希望q种appender的承关p,log4cpp允许使用additivity 标签Qؓfalse时新的appender取代category的appender列表?/p>

Z更好的理解上面的概念下面以手动用方式D例?/p>

2. 手动使用步骤

手动使用log4cpp的基本步骤如下:

  1. 实例化一个layout 对象Q?/li>
  2. 初始化一个appender 对象Q?/li>
  3. 把layout对象附着在appender对象上;
  4. 调用log4cpp::Category::getInstance("name"). 实例化一个category对象Q?/li>
  5. 把appender对象附到category上(Ҏadditivity的值取代其他appender或者附加在其他appender后)?/li>
  6. 讄category的优先Q?/li>

// FileName: test_log4cpp1.cpp
// Test log4cpp by manual operation.
// Announce: use as your own risk.
// Compile : g++ -otest1 -llog4cpp test_log4cpp1.cpp
// Run     : ./test1
// Tested  : RedHat 7.2 log4cpp0.3.4b
// Author  : liqun (liqun@nsfocus.com)
// Data    : 2003-6-27

#include "log4cpp/Category.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/BasicLayout.hh"

int main(int argc, char* argv[])
{
        // 1实例化一个layout 对象
        log4cpp::Layout* layout = 
        new log4cpp::BasicLayout();

        // 2. 初始化一个appender 对象
 log4cpp::Appender* appender = new 
              log4cpp::FileAppender("FileAppender",
              "./test_log4cpp1.log");


 // 3. 把layout对象附着在appender对象? appender->setLayout(layout);

 // 4. 实例化一个category对象
 log4cpp::Category& warn_log = 
        log4cpp::Category::getInstance("mywarn");

 // 5. 讄additivity为falseQ替换已有的appender
        warn_log.setAdditivity(false);

 // 5. 把appender对象附到category? warn_log.setAppender(appender);

 // 6. 讄category的优先Q低于此优先U的日志不被记录
 warn_log.setPriority(log4cpp::Priority::WARN);

 // 记录一些日? warn_log.info("Program info which cannot be wirten");
 warn_log.debug("This debug message will fail to write");
 warn_log.alert("Alert info");

 // 其他记录日志方式
 warn_log.log(log4cpp::Priority::WARN, "This will be a logged warning");
 log4cpp::Priority::PriorityLevel priority;
 bool this_is_critical = true;
 if(this_is_critical)
  priority = log4cpp::Priority::CRIT;
 else
  priority = log4cpp::Priority::DEBUG;
 warn_log.log(priority,"Importance depends on context");
 
 warn_log.critStream() << "This will show up << as " 
 << 1 << " critical message" 
 << log4cpp::CategoryStream::ENDLINE;

 // clean up and flush all appenders
 log4cpp::Category::shutdown();
 return 0;
}

3. 配置文g驱动方式使用步骤

另一个非怼U的特征就是通过d配置文gQ确定category、appender、layout{对象。也是我们非常推荐的使用方式Q可以灵zd通过配置文g定义所有地对象及其属性,不用重新~码Q动态更Ҏ志记录的{略?/p>

Log4cpp主要提供?log4cpp::PropertyConfigurator 和log4cpp::SimpleConfigurator两种机制Q文件格式)Q但 log4cpp::SimpleConfigurator来不再支持了,而且格式非常单,q里׃多说明,自己看源码吧?/p>

配置文g的格式和log4j的配|文件一P是标准的java属性文件格式。下面是附带的例子配|文Ӟ


# a simple test config
#定义?个category sub1, sub2, sub1.sub2
log4j.rootCategory=DEBUG, rootAppender
log4j.category.sub1=,A1
log4j.category.sub2=INFO
log4j.category.sub1.sub2=ERROR, A2

# 讄sub1.sub2 的additivity属?log4j.additivity.sub1.sub2=false

#定义rootAppendercd和layout属?log4j.appender.rootAppender=org.apache.log4j.ConsoleAppender
log4j.appender.rootAppender.layout=org.apache.log4j.BasicLayout

#定义A1的属?log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.fileName=A1.log
log4j.appender.A1.layout=org.apache.log4j.SimpleLayout

#定义A2的属?log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=The message '%m' at time %d%n 

配置文g语法如下Q不是很规范Q结合上面的例子Q应该可以看懂?/p>

  log4j / log4cpp . [category / appender].[category or appender 's name].[category or appender 's property] 
= [Appender / Layout / property's value / Priority, appender name1 [appender name2 ...]]

 [appender]
  {ConsoleAppender}
  {FileAppender} // 当appender的类型是FileAppenderӞ可以定义它下面的属性?   [fileName] string foobar // 格式是:属性名 值的cd ~省?   [append] bool true
  {RollingFileAppender}
   [fileName]  string foobar
   [maxFileSize] num 10*1024*1024
   [maxBackupIndex] num 1
   [append] bool true
  {SyslogAppender}
   [syslogName] string syslog
   [syslogHost] string localhost
   [facility] num -1 // * 8 to get LOG_KERN, etc. compatible values. 
   [portNumber] num -1
  {IdsaAppender}
   [idsaName] string foobar
  {Win32DebugAppender}
  {NTEventLogAppender}
   [source] string foobar
   
   [threshold] string "" // 全部 
   // 如果此类型appender需要layoutQ必d义此appender的下面属?   [layout]
    {BasicLayout} 
    {SimpleLayout}
    {PatternLayout}  // 当layout的值是BasicLayoutӞ需要定义下面的属性?     [ConversionPattern]
     
 [rootCategory]
 [additivity]
  [category name] bool true
  

基本使用步骤是:

  1. d解析配置文gQ?/li>
  2. 实例化category对象Q?/li>
  3. 正常使用q些category对象q行日志处理Q?/li>

下面是个单的使用代码Q用v来是非常方便的:


// FileName: test_log4cpp2.cpp
// Test log4cpp by config file.
// Announce: use as your own risk.
// Compile : g++ -llog4cpp test_log4cpp2.cpp
// Run     : ./a.out
// Tested  : RedHat 7.2 log4cpp0.3.4b
// Author  : liqun (liqun@nsfocus.com)
// Data    : 2003-6-27

#include "log4cpp/Category.hh"
#include "log4cpp/PropertyConfigurator.hh"

int main(int argc, char* argv[])
{
 // 1 d解析配置文g
 // d出错, 完全可以忽略Q可以定义一个缺省策略或者用系l缺省策? // BasicLayout输出所有优先日志到ConsoleAppender
    try { 
  log4cpp::PropertyConfigurator::configure("./log4cpp.conf");
 } catch(log4cpp::ConfigureFailure& f) {
  std::cout << "Configure Problem " << f.what() << std::endl;
        return -1;
    }
 
 // 2 实例化category对象
 // q些对象即配置文g没有定义也可以用,不过其属性承其父category
 // 通常使用引用可能不太方便Q可以用指针,以后做指针? // log4cpp::Category* root = &log4cpp::Category::getRoot();
    log4cpp::Category& root = log4cpp::Category::getRoot();
 
    log4cpp::Category& sub1 = 
        log4cpp::Category::getInstance(std::string("sub1"));

    log4cpp::Category& sub3 = 
        log4cpp::Category::getInstance(std::string("sub1.sub2"));

 // 3 正常使用q些category对象q行日志处理? // sub1 has appender A1 and rootappender.
 sub1.info("This is some info");
 sub1.alert("A warning");
 
 // sub3 only have A2 appender.
 sub3.debug("This debug message will fail to write");
 sub3.alert("All hands abandon ship");
 sub3.critStream() << "This will show up << as " << 1 << " critical message" 
 << log4cpp::CategoryStream::ENDLINE;
 sub3 << log4cpp::Priority::ERROR 
              << "And this will be an error"  
              << log4cpp::CategoryStream::ENDLINE;
 sub3.log(log4cpp::Priority::WARN, "This will be a logged warning");
 
 return 0;
}

4. 相关考虑

性能问题Q可能是很多想用log4cpp的程序员兛_的问题。在参考资?中有一D|q。结论就是log4j以及log4cpp是以性能为首要目标的Q如果关闭日志记录的话,Ҏ能影响可以忽略Q打开日志记录Q主要消耗是在记录动作,而不是库的管理过E;所以你可攑ֿ的用。实在要q性能的话。可以从下面斚w提高Q?/p>

输出的日志消息不要用复杂的转换或者处理,比如Q?sub1.debug(string("Current num is") + i + GetCurStat()); q种情况即不进行日志处理,括号中的语句q是会执行。变通方法是Q?/p>

if(sub1.isDebugEnabled())
{
 sub1.debug(string("Current num is") + i + GetCurStat());
}

安全性问题对于商业Y件开发可能也是问题。可能不希望别h通过修改配置文g获取E序的调试等E序内部q行情况的日志信息。比较稳妥的Ҏ或者是加密配置文gQ运行中解密Q输出到临时文g后读取;或者在发行版本里读取配|文件后Q强行把低于某个优先U的category讑ֈ比较高的优先U?/p>

多线E安全性问题。当前log4cppq没有宣U自己是多线E安全的Q不q其代码中大多数可能冲突的地斚w增加了线E互斥控Ӟ对多U程环境应该问题不大。但Z加入q个Ҏ,linux下编译log4cppӞconfigure请加?-with-pthreads 或?-with-omnithreads选项。Win版本已经加入对MSU程的支持?/p>

5. 参考资?/span>

1. Logging and Tracing in C++ Simplified: Traveling the Road Last Traveled by a Previously Invented Wheel
http://soldc.sun.com/articles/logging.html

2. log4j 提供了对日志记录的控?br/>http://www-900.ibm.com/developerWorks/cn/java/jw-log4j/index.shtml

3. 使用Log4jq行日志操作
http://www-900.ibm.com/developerWorks/cn/java/l-log4j/index.shtml

4. log4cpp主页
http://sourceforge.net/projects/log4cpp/

5. log4j主页
http://jakarta.apache.org/log4j/docs/index.html

6. log4cplus主页
http://log4cplus.sourceforge.net/

7. log4c主页
http://log4c.sourceforge.net/

6. 关于作?/span>

李群Q关注于|络安全产品的开发、研IӞ软g开发过E等斚w。您可以通过liqun@nsfocus.com和他联系?/p>

daiybh 2008-01-25 11:31 发表评论
]]>
记昨?/title><link>http://www.shnenglu.com/daiybh/archive/2008/01/17/41310.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Thu, 17 Jan 2008 01:01:00 GMT</pubDate><guid>http://www.shnenglu.com/daiybh/archive/2008/01/17/41310.html</guid><wfw:comment>http://www.shnenglu.com/daiybh/comments/41310.html</wfw:comment><comments>http://www.shnenglu.com/daiybh/archive/2008/01/17/41310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/daiybh/comments/commentRss/41310.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/daiybh/services/trackbacks/41310.html</trackback:ping><description><![CDATA[ <p>昨天早早的v?l自q俩鸡?z漱完毕发现锅盖Q玻璃盖Q面附着一丝丝的蛋花,盛世好看。查之,一蛋已破壳。稀里哗?往嘴里塞之Q留一完蛋在\上找一桥吃之,弃壳于n后,溜之?br/><br/>晚上查阅邮g 发现鹰派发了祝的信,时热泪盈眶Q痛哭流涕?br/>---------------<br/>记完毕?img src="http://imgcache.qq.com/qzone_v4/b.gif" style="DISPLAY: none; POSITION: relative" name="paperPicArea1" height="1" width="1" id="paperPicArea1"/></p> <img src ="http://www.shnenglu.com/daiybh/aggbug/41310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/daiybh/" target="_blank">daiybh</a> 2008-01-17 09:01 <a href="http://www.shnenglu.com/daiybh/archive/2008/01/17/41310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.hhh328.cn" target="_blank">޹þ</a>| <a href="http://www.nuzc.cn" target="_blank">˾þþƷһ</a>| <a href="http://www.pareng.cn" target="_blank">þþþþþþþþ</a>| <a href="http://www.1314jkw.cn" target="_blank">þþƷ</a>| <a href="http://www.51d1.cn" target="_blank">޾Ʒþþþ66</a>| <a href="http://www.8xbu.cn" target="_blank">þۺϾþۺϾɫ</a>| <a href="http://www.onlymir.cn" target="_blank">ŷ龫Ʒþþþþ</a>| <a href="http://www.linkyes.cn" target="_blank">þùۺϾƷ</a>| <a href="http://www.pass3d.cn" target="_blank">Ʒþþþþ˳ </a>| <a href="http://www.x247.cn" target="_blank">þþþ?V</a>| <a href="http://www.omwang.cn" target="_blank">þˬˬƬAV</a>| <a href="http://www.xiaomaidou.cn" target="_blank">þþþþþþþþþƷ </a>| <a href="http://www.ffcchh.com.cn" target="_blank">97þþƷˬ</a>| <a href="http://www.xishuixian.com.cn" target="_blank">һɫۺϾþ</a>| <a href="http://www.ceovod.cn" target="_blank">˶ݺɫۺϾþ</a>| <a href="http://www.3158unp.cn" target="_blank">ۺ˾þۺ</a>| <a href="http://www.a3314.cn" target="_blank">þĻƷһ</a>| <a href="http://www.pydjango.cn" target="_blank">ŷ޷avþò</a>| <a href="http://www.everspringgroup.cn" target="_blank">þþþùƵӰ</a>| <a href="http://www.tvjay.cn" target="_blank">999þþѹƷ</a>| <a href="http://www.zfam.cn" target="_blank">ɫۺϾþþþһ</a>| <a href="http://www.buniss.cn" target="_blank">þþþ99ƷƬëƬ </a>| <a href="http://www.nicemom.cn" target="_blank">þþƷ</a>| <a href="http://www.kmkiddieedu.cn" target="_blank">þþþav </a>| <a href="http://www.xuanhaoma.com.cn" target="_blank">þþɫۺϾɫ99</a>| <a href="http://www.macsales.cn" target="_blank">Avþ</a>| <a href="http://www.xinjian452858.cn" target="_blank">ٸŮþۺɫ</a>| <a href="http://www.ccjump.cn" target="_blank">þþƷ޾Ʒŷ</a>| <a href="http://www.montblanc-fola.cn" target="_blank">þùƷ99Ʒ987</a>| <a href="http://www.jihejingjia.cn" target="_blank">һþaþþƷ</a>| <a href="http://www.indmc.cn" target="_blank">þþþAVվ </a>| <a href="http://www.bev5l.cn" target="_blank">ŷսպ91ۺһþþ </a>| <a href="http://www.gfba.cn" target="_blank">ƷþþþþþþӰԺ</a>| <a href="http://www.ncysjz.cn" target="_blank">þûɫƵ</a>| <a href="http://www.impark.cn" target="_blank">պʮ˽һþ</a>| <a href="http://www.sun-q.cn" target="_blank">˺ݺۺϾþ޸</a>| <a href="http://www.whoimi.cn" target="_blank">þþžžþƷ</a>| <a href="http://www.gzxwlt.cn" target="_blank">ҹ91þø</a>| <a href="http://www.hedv.com.cn" target="_blank">þҹɫƷa</a>| <a href="http://www.k7yg835v.cn" target="_blank">þþƷһ</a>| <a href="http://www.taiguolu.com.cn" target="_blank">þۺϸۺϾþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>