log4php

 log4php是apache的logging下的一个子项目,是log4j在php下的实现。log4j是apache项目下有名的日志记录组件,有针对比较流行的语言的实现,log4cxx,log4j,log4net,log4php等等。 
   官方对log4php的介绍如下。

Apache log4php™ is a versatile logging framework for PHP.

Feature highlights:

  • Configuration through XML, properties or PHP files
  • Various logging destinations, including:
    • Console (stdout, stderr)
    • Files (including daily and rolling files)
    • Email
    • Databases
    • Sockets
    • Syslog
  • Several built-in log message formats, including:
    • HTML
    • XML
    • User defined pattern
  • Nested (NDC) and Mapped (MDC) Diagnostic Contexts.

  2009年log4php版推出2.0.0版本后,很长一段时间没有更新,最近更新到了2.1.0版本。下载地址在http://logging.apache.com。2.1.0版本支持了对php的pear包的支持,可以将log4php功能集成到pear包中。

   我们下载的包解压,将src\main下的php目录拷贝到web文档目录,并重命名为log4php。

   写一个简单的测试例子: 

 

  1. <?php
  2. include('log4php/Logger.php');
  3. $logger = Logger::getLogger("main");
  4. $logger->info("foo");
  5. $logger->warn("bar");
  6. ?>

    在控制台(windows下用cmd命令执行)会看到如下的输出:

[quote]07/31/11 08:26:12,043 [496] INFO main - foo
07/31/11 08:26:12,047 [496] WARN main - bar[/quote]

   注意:你用浏览器打开,是看不到输出的,因为log4php的默认配置输出是到控制台。

   通过配置文件配置日志的输出,log4php.xml如下:

 

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <log4php:configuration xmlns:log4php="http://logging.apache.org/log4php/">
  3.     <appender name="myAppender" class="LoggerAppenderFile"> <!-- 1 -->
  4.         <param name="file" value="myLog.log"/> <!-- 2 -->
  5.     </appender>
  6.     <root>
  7.         <level value="WARN" /> <!-- 3 -->
  8.         <appender_ref ref="myAppender" /> <!-- 4 -->
  9.     </root>
  10. </log4php:configuration>

配置文件说明:

1、创建一个LoggerAppenderFile,用于日志文件输出。

2、文件参数,用于日志输出的文件配置。

3、设置root的级别为WARN,低于WARN的日志不会输出。

4、root的日志输出连接到myAppender上。

测试程序如下:

 

  1. <?php
  2.     // Insert the path where you unpacked log4php
  3.     include('log4php/Logger.php');
  4.     // Tell log4php to use our configuration file.
  5.     Logger::configure('log4php.xml');
  6.     // Fetch a logger, it will inherit settings from the root logger
  7.     $log = Logger::getLogger('myLogger');
  8.     // Start logging
  9.     $log->trace("My first message."); // Not logged because TRACE < WARN
  10.     $log->debug("My second message."); // Not logged because DEBUG < WARN
  11.     $log->info("My third message."); // Not logged because INFO < WARN
  12.     $log->warn("My fourth message."); // Logged because WARN >= WARN
  13.     $log->error("My fifth message."); // Logged because ERROR >= WARN
  14.     $log->fatal("My sixth message."); // Logged because FATAL >= WARN
  15. ?>

我们看到myLog.log文件中输出如下信息:

WARN - My fourth message.
ERROR - My fifth message.
FATAL - My sixth message.

比WARN级别低的日志没有输出。

更高级一点的配置:

 

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <log4php:configuration xmlns:log4php="http://logging.apache.org/log4php/">
  3.     
  4.     <appender name="myConsoleAppender" class="LoggerAppenderConsole" />
  5.     
  6.     <appender name="myFileAppender" class="LoggerAppenderFile">
  7.                 <layout class="LoggerLayoutTTCC" />
  8.         <param name="file" value="myLog.log" />
  9.     </appender>
  10.     <logger name="Foo">
  11.         <appender_ref ref="myFileAppender" />
  12.     </logger>
  13.     
  14.     <root>
  15.         <level value="DEBUG" />
  16.         <appender_ref ref="myConsoleAppender" />
  17.     </root>
  18. </log4php:configuration>

在这个配置文件中,

  • named loggers
  • using layouts
  • best practices in object-oriented programming

通过测试文件如下:

 

  1. <?php
  2.     include('log4php/Logger.php');
  3. Logger::configure('D:\log4php.xml');
  4. /**
  5.  * This is a classic pattern: using one logger object per class.
  6.  */
  7. class Foo
  8. {
  9.     /** Holds the Logger. */
  10.     private $log;
  11.     /** Logger is instantiated in the constructor. */
  12.     public function __construct()
  13.     {
  14.         // The __CLASS__ constant holds the class name, in our case "Foo".
  15.         // Therefore this creates a logger named "Foo" (which we configured in the config file)
  16.         $this->log = Logger::getLogger(__CLASS__);
  17.     }
  18.     /** Logger can be used from any member method. */
  19.     public function go()
  20.     {
  21.         $this->log->info("We have liftoff.");
  22.     }
  23. }
  24. $foo = new Foo();
  25. $foo->go();
  26. ?>

下面的信息将会输出在控制台:

INFO - We have liftoff.

下面的信息将输出在myLog.log文件中:


01/06/11 18:43:39,545 [5428] INFO Foo - We have liftoff.

注意文件输出的不同,因为在文件appender中使用了LoggerLayoutTTCC这个Layout。

PS:在Linux下要注意输出日志的目录,apache用户有权限写入。

还可以采用properties的形式配置,或者php文件。更多的资料可以参照apache官方网站。http://logging.apache.org/log4php/docs/introduction.html

posted @ 2012-01-04 09:00  Jake.Xu  阅读(...)  评论(... 编辑 收藏