blob: 30d71d7b73ec46f2df1a24baa1c508521b02789a [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at Oct 13, 2012 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Apache log4php -
LoggerAppenderPDO - Apache log4php</title>
<link rel="stylesheet" href="../../css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="../../css/site.css" type="text/css" />
<script type="text/javascript" src="../../js/jquery.min.js"></script>
<script type="text/javascript" src="../../js/bootstrap.min.js"></script>
<script type="text/javascript" src="../../js/prettify.min.js"></script>
<script type="text/javascript" src="../../js/site.js"></script>
<meta name="Date-Revision-yyyymmdd" content="20121013" />
<meta http-equiv="Content-Language" content="en" />
<!-- Google Analytics -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-26177991-1']);
_gaq.push (['_gat._anonymizeIp']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body class="composite">
<div class="navbar">
<div class="navbar-inner">
<div class="container-fluid">
<a class="brand" href="http://logging.apache.org/log4php">Apache log4php &trade;</a>
<ul class="nav">
<li>
<a href="../../index.html" title="About">About</a>
</li>
<li>
<a href="../../download.html" title="Download">Download</a>
</li>
<li>
<a href="../../install.html" title="Install">Install</a>
</li>
<li>
<a href="../../quickstart.html" title="Quick start">Quick start</a>
</li>
</ul>
<!-- Twitter link -->
<ul class="nav pull-right">
<li><a href="http://twitter.com/log4php/" class="external">Follow <strong>@log4php</strong></a></li>
</ul>
<!-- Google CSE Search Box -->
<form class="navbar-search pull-right" id="cref" action="http://www.google.com/cse">
<input type="hidden" name="cref" value="http://logging.apache.org/log4php/cse.xml" />
<input class="search-query pull-left" type="text" name="q" size="40" placeholder="Search" />
</form>
</div>
</div>
</div>
<div class="container-fluid">
<table class="layout-table">
<tr>
<td class="sidebar">
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header"><i class="icon-home"></i>Apache log4php™</li>
<li class="none">
<a href="../../index.html" title="About">About</a>
</li>
<li class="none">
<a href="../../download.html" title="Download">Download</a>
</li>
<li class="none">
<a href="../../install.html" title="Install">Install</a>
</li>
<li class="none">
<a href="../../changelog.html" title="Changelog">Changelog</a>
</li>
</ul>
<ul class="nav nav-list">
<li class="nav-header"><i class="icon-book"></i>Documentation</li>
<li class="none">
<a href="../../quickstart.html" title="Quick start">Quick start</a>
</li>
<li class="none">
<a href="../../docs/introduction.html" title="Introduction">Introduction</a>
</li>
<li class="none">
<a href="../../docs/configuration.html" title="Configuration">Configuration</a>
</li>
<li class="none">
<a href="../../docs/loggers.html" title="Loggers">Loggers</a>
</li>
<li class="expanded">
<a href="../../docs/appenders.html" title="Appenders">Appenders</a>
<ul>
<li class="none">
<a href="../../docs/appenders/console.html" title="LoggerAppenderConsole">LoggerAppenderConsole</a>
</li>
<li class="none">
<a href="../../docs/appenders/daily-file.html" title="LoggerAppenderDailyFile">LoggerAppenderDailyFile</a>
</li>
<li class="none">
<a href="../../docs/appenders/echo.html" title="LoggerAppenderEcho">LoggerAppenderEcho</a>
</li>
<li class="none">
<a href="../../docs/appenders/file.html" title="LoggerAppenderFile">LoggerAppenderFile</a>
</li>
<li class="none">
<a href="../../docs/appenders/firephp.html" title="LoggerAppenderFirePHP">LoggerAppenderFirePHP</a>
</li>
<li class="none">
<a href="../../docs/appenders/mail.html" title="LoggerAppenderMail">LoggerAppenderMail</a>
</li>
<li class="none">
<a href="../../docs/appenders/mail-event.html" title="LoggerAppenderMailEvent">LoggerAppenderMailEvent</a>
</li>
<li class="none">
<a href="../../docs/appenders/mongodb.html" title="LoggerAppenderMongoDB">LoggerAppenderMongoDB</a>
</li>
<li class="none">
<a href="../../docs/appenders/null.html" title="LoggerAppenderNull">LoggerAppenderNull</a>
</li>
<li class="none active">
<a href="../../docs/appenders/pdo.html" title="LoggerAppenderPDO">LoggerAppenderPDO</a>
</li>
<li class="none">
<a href="../../docs/appenders/php.html" title="LoggerAppenderPHP">LoggerAppenderPHP</a>
</li>
<li class="none">
<a href="../../docs/appenders/rolling-file.html" title="LoggerAppenderRollingFile">LoggerAppenderRollingFile</a>
</li>
<li class="none">
<a href="../../docs/appenders/socket.html" title="LoggerAppenderSocket">LoggerAppenderSocket</a>
</li>
<li class="none">
<a href="../../docs/appenders/syslog.html" title="LoggerAppenderSyslog">LoggerAppenderSyslog</a>
</li>
</ul>
</li>
<li class="collapsed">
<a href="../../docs/layouts.html" title="Layouts">Layouts</a>
</li>
<li class="none">
<a href="../../docs/filters.html" title="Filters">Filters</a>
</li>
<li class="none">
<a href="../../docs/renderers.html" title="Renderers">Renderers</a>
</li>
<li class="none">
<a href="../../apidocs/index.html" title="API documentation">API documentation</a>
</li>
</ul>
<ul class="nav nav-list">
<li class="nav-header"><i class="icon-user"></i>Community</li>
<li class="none">
<a href="../../volunteering.html" title="Volunteering">Volunteering</a>
</li>
<li class="none">
<a href="../../contributingpatches.html" title="Contributing Patches">Contributing Patches</a>
</li>
<li class="none">
<a href="http://wiki.apache.org/logging-log4php" class="external" target="_blank" title="Wiki">Wiki</a>
</li>
<li class="none">
<a href="http://blogs.apache.org/logging/" class="external" target="_blank" title="Blog">Blog</a>
</li>
</ul>
<ul class="nav nav-list">
<li class="nav-header"><i class="icon-info-sign"></i>Project Information</li>
<li class="none">
<a href="../../integration.html" title="Continuous Integration">Continuous Integration</a>
</li>
<li class="none">
<a href="../../source-repository.html" title="Source Repository">Source Repository</a>
</li>
<li class="none">
<a href="../../dependencies.html" title="Dependencies">Dependencies</a>
</li>
<li class="none">
<a href="../../license.html" title="Project License">Project License</a>
</li>
<li class="none">
<a href="../../team-list.html" title="Project Team">Project Team</a>
</li>
<li class="none">
<a href="../../issue-tracking.html" title="Issue Tracking">Issue Tracking</a>
</li>
<li class="none">
<a href="../../mail-lists.html" title="Mailing Lists">Mailing Lists</a>
</li>
</ul>
<ul class="nav nav-list">
<li class="nav-header"><i class="icon-cog"></i>Project Reports</li>
<li class="none">
<a href="../../changes-report.html" title="Changes Report">Changes Report</a>
</li>
<li class="none">
<a href="../../surefire-report.html" title="Surefire Report">Surefire Report</a>
</li>
<li class="none">
<a href="../../rat-report.html" title="RAT Report">RAT Report</a>
</li>
<li class="none">
<a href="../../coverage-report/index.html" title="Code Coverage">Code Coverage</a>
</li>
</ul>
<ul class="nav nav-list">
<li class="nav-header"><i class="icon-heart"></i>Apache</li>
<li class="none">
<a href="http://www.apache.org" class="external" target="_blank" title="Home">Home</a>
</li>
<li class="none">
<a href="http://www.apache.org/foundation/sponsorship.html" class="external" target="_blank" title="Sponsorship">Sponsorship</a>
</li>
<li class="none">
<a href="http://www.apache.org/licenses/" class="external" target="_blank" title="License">License</a>
</li>
<li class="none">
<a href="http://www.apache.org/foundation/thanks.html" class="external" target="_blank" title="Thanks">Thanks</a>
</li>
<li class="none">
<a href="http://www.apachecon.com" class="external" target="_blank" title="Conferences">Conferences</a>
</li>
<li class="none">
<a href="http://www.apache.org/security/" class="external" target="_blank" title="Security">Security</a>
</li>
</ul>
</div>
<div id="poweredBy">
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
<img class="poweredBy" alt="Built by Maven" src="../../images/logos/maven-feather.png" />
</a>
</div>
</td>
<td class="content">
<!-- Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->
<div class="section"><h2>LoggerAppenderPDO<a name="LoggerAppenderPDO"></a></h2>
<p><tt>LoggerAppenderPDO</tt> appender logs to a database using the PHP's
<a class="external" href="http://php.net/manual/en/book.pdo.php">PDO extension</a>.</p>
<div class="section"><h3>Layout<a name="Layout"></a></h3>
<p>This appender does not require a layout.</p>
</div>
<div class="section"><h3>Parameters<a name="Parameters"></a></h3>
<p>The following parameters are available:</p>
<table border="0" class="bodyTable">
<thead>
<tr class="a">
<th>Parameter</th>
<th>Type</th>
<th>Required</th>
<th>Default</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="b">
<td>dsn</td>
<td>string</td>
<td><b>Yes</b></td>
<td>-</td>
<td>The Data Source Name (DSN) used to connect to the database.</td>
</tr>
<tr class="a">
<td>user</td>
<td>string</td>
<td><b>Yes</b></td>
<td>-</td>
<td>Username used to connect to the database.</td>
</tr>
<tr class="b">
<td>password</td>
<td>string</td>
<td><b>Yes</b></td>
<td>-</td>
<td>Password used to connect to the database.</td>
</tr>
<tr class="a">
<td>table</td>
<td>string</td>
<td>No</td>
<td>-</td>
<td>Name of the table to which log entries are be inserted.</td>
</tr>
<tr class="b">
<td>insertSql</td>
<td>string</td>
<td>No</td>
<td><i><a href="#Advanced_configuration">see below</a></i></td>
<td>SQL query used to insert a log event.</td>
</tr>
<tr class="a">
<td>insertPattern</td>
<td>string</td>
<td>No</td>
<td><i><a href="#Advanced_configuration">see below</a></i></td>
<td>A comma separated list of format strings used in conjunction with <tt>insertSql</tt> parameter.</td>
</tr>
</tbody>
</table>
<p>Parameters <tt>dsn</tt>, <tt>user</tt> and <tt>password</tt> are used by PDO to connect to
the database which will be used for logging.</p>
</div>
<div class="section"><h3>Data Source Name<a name="Data_Source_Name"></a></h3>
<p>The Data Source Name or DSN is a database-specific string which contains the information required
to connect to the database.</p>
<p>Some common examples of DSNs:</p>
<table border="0" class="table table-compact table-bordered table-not-wide">
<tbody>
<tr class="a">
<th>MySQL</th>
<td><tt>mysql:host=localhost;dbname=logdb</tt></td>
<td><a class="external" href="http://php.net/manual/en/ref.pdo-mysql.connection.php">full reference</a> </td>
</tr>
<tr class="b">
<th>SQLite</th>
<td><tt>sqlite:/path/to/log.db</tt></td>
<td><a class="external" href="http://php.net/manual/en/ref.pdo-sqlite.connection.php">full reference</a> </td>
</tr>
<tr class="a">
<th>PostgreSQL </th>
<td><tt>pgsql:host=localhost;port=5432</tt></td>
<td><a class="external" href="http://php.net/manual/en/ref.pdo-pgsql.connection.php">full reference</a> </td>
</tr>
</tbody>
</table>
<p>For other available database drivers and corresponding DSN format, please see the
<a class="external" href="http://www.php.net/manual/en/pdo.drivers.php">PDO driver documentation</a>.
</p>
</div>
<div class="section"><h3>Database table<a name="Database_table"></a></h3>
<p>Since version 2.3.0, the appender will <b>not</b> create a database table by itself. You
have to create a database table yourself. The reason for this is that various databases use various
create statements and column types. Some common databases are covered in this chapter.</p>
<p>By default the table should contain the following columns: </p>
<ul>
<li>timestamp DATETIME</li>
<li>logger VARCHAR</li>
<li>level VARCHAR</li>
<li>message VARCHAR</li>
<li>thread VARCHAR</li>
<li>file VARCHAR</li>
<li>line VARCHAR</li>
</ul>
<p>If you wish to use an alternative table structure, see the next chapter.</p>
<p>The following examples show CREATE TABLE statements for some popular databases.</p>
<div class="section"><h4>MySQL<a name="MySQL"></a></h4>
<div><pre class="prettyprint">
CREATE TABLE log4php_log (
timestamp DATETIME,
logger VARCHAR(256),
level VARCHAR(32),
message VARCHAR(4000),
thread INTEGER,
file VARCHAR(255),
line VARCHAR(10)
);
</pre></div>
</div><div class="section"><h4>SQLite<a name="SQLite"></a></h4>
<p>SQLite does not have a datetime type, so varchar is used instead.</p>
<div><pre class="prettyprint">
CREATE TABLE log4php_log (
timestamp VARCHAR(50),
logger VARCHAR(256),
level VARCHAR(32),
message VARCHAR(4000),
thread INTEGER,
file VARCHAR(255),
line VARCHAR(10)
);
</pre></div>
</div><div class="section"><h4>PostgreSQL<a name="PostgreSQL"></a></h4>
<div><pre class="prettyprint">
CREATE TABLE log4php_log (
timestamp TIMESTAMP,
logger VARCHAR(256),
level VARCHAR(32),
message VARCHAR(4000),
thread INTEGER,
file VARCHAR(255),
line VARCHAR(10)
);
</pre></div>
</div></div>
<a name="Advanced_configuration"></a><div class="section" id="Advanced_configuration"><h3>Advanced configuration<a name="Advanced_configuration"></a></h3>
<p>Parameters <tt>insertSql</tt> and <tt>insertPattern</tt> can be used to change how events are
inserted into the database. By manipulating them, it is possible to use a custom table structure to
suit your needs.</p>
<p class="alert alert-warning"><b>WARNING:</b> Change these settings only if you are sure you
know what you are doing.</p>
<p>The default values of these parameters are:</p>
<table border="0" class="bodyTable">
<thead>
<tr class="a">
<th>Parameter</th>
<th>Default value</th>
</tr>
</thead>
<tbody>
<tr class="b">
<td>insertSql</td>
<td>INSERT INTO __TABLE__ (timestamp, logger, level, message, thread, file, line) VALUES (?, ?, ?, ?, ?, ?, ?)</td>
</tr>
<tr class="a">
<td>insertPattern</td>
<td>%date{Y-m-d H:i:s},%logger,%level,%message,%pid,%file,%line</td>
</tr>
</tbody>
</table>
<p>The string <i>__TABLE__</i> in <tt>insertSql</tt> will be replaced with the table name
defined in <tt>table</tt>. Question marks in <tt>insertSql</tt> will be replaced by evaluated
<tt><a href="../layouts/pattern.html">LoggerPatternLayout</a></tt> format strings defined in
<tt>insertPattern</tt>. See <tt><a href="../layouts/pattern.html">LoggerPatternLayout</a></tt>
documentation for format string description.</p>
</div>
<div class="section"><h3>Examples<a name="Examples"></a></h3>
<div class="section"><h4>Example 1<a name="Example_1"></a></h4>
<p>The simplest example is connecting to an SQLite database which does not require any
authentication.</p>
<p>SQLite databases are contained in simple files and don't reuquire a server to run. This example will
log to the database contained in <tt>/var/log/log.sqlite</tt>.</p>
<p>First, create a database and a table for logging. In this example, let's create the database at
<tt>/tmp/log.db</tt>.</p>
<div><pre>
$ sqlite3 /tmp/log.db
SQLite version 3.7.9 2011-11-01 00:52:41
Enter &quot;.help&quot; for instructions
Enter SQL statements terminated with a &quot;;&quot;
sqlite&gt; CREATE TABLE log4php_log (
...&gt; timestamp VARCHAR(256),
...&gt; logger VARCHAR(256),
...&gt; level VARCHAR(32),
...&gt; message VARCHAR(4000),
...&gt; thread INTEGER,
...&gt; file VARCHAR(255),
...&gt; line VARCHAR(10)
...&gt; );
</pre></div>
<p>When the database is set up, use the following configuration to set up log4php.</p>
<div class="auto-tabs">
<ul>
<li>XML</li>
<li>PHP</li>
</ul>
<div class="tab-content">
<div class="tab-pane">
<div><pre class="prettyprint">
&lt;configuration xmlns=&quot;http://logging.apache.org/log4php/&quot;&gt;
&lt;appender name=&quot;default&quot; class=&quot;LoggerAppenderPDO&quot;&gt;
&lt;param name=&quot;dsn&quot; value=&quot;sqlite:/tmp/log.db&quot; /&gt;
&lt;/appender&gt;
&lt;root&gt;
&lt;appender_ref ref=&quot;default&quot; /&gt;
&lt;/root&gt;
&lt;/configuration&gt;
</pre></div>
</div>
<div class="tab-pane">
<div><pre class="prettyprint">
array(
'appenders' =&gt; array(
'default' =&gt; array(
'class' =&gt; 'LoggerAppenderPDO',
'params' =&gt; array(
'dsn' =&gt; 'sqlite:/tmp/log.db',
),
),
),
'rootLogger' =&gt; array(
'appenders' =&gt; array('default'),
),
);
</pre></div>
</div>
</div>
</div>
<p>Now the database is ready to accept some logging data.</p>
<div><pre class="prettyprint linenums">
require 'log4php/Logger.php';
Logger::configure('config.xml');
$log = Logger::getLogger('foo');
$log-&gt;info(&quot;foo&quot;);
$log-&gt;info(&quot;bar&quot;);
$log-&gt;info(&quot;baz&quot;);
</pre></div>
<p>And you can .</p>
<div><pre>
$ sqlite3 /tmp/log.db
SQLite version 3.7.9 2011-11-01 00:52:41
Enter &quot;.help&quot; for instructions
Enter SQL statements terminated with a &quot;;&quot;
sqlite&gt; select * from log4php_log;
2012-08-18 17:14:11|foo|INFO|foo|23531|/home/ihabunek/apache/sqlite.php|5
2012-08-18 17:14:11|foo|INFO|bar|23531|/home/ihabunek/apache/sqlite.php|6
2012-08-18 17:14:11|foo|INFO|baz|23531|/home/ihabunek/apache/sqlite.php|7
</pre></div>
</div><div class="section"><h4>Example 2<a name="Example_2"></a></h4>
<p>A slightly more complex example is connecting to a MySQL database which requires user credentials
to be provided. Additionally, a user-specified table name is used.</p>
<p>First, a log table has to be created. For this example a database named <tt>logdb</tt> will be
created, and within it a table named <tt>log</tt>.</p>
<div><pre>
$ mysql -u root -p
Enter password: *******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)
mysql&gt; CREATE DATABASE logdb;
Query OK, 1 row affected (0.00 sec)
mysql&gt; USE logdb;
Database changed
mysql&gt; CREATE TABLE log (
-&gt; timestamp DATETIME,
-&gt; logger VARCHAR(256),
-&gt; level VARCHAR(32),
-&gt; message VARCHAR(4000),
-&gt; thread INTEGER,
-&gt; file VARCHAR(255),
-&gt; line VARCHAR(10)
-&gt; );
Query OK, 0 rows affected (0.01 sec)
</pre></div>
<p>The following configuration allows log4php to write to the newly created table.</p>
<div class="auto-tabs">
<ul>
<li>XML</li>
<li>PHP</li>
</ul>
<div class="tab-content">
<div class="tab-pane">
<div><pre class="prettyprint">
&lt;configuration xmlns=&quot;http://logging.apache.org/log4php/&quot;&gt;
&lt;appender name=&quot;default&quot; class=&quot;LoggerAppenderPDO&quot;&gt;
&lt;param name=&quot;dsn&quot; value=&quot;mysql:host=localhost;dbname=logdb&quot; /&gt;
&lt;param name=&quot;user&quot; value=&quot;root&quot; /&gt;
&lt;param name=&quot;password&quot; value=&quot;secret&quot; /&gt;
&lt;param name=&quot;table&quot; value=&quot;log&quot; /&gt;
&lt;/appender&gt;
&lt;root&gt;
&lt;appender_ref ref=&quot;default&quot; /&gt;
&lt;/root&gt;
&lt;/configuration&gt;
</pre></div>
</div>
<div class="tab-pane">
<div><pre class="prettyprint">
array(
'appenders' =&gt; array(
'default' =&gt; array(
'class' =&gt; 'LoggerAppenderPDO',
'params' =&gt; array(
'dsn' =&gt; 'mysql:host=localhost;dbname=logdb',
'user' =&gt; 'root',
'password' =&gt; 'secret',
'table' =&gt; 'log',
),
),
),
'rootLogger' =&gt; array(
'appenders' =&gt; array('default'),
),
);
</pre></div>
</div>
</div>
</div>
<p>Now the database is ready to accept some logging data.</p>
<div><pre class="prettyprint linenums">
require 'log4php/Logger.php';
Logger::configure('config.xml');
$log = Logger::getLogger('main');
$log-&gt;info(&quot;foo&quot;);
$log-&gt;info(&quot;bar&quot;);
$log-&gt;info(&quot;baz&quot;);
</pre></div>
<p>Finally, to see the newly logged data.</p>
<div><pre>
$ mysql -u root -p
Enter password: *******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)
mysql&gt; select * from log;
+---------------------+--------+-------+---------+--------+---------------------------------+------+
| timestamp | logger | level | message | thread | file | line |
+---------------------+--------+-------+---------+--------+---------------------------------+------+
| 2012-08-18 17:30:05 | main | INFO | foo | 23638 | /home/ihabunek/apache/mysql.php | 5 |
| 2012-08-18 17:30:05 | main | INFO | bar | 23638 | /home/ihabunek/apache/mysql.php | 6 |
| 2012-08-18 17:30:05 | main | INFO | baz | 23638 | /home/ihabunek/apache/mysql.php | 7 |
+---------------------+--------+-------+---------+--------+---------------------------------+------+
3 rows in set (0.00 sec)
</pre></div>
</div></div>
</div>
</td>
</tr>
</table>
</div>
<div class="footer">
<p>Copyright &#169; 2012
<a href="http://www.apache.org">Apache Software Foundation</a>.
All Rights Reserved.
Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License, Version 2.0</a>.
Please read the <a href="../../privacy.html">Privacy policy</a></p>
<p>Apache log4php, Apache, log4php, the Apache feather logo, the Apache Logging Services project logo and the Built by
Maven logo are trademarks of The Apache Software Foundation.</p>
<p>Site powered by <a class="external" href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a>. Icons from
<a class="external" href="http://glyphicons.com/">Glyphicons Free</a>.</p>
</div>
</body>
</html>