log4php使用手记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:    log4php是apache的logging下的一个子项目,是log4j在php下的实现。log4j是apache项目下有名的日志记录组件,有针对比较流行的语言的实现,log4cxx,log4j,log4net,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

  10.     $log->debug("My second message."); // Not logged because DEBUG

  11.     $log->info("My third message."); // Not logged because INFO

  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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
安全 PHP C++
VS Code配置PHP XDebug
VS Code配置PHP XDebug
398 0
VS Code配置PHP XDebug
|
PHP
【php53-common conflicts with php-common】
【php53-common conflicts with php-common】
76 0
|
PHP
PHP面试题:在PHP中error_reporting这个函数有什么作用?
PHP面试题:在PHP中error_reporting这个函数有什么作用?
111 0
|
JavaScript 关系型数据库 PHP
Notice: Undefined index: user in D:\phpStudy\WWW\js\ls\lsmc\php\add.php on line 9
原文:Notice: Undefined index: user in D:\phpStudy\WWW\js\ls\lsmc\php\add.php on line 9 (初用数据库(mysql)做用户登录注册这一块,遇到很多问题,通过搜索找到解决方案,把问题分享出来,希望可以帮助到和我一样问题的博友们,有问题还望多多指教。
1803 0