| <?xml version="1.0" encoding="UTF-8"?> | |
| <!-- | |
| 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. | |
| --> | |
| <document xmlns="http://maven.apache.org/XDOC/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd"> | |
| <properties> | |
| <title>LoggerAppenderPDO</title> | |
| </properties> | |
| <body> | |
| <section name="LoggerAppenderPDO"> | |
| <p><code>LoggerAppenderPDO</code> appender logs to a database using the PHP's | |
| <a href="http://php.net/manual/en/book.pdo.php" class="external">PDO extension</a>.</p> | |
| <subsection name="Layout"> | |
| <p>This appender does not require a layout.</p> | |
| </subsection> | |
| <subsection name="Parameters"> | |
| <p>The following parameters are available:</p> | |
| <table> | |
| <thead> | |
| <tr> | |
| <th>Parameter</th> | |
| <th>Type</th> | |
| <th>Required</th> | |
| <th>Default</th> | |
| <th>Description</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td>dsn</td> | |
| <td>string</td> | |
| <td><strong>Yes</strong></td> | |
| <td>-</td> | |
| <td>The Data Source Name (DSN) used to connect to the database.</td> | |
| </tr> | |
| <tr> | |
| <td>user</td> | |
| <td>string</td> | |
| <td><strong>Yes</strong></td> | |
| <td>-</td> | |
| <td>Username used to connect to the database.</td> | |
| </tr> | |
| <tr> | |
| <td>password</td> | |
| <td>string</td> | |
| <td><strong>Yes</strong></td> | |
| <td>-</td> | |
| <td>Password used to connect to the database.</td> | |
| </tr> | |
| <tr> | |
| <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> | |
| <td>insertSql</td> | |
| <td>string</td> | |
| <td>No</td> | |
| <td><em><a href="#Advanced_configuration">see below</a></em></td> | |
| <td>SQL query used to insert a log event.</td> | |
| </tr> | |
| <tr> | |
| <td>insertPattern</td> | |
| <td>string</td> | |
| <td>No</td> | |
| <td><em><a href="#Advanced_configuration">see below</a></em></td> | |
| <td>A comma separated list of format strings used in conjunction with <code>insertSql</code> parameter.</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <p>Parameters <code>dsn</code>, <code>user</code> and <code>password</code> are used by PDO to connect to | |
| the database which will be used for logging.</p> | |
| </subsection> | |
| <subsection name="Data Source Name"> | |
| <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 class="table table-compact table-bordered table-not-wide"> | |
| <tbody> | |
| <tr> | |
| <th>MySQL</th> | |
| <td><code>mysql:host=localhost;dbname=logdb</code></td> | |
| <td><a href="http://php.net/manual/en/ref.pdo-mysql.connection.php" class="external">full reference</a> </td> | |
| </tr> | |
| <tr> | |
| <th>SQLite</th> | |
| <td><code>sqlite:/path/to/log.db</code></td> | |
| <td><a href="http://php.net/manual/en/ref.pdo-sqlite.connection.php" class="external">full reference</a> </td> | |
| </tr> | |
| <tr> | |
| <th>PostgreSQL </th> | |
| <td><code>pgsql:host=localhost;port=5432</code></td> | |
| <td><a href="http://php.net/manual/en/ref.pdo-pgsql.connection.php" class="external">full reference</a> </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <p>For other available database drivers and corresponding DSN format, please see the | |
| <a href="http://www.php.net/manual/en/pdo.drivers.php" class="external">PDO driver documentation</a>. | |
| </p> | |
| </subsection> | |
| <subsection name="Database table"> | |
| <p>Since version 2.3.0, the appender will <strong>not</strong> 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> | |
| <h4>MySQL</h4> | |
| <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> | |
| <h4>SQLite</h4> | |
| <p>SQLite does not have a datetime type, so varchar is used instead.</p> | |
| <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> | |
| <h4>PostgreSQL</h4> | |
| <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> | |
| </subsection> | |
| <subsection name="Advanced configuration" id="Advanced_configuration"> | |
| <p>Parameters <code>insertSql</code> and <code>insertPattern</code> 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"><strong>WARNING:</strong> 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> | |
| <thead> | |
| <tr> | |
| <th>Parameter</th> | |
| <th>Default value</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td>insertSql</td> | |
| <td>INSERT INTO __TABLE__ (timestamp, logger, level, message, thread, file, line) VALUES (?, ?, ?, ?, ?, ?, ?)</td> | |
| </tr> | |
| <tr> | |
| <td>insertPattern</td> | |
| <td>%date{Y-m-d H:i:s},%logger,%level,%message,%pid,%file,%line</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <p>The string <em>__TABLE__</em> in <code>insertSql</code> will be replaced with the table name | |
| defined in <code>table</code>. Question marks in <code>insertSql</code> will be replaced by evaluated | |
| <code><a href="../layouts/pattern.html">LoggerPatternLayout</a></code> format strings defined in | |
| <code>insertPattern</code>. See <code><a href="../layouts/pattern.html">LoggerPatternLayout</a></code> | |
| documentation for format string description.</p> | |
| </subsection> | |
| <subsection name="Examples"> | |
| <h4>Example 1</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 <code>/var/log/log.sqlite</code>.</p> | |
| <p>First, create a database and a table for logging. In this example, let's create the database at | |
| <code>/tmp/log.db</code>.</p> | |
| <pre><![CDATA[ | |
| $ sqlite3 /tmp/log.db | |
| SQLite version 3.7.9 2011-11-01 00:52:41 | |
| Enter ".help" for instructions | |
| Enter SQL statements terminated with a ";" | |
| sqlite> CREATE TABLE log4php_log ( | |
| ...> timestamp VARCHAR(256), | |
| ...> logger VARCHAR(256), | |
| ...> level VARCHAR(32), | |
| ...> message VARCHAR(4000), | |
| ...> thread INTEGER, | |
| ...> file VARCHAR(255), | |
| ...> line VARCHAR(10) | |
| ...> ); | |
| ]]></pre> | |
| <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"> | |
| <pre class="prettyprint"><![CDATA[ | |
| <configuration xmlns="http://logging.apache.org/log4php/"> | |
| <appender name="default" class="LoggerAppenderPDO"> | |
| <param name="dsn" value="sqlite:/tmp/log.db" /> | |
| </appender> | |
| <root> | |
| <appender_ref ref="default" /> | |
| </root> | |
| </configuration> | |
| ]]></pre> | |
| </div> | |
| <div class="tab-pane"> | |
| <pre class="prettyprint"><![CDATA[ | |
| array( | |
| 'appenders' => array( | |
| 'default' => array( | |
| 'class' => 'LoggerAppenderPDO', | |
| 'params' => array( | |
| 'dsn' => 'sqlite:/tmp/log.db', | |
| ), | |
| ), | |
| ), | |
| 'rootLogger' => array( | |
| 'appenders' => array('default'), | |
| ), | |
| ); | |
| ]]></pre> | |
| </div> | |
| </div> | |
| </div> | |
| <p>Now the database is ready to accept some logging data.</p> | |
| <pre class="prettyprint linenums"><![CDATA[ | |
| require 'log4php/Logger.php'; | |
| Logger::configure('config.xml'); | |
| $log = Logger::getLogger('foo'); | |
| $log->info("foo"); | |
| $log->info("bar"); | |
| $log->info("baz"); | |
| ]]></pre> | |
| <p>And you can .</p> | |
| <pre><![CDATA[ | |
| $ sqlite3 /tmp/log.db | |
| SQLite version 3.7.9 2011-11-01 00:52:41 | |
| Enter ".help" for instructions | |
| Enter SQL statements terminated with a ";" | |
| sqlite> 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> | |
| <h4>Example 2</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 <code>logdb</code> will be | |
| created, and within it a table named <code>log</code>.</p> | |
| <pre><![CDATA[ | |
| $ 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> CREATE DATABASE logdb; | |
| Query OK, 1 row affected (0.00 sec) | |
| mysql> USE logdb; | |
| Database changed | |
| mysql> CREATE TABLE log ( | |
| -> timestamp DATETIME, | |
| -> logger VARCHAR(256), | |
| -> level VARCHAR(32), | |
| -> message VARCHAR(4000), | |
| -> thread INTEGER, | |
| -> file VARCHAR(255), | |
| -> line VARCHAR(10) | |
| -> ); | |
| Query OK, 0 rows affected (0.01 sec) | |
| ]]></pre> | |
| <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"> | |
| <pre class="prettyprint"><![CDATA[ | |
| <configuration xmlns="http://logging.apache.org/log4php/"> | |
| <appender name="default" class="LoggerAppenderPDO"> | |
| <param name="dsn" value="mysql:host=localhost;dbname=logdb" /> | |
| <param name="user" value="root" /> | |
| <param name="password" value="secret" /> | |
| <param name="table" value="log" /> | |
| </appender> | |
| <root> | |
| <appender_ref ref="default" /> | |
| </root> | |
| </configuration> | |
| ]]></pre> | |
| </div> | |
| <div class="tab-pane"> | |
| <pre class="prettyprint"><![CDATA[ | |
| array( | |
| 'appenders' => array( | |
| 'default' => array( | |
| 'class' => 'LoggerAppenderPDO', | |
| 'params' => array( | |
| 'dsn' => 'mysql:host=localhost;dbname=logdb', | |
| 'user' => 'root', | |
| 'password' => 'secret', | |
| 'table' => 'log', | |
| ), | |
| ), | |
| ), | |
| 'rootLogger' => array( | |
| 'appenders' => array('default'), | |
| ), | |
| ); | |
| ]]></pre> | |
| </div> | |
| </div> | |
| </div> | |
| <p>Now the database is ready to accept some logging data.</p> | |
| <pre class="prettyprint linenums"><![CDATA[ | |
| require 'log4php/Logger.php'; | |
| Logger::configure('config.xml'); | |
| $log = Logger::getLogger('main'); | |
| $log->info("foo"); | |
| $log->info("bar"); | |
| $log->info("baz"); | |
| ]]></pre> | |
| <p>Finally, to see the newly logged data.</p> | |
| <pre><![CDATA[ | |
| $ 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> 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> | |
| </subsection> | |
| </section> | |
| </body> | |
| </document> |