﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-&lt;font color="#ff8000"&gt;&amp;nbsp&amp;nbsp&amp;nbspC++&amp;nbsp技术中心&lt;/font&gt;-随笔分类-三方库</title><link>http://www.cppblog.com/api/category/16433.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 23 Mar 2016 17:13:04 GMT</lastBuildDate><pubDate>Wed, 23 Mar 2016 17:13:04 GMT</pubDate><ttl>60</ttl><item><title>memcached安装</title><link>http://www.cppblog.com/API/archive/2012/08/03/186120.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 03 Aug 2012 01:03:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2012/08/03/186120.html</guid><wfw:comment>http://www.cppblog.com/API/comments/186120.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2012/08/03/186120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/186120.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/186120.html</trackback:ping><description><![CDATA[1. 在终端（也即cmd命令界面）下输入 'c:\<strong>memcached</strong>\<strong>memcached</strong>.exe -d install' 安装<br />2. 再输入： 'c:\<strong>memcached</strong>\<strong>memcached</strong>.exe -d start' 启动<br />NOTE: 以后<strong>memcached</strong>将作为windows的一个服务每次开机时自动启动。默认端口：11211 <br /><br /><br />memcached的基本设置：<br /><br /><br />
<div class="code">-p 监听的端口<br />-l 连接的IP地址, 默认是本机<br />-d start 启动memcached服务<br />-d restart 重起memcached服务<br />-d stop|shutdown 关闭正在运行的memcached服务<br />-d install 安装memcached服务<br />-d uninstall 卸载memcached服务<br />-u 以的身份运行 (仅在以root运行的时候有效)<br />-m 最大内存使用，单位MB。默认64MB<br />-M 内存耗尽时返回错误，而不是删除项<br />-c 最大同时连接数，默认是1024<br />-f 块大小增长因子，默认是1.25<br />-n 最小分配空间，key+value+flags默认是48<br />-h 显示帮助</div>mixi的设置,单台:<br /><br />[/code]<br />每台memcached服务器仅启动一个memcached进程。分配给memcached的内存为3GB，启动参数如下：<br /><br /><br />
<div class="code">/usr/bin/memcached -p 11211 -u nobody -m 3000 -c 30720</div>由于使用了x86_64的操作系统，因此能分配2GB以上的内存。32位操作系统中，每个进程最多只能使用2GB内存。也曾经考虑过启动多个分配2GB以下内存的进程，但这样一台服务器上的TCP连接数就会成倍增加，管理上也变得复杂，所以mixi就统一使用了64位操作系统。<br /><br />另外，虽然服务器的内存为4GB，却仅分配了3GB，是因为内存分配量超过这个值，就有可能导致内存交换(swap)。连载的第2次中前坂讲解过了memcached的内存存储&#8220;slab allocator&#8221;，当时说过，memcached启动时指定的内存分配量是memcached用于保存数据的量，没有包括&#8220;slab allocator&#8221;本身占用的内存、以及为了保存数据而设置的管理空间。因此，memcached进程的实际内存分配量要比指定的容量要大，这一点应当注意。<br /><br />mixi保存在memcached中的数据大部分都比较小。这样，进程的大小要比指定的容量大很多。因此，我们反复改变内存分配量进行验证，确认了3GB的大小不会引发swap，这就是现在应用的数值。<br /><br /><br /><br />
<div class="code">memcached -d -m 1024 -u root -l 172.25.38.70 -p 12000 -c 4096 -P /tmp/memcached.pid 12000<br />-p 12000 端口<br />-m 1024 内存设置 1024<br />-c 4096 同时连接数</div><img src ="http://www.cppblog.com/API/aggbug/186120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2012-08-03 09:03 <a href="http://www.cppblog.com/API/archive/2012/08/03/186120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4cplus库（四）(优先级与日志配置) </title><link>http://www.cppblog.com/API/archive/2011/04/02/143283.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sat, 02 Apr 2011 08:00:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/04/02/143283.html</guid><wfw:comment>http://www.cppblog.com/API/comments/143283.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/04/02/143283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/143283.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/143283.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一. 优先级控制在研究LogLevelManager之前，首先介绍一下log4cplus中logger的存储机制，在log4cplus中，所有logger都通过一个层次化的结构（其实内部是hash表）来组织的，有一个Root级别的logger,可以通过以下方法获取：Logger root = Logger::getRoot();用户定义的logger都有一个名字与之对应，比如：Logger t...&nbsp;&nbsp;<a href='http://www.cppblog.com/API/archive/2011/04/02/143283.html'>阅读全文</a><img src ="http://www.cppblog.com/API/aggbug/143283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-04-02 16:00 <a href="http://www.cppblog.com/API/archive/2011/04/02/143283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4cplus库（三）(将日志写入到文件) </title><link>http://www.cppblog.com/API/archive/2011/04/02/143281.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sat, 02 Apr 2011 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/04/02/143281.html</guid><wfw:comment>http://www.cppblog.com/API/comments/143281.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/04/02/143281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/143281.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/143281.html</trackback:ping><description><![CDATA[<p>一.如何将日志写入到文件<br>将log信息记录到文件应该说是日志系统的一个基本功能，log4cplus在此基础上，提供了更多的功能，<br>可以按照你预先设定的大小来决定是否转储，当超过该大小，后续log信息会另存到新文件中，<br>依次类推；或者按照日期来决定是否转储。log4cplus提供了三个类用于文件操作,它们是:<br>FileAppender类、RollingFileAppender类、DailyRollingFileAppender类<br><br>二.FileAppender类<br>实现了基本的文件操作功能，构造函数如下：<br>FileAppender(const log4cplus::tstring&amp; filename,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG4CPLUS_OPEN_MODE_TYPE mode = LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool immediateFlush = true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; filename: 文件名<br>&nbsp;&nbsp; mode :&nbsp;&nbsp;&nbsp; 文件类型，可选择的文件类型包括app、ate、binary、in、out、trunc，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;因为实际上只是对stl的一个简单包装，缺省是trunc，表示将先前文件删除。<br>&nbsp;&nbsp; immediateFlush ：缓冲刷新标志，如果为true表示每向文件写一条记录就刷新一次缓存，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 否则直到FileAppender被关闭或文件缓存已满才更新文件，一般是要设置true的，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如你往文件写的过程中出现了错误（如程序非正常退出），即使文件没有正常关闭也可以保证程序终<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 止时刻之前的所有记录都会被正常保存。<br><br>三. RollingFileAppender类<br>构造函数如下：<br>log4cplus::RollingFileAppender::RollingFileAppender(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const log4cplus::tstring&amp; filename,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long maxFileSize,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int maxBackupIndex,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool immediateFlush)<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 文件名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxFileSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;: 文件的最大尺寸<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxBackupIndex : 最大记录文件数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; immediateFlush&nbsp;&nbsp;&nbsp; : 缓冲刷新标志&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>RollingFileAppender类可以根据你预先设定的大小来决定是否转储，当超过该大小，后续log信息会另存到新文件中，<br>除了定义每个记录文件的大小之外，你还要确定在RollingFileAppender类对象构造时最多需要多少个这样的记录文件<br>(maxBackupIndex+1)，当存储的文件数目超过maxBackupIndex+1时，会删除最早生成的文件，保证整个文件数目等于<br>maxBackupIndex+1。然后继续记录，比如以下代码片段：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;</span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;LOOP_COUNT&nbsp;200000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;SharedAppenderPtr&nbsp;_append(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;RollingFileAppender(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Test.log</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">file&nbsp;test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setLayout(&nbsp;std::auto_ptr(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TTCCLayout())&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;Logger::getRoot().addAppender(_append);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;Logger&nbsp;root&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getRoot();&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;Logger&nbsp;test&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;Logger&nbsp;subTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.subtest</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_448_581_Open_Image onclick="this.style.display='none'; Codehighlighter1_448_581_Open_Text.style.display='none'; Codehighlighter1_448_581_Closed_Image.style.display='inline'; Codehighlighter1_448_581_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_448_581_Closed_Image onclick="this.style.display='none'; Codehighlighter1_448_581_Closed_Text.style.display='none'; Codehighlighter1_448_581_Open_Image.style.display='inline'; Codehighlighter1_448_581_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_448_581_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_448_581_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NDCContextCreator&nbsp;_context(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">loop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG4CPLUS_DEBUG(subTest,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Entering&nbsp;loop&nbsp;#</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;i)&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;运行结果：运行后会产生6个输出文件，Test.log、Test.log.1、Test.log.2、Test.log.3、Test.log.4、Test.log.5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;其中Test.log存放着最新写入的信息，而最后一个文件中并不包含第一个写入信息，说明已经被不断更新了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要指出的是，这里除了Test.log之外，每个文件的大小都是200K,而不是我们想像中的5K，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是因为log4cplus中隐含定义了文件的最小尺寸是200K，只有大于200K的设置才生效，&lt;= 200k的设置都会被认为是200K.<br><br>四. DailyRollingFileAppender类<br>构造函数如下：<br>&nbsp;DailyRollingFileAppender::DailyRollingFileAppender(const log4cplus::tstring&amp; filename,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DailyRollingFileSchedule schedule,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool immediateFlush,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int maxBackupIndex)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 文件名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; schedule&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 存储频度<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; immediateFlush : 缓冲刷新标志<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxBackupIndex : 最大记录文件数</p>
<p>DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储，当超过该频度，<br>后续log信息会另存到新文件中，这里的频度包括：<br>MONTHLY（每月）、WEEKLY（每周）、DAILY（每日）、TWICE_DAILY（每两天）、HOURLY（每时）、MINUTELY（每分）。<br>maxBackupIndex的含义同上所述，比如以下代码片段：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;SharedAppenderPtr&nbsp;_append(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DailyRollingFileAppender(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Test.log</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MINUTELY,&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">file&nbsp;test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setLayout(&nbsp;std::auto_ptr(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TTCCLayout())&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;Logger::getRoot().addAppender(_append);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;Logger&nbsp;root&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getRoot();&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;Logger&nbsp;test&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;Logger&nbsp;subTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.subtest</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_425_541_Open_Image onclick="this.style.display='none'; Codehighlighter1_425_541_Open_Text.style.display='none'; Codehighlighter1_425_541_Closed_Image.style.display='inline'; Codehighlighter1_425_541_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_425_541_Closed_Image onclick="this.style.display='none'; Codehighlighter1_425_541_Closed_Text.style.display='none'; Codehighlighter1_425_541_Open_Image.style.display='inline'; Codehighlighter1_425_541_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_425_541_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_425_541_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NDCContextCreator&nbsp;_context(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">loop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG4CPLUS_DEBUG(subTest,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Entering&nbsp;loop&nbsp;#</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;i)&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"></span></div>
<p>&nbsp; 运行结果：运行后会以分钟为单位，分别生成名为<br>&nbsp; Test.log.2004-10-17-03-03、Test.log.2004-10-17-03-04和Test.log.2004-10-17-03-05这样的文件。<br>&nbsp; 需要指出的是，刚看到按照频度（如HOURLY、MINUTELY）转储这样的概念，以为log4cplus提供了内部定<br>&nbsp; 时器，感觉很奇怪，因为日志系统不应该主动记录，而loging事件总是应该被动触发的啊。仔细看了源<br>&nbsp; 代码后才知道这里的"频度"并不是你写入文件的速度，其实是否转储的标准并不依赖你写入文件的速度，<br>&nbsp; 而是依赖于写入的那一时刻是否满足了频度条件，即是否超过了以分钟、小时、周、月为单位的时间刻度，<br>&nbsp; 如果超过了就另存。本部分详细介绍log信息的几种文件操作方式，下面将重点介绍一下如何有选择地控<br>&nbsp; 制log信息的输出。<br>&nbsp; <br>&nbsp; <br></p>
<img src ="http://www.cppblog.com/API/aggbug/143281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-04-02 15:50 <a href="http://www.cppblog.com/API/archive/2011/04/02/143281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4cplus库（二）(通过布局器Layouts) </title><link>http://www.cppblog.com/API/archive/2011/04/02/143280.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sat, 02 Apr 2011 07:43:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/04/02/143280.html</guid><wfw:comment>http://www.cppblog.com/API/comments/143280.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/04/02/143280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/143280.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/143280.html</trackback:ping><description><![CDATA[一.各种布局器<br>log4cplus通过布局器（Layouts）来控制输出的格式，log4cplus提供了三种类型的Layouts分别是：<br>SimpleLayout、PatternLayout、和TTCCLayout。<br><br>二.SimpleLayout<br>是一种简单格式的布局器，在输出的原始信息之前加上LogLevel和一个"-"。<br>比如以下代码片段：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;step&nbsp;1:&nbsp;Instantiate&nbsp;an&nbsp;appender&nbsp;object</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;SharedObjectPtr&nbsp;_append&nbsp;(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ConsoleAppender());&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">append&nbsp;for&nbsp;test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;2:&nbsp;Instantiate&nbsp;a&nbsp;layout&nbsp;object&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;std::auto_ptr&nbsp;&nbsp;_layout(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;log4cplus::SimpleLayout());&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;3:&nbsp;Attach&nbsp;the&nbsp;layout&nbsp;object&nbsp;to&nbsp;the&nbsp;appender&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setLayout(&nbsp;_layout&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;4:&nbsp;Instantiate&nbsp;a&nbsp;logger&nbsp;object&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">Logger&nbsp;_logger&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;5:&nbsp;Attach&nbsp;the&nbsp;appender&nbsp;object&nbsp;to&nbsp;the&nbsp;logger&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">_logger.addAppender(_append);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">log&nbsp;activity&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">LOG4CPLUS_DEBUG(_logger,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">This&nbsp;is&nbsp;the&nbsp;simple&nbsp;formatted&nbsp;log&nbsp;message<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">将打印结果：DEBUG&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;This&nbsp;</span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000">&nbsp;the&nbsp;simple&nbsp;formatted&nbsp;log&nbsp;message<img src="http://www.cppblog.com/Images/dot.gif"></span></div>
<br>三. PatternLayout<br>是一种有词法分析功能的模式布局器，一提起模式就会想起正则表达式，<br>这里的模式和正则表达式类似，但是远比后者简单，能够对预定义的标识符<br>（称为conversion specifiers）进行解析，转换成特定格式输出。以下代码<br>片段演示了如何使用PatternLayout：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;1:&nbsp;Instantiate&nbsp;an&nbsp;appender&nbsp;object&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">SharedObjectPtr&nbsp;_append&nbsp;(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ConsoleAppender());&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">append&nbsp;for&nbsp;test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;2:&nbsp;Instantiate&nbsp;a&nbsp;layout&nbsp;object&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;pattern&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d{%m/%d/%y&nbsp;%H:%M:%S}&nbsp;&nbsp;-&nbsp;%m&nbsp;[%l]%n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">std::auto_ptr&nbsp;_layout(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;PatternLayout(pattern));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;3:&nbsp;Attach&nbsp;the&nbsp;layout&nbsp;object&nbsp;to&nbsp;the&nbsp;appender&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setLayout(&nbsp;_layout&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;4:&nbsp;Instantiate&nbsp;a&nbsp;logger&nbsp;object&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">Logger&nbsp;_logger&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test_logger.subtest</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;5:&nbsp;Attach&nbsp;the&nbsp;appender&nbsp;object&nbsp;to&nbsp;the&nbsp;logger&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">_logger.addAppender(_append);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">log&nbsp;activity&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">LOG4CPLUS_DEBUG(_logger,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">teststr</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">输出结果：</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">04</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">18</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">51</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;teststr&nbsp;[main.cpp:</span><span style="COLOR: #000000">51</span><span style="COLOR: #000000">]</span></div>
可以看出通过填写特定格式的模式字符串"pattern"，原始信息被包含到一堆有格式的信息当中了，<br>这就使得用户可以根据自身需要来定制显示内容。"pattern"可以包含普通字符串和预定义的标识符，<br>其中：（<br>1）普通字符串，能够被直接显示的信息。<br>2）预定义标识符，通过"%"与一个或多个字符共同构成预定义的标识符，能够产生出特定格式信息。<br>&nbsp;&nbsp; 关于预定义标识符，log4cplus文档中提供了详细的格式说明，我每种都试了一下，以上述代码为例，<br>&nbsp;&nbsp; 根据不同的pattern，各种消息格式使用情况列举如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; （1）"%%"，转义为%, 即，std::string pattern = "%%" 时输出: "%"<br>&nbsp;&nbsp;&nbsp;&nbsp; （2）"%c"，输出logger名称，比如std::string pattern ="%c" 时输出: "test_logger.subtest"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也可以控制logger名称的显示层次，比如"%c{1}"时输出"test_logger"，其中数字表示层次。<br>&nbsp;&nbsp;&nbsp;&nbsp; （3）"%D"，显示本地时间，当std::string pattern ="%D" 时输出:"2004-10-16 18:55:45"，%d显示标准时间，&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以当std::string pattern ="%d" 时输出 "2004-10-16 10:55:45" （因为我们是东8区，差8个小时啊）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以通过%d{...}定义更详细的显示格式，比如%d{%H:%M:%s}表示要显示小时:分钟：秒。大括号中可显示的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 预定义标识符如下：%a -- 表示礼拜几，英文缩写形式，比如"Fri"%A -- 表示礼拜几，比如"Friday"%b -- 表示几月份，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 英文缩写形式，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如"Oct"%B -- 表示几月份，"October"%c -- 标准的日期＋时间格式，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "Sat Oct 16 18:56:19 2004"%d -- 表示今天是这个月的几号(1-31)"16"%H -- 表示当前时刻是几时(0-23)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "18"%I -- 表示当前时刻是几时(1-12)，如 "6"%j -- 表示今天是哪一天(1-366)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "290"%m -- 表示本月是哪一月(1-12)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "10"%M -- 表示当前时刻是哪一分钟(0-59)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "59"%p -- 表示现在是上午还是下午， AM or PM%q -- 表示当前时刻中毫秒部分(0-999)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "237"%Q -- 表示当前时刻中带小数的毫秒部分(0-999.999)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "430.732"%S -- 表示当前时刻的多少秒(0-59)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "32"%U -- 表示本周是今年的第几个礼拜，以周日为第一天开始计算(0-53)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "41"%w -- 表示礼拜几，(0-6, 礼拜天为0)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "6"%W -- 表示本周是今年的第几个礼拜，以周一为第一天开始计算(0-53)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "41"%x -- 标准的日期格式，如 "10/16/04"%X -- 标准的时间格式，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "19:02:34"%y -- 两位数的年份(0-99)，如 "04"%Y -- 四位数的年份，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如 "2004"%Z -- 时区名，比如 "GMT"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （4）"%F"，输出当前记录器所在的文件名称，比如std::string pattern ="%F" 时输出: "main.cpp"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （5）"%L"，输出当前记录器所在的文件行号，比如std::string pattern ="%L" 时输出: "51"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （6）"%l"，输出当前记录器所在的文件名称和行号，比如std::string pattern ="%L" 时输出:&nbsp;&nbsp;&nbsp;&nbsp; "main.cpp:51"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （7）"%m"，输出原始信息，比如std::string pattern ="%m" 时输出: "teststr"，即上述代码中&nbsp;&nbsp;&nbsp;&nbsp; LOG4CPLUS_DEBUG的第二个参数，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种实现机制可以确保原始信息被嵌入到带格式的信息中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （8）"%n"，换行符，没什么好解释的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （9）"%p"，输出LogLevel，比如std::string pattern ="%p" 时输出: "DEBUG"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （10）"%t"，输出记录器所在的线程ID，比如std::string pattern ="%t" 时输出: "1075298944"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （11）"%x"，嵌套诊断上下文NDC (nested diagnostic context) 输出，从堆栈中弹出上下文信息，NDC可以用对<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不同源的log信息（同时地）交叉输出进行区分，关于NDC方面的详细介绍会在下文中提到。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （12）格式对齐，比如std::string pattern ="%-10m"时表示左对齐，宽度是10，此时会输出"teststr&nbsp;&nbsp; "，当<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然其它的控制字符也可以相同的方式来使用，比如"%-12d"，"%-5p"等等（刚接触log4cplus文档时还以为 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "%-5p"整个字符串代表LogLevel呢，呵呵）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;四. TTCCLayout<br>是在PatternLayout基础上发展的一种缺省的带格式输出的布局器， 其格式由时间，线程ID，Logger和NDC 组成<br>&nbsp;。提供给那些想显示典型的信息（一般情况下够用了）又懒得配置pattern的同志们。<br>&nbsp;TTCCLayout在构造时有机会选择显示本地时间或GMT时间，缺省是按照本地时间显示：<br>&nbsp;TTCCLayout::TTCCLayout(bool use_gmtime&nbsp; = false)<br>&nbsp;以下代码片段演示了如何使用TTCCLayout：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;step&nbsp;1:&nbsp;Instantiate&nbsp;an&nbsp;appender&nbsp;object</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SharedObjectPtr&nbsp;_append&nbsp;(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ConsoleAppender());&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">append&nbsp;for&nbsp;test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;2:&nbsp;Instantiate&nbsp;a&nbsp;layout&nbsp;object&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;std::auto_ptr&nbsp;_layout(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TTCCLayout());&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;3:&nbsp;Attach&nbsp;the&nbsp;layout&nbsp;object&nbsp;to&nbsp;the&nbsp;appender&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_append</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setLayout(&nbsp;_layout&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;4:&nbsp;Instantiate&nbsp;a&nbsp;logger&nbsp;object&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Logger&nbsp;_logger&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test_logger</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;5:&nbsp;Attach&nbsp;the&nbsp;appender&nbsp;object&nbsp;to&nbsp;the&nbsp;logger&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_logger.addAppender(_append);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">log&nbsp;activity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LOG4CPLUS_DEBUG(_logger,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">teststr</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;输出结果：</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">04</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">19</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">08</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">27</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">501</span><span style="COLOR: #000000">&nbsp;[</span><span style="COLOR: #000000">1075298944</span><span style="COLOR: #000000">]&nbsp;DEBUG&nbsp;test_logger&nbsp;</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;teststr&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;当构造TTCCLayout对象时选择GMT时间格式时：&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">step&nbsp;2:&nbsp;Instantiate&nbsp;a&nbsp;layout&nbsp;object&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;std::auto_ptr&nbsp;_layout(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TTCCLayout(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;输出结果：</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">04</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">47</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">678</span><span style="COLOR: #000000">&nbsp;[</span><span style="COLOR: #000000">1075298944</span><span style="COLOR: #000000">]&nbsp;DEBUG&nbsp;test_logger&nbsp;</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;teststr<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">*/</span></div>
<br>
<img src ="http://www.cppblog.com/API/aggbug/143280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-04-02 15:43 <a href="http://www.cppblog.com/API/archive/2011/04/02/143280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4cplus库（一）(简单使用)</title><link>http://www.cppblog.com/API/archive/2011/04/02/143275.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sat, 02 Apr 2011 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/04/02/143275.html</guid><wfw:comment>http://www.cppblog.com/API/comments/143275.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/04/02/143275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/143275.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/143275.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.简介&nbsp;&nbsp;&nbsp; log4cplus是一个日志记录的库，目的很简单，就是把合适的信息送到正确的位置上去。在服务器程序上使用非常方便。&nbsp;&nbsp;&nbsp; 开发库下载地址可以去baidu搜一下，是开源的哦！二.组成&nbsp; Log4cplus 由4部分组成：&nbsp;(1) Logger&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.cppblog.com/API/archive/2011/04/02/143275.html'>阅读全文</a><img src ="http://www.cppblog.com/API/aggbug/143275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-04-02 15:25 <a href="http://www.cppblog.com/API/archive/2011/04/02/143275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>