在实用程序 类 中向静态方法添加日志记录的最佳方法是什么?

What is the best way to add logging to static methods in utility classes?

我正在尝试找出向实用程序 类 中的静态方法添加日志记录的最佳方法。我正在使用 log4php 进行日志记录。我想做的是:

<?php
require_once  WEBSITE_BASE_DIR . "/log4php/Logger.php";

class TestUtil
{
    private static $log = Logger::getLogger( "testutil" );

    public static function utilMethod1()
    {
        self::$log->trace("Entering utilMethod1");

        // ... do stuff ...

        self::$log->trace("Exiting utilMethod1");
    }

    public static function utilMethod2()
    {
        self::$log->trace("Entering utilMethod2");

        // ... do stuff ...

        self::$log->trace("Exiting utilMethod2");
    }
}

但是,我无法在 PHP 中执行此操作,并且在初始化 $log 静态变量时出现语法错误。我能弄清楚如何执行此操作的唯一方法是向每个静态方法添加一个 init() 调用:

<?php
require_once  WEBSITE_BASE_DIR . "/log4php/Logger.php";

class TestUtil
{
    private static $log = NULL;

    private static function init()
    {
        if (self::$log == NULL)
        {
            self::$log = Logger::getLogger( "testutil" );
        }
    }

    public static function utilMethod1()
    {
        self::init();
        self::$log->trace("Entering utilMethod1");

        // ... do stuff ...

        self::$log->trace("Exiting utilMethod1");
    }

    public static function utilMethod2()
    {
        self::init();
        self::$log->trace("Entering utilMethod2");

        // ... do stuff ...

        self::$log->trace("Exiting utilMethod2");
    }
}

但这似乎是过多的冗余代码,因为我有许多实用程序 类 和许多静态方法。有更好的方法吗?

您可以使用定义记录器的静态方法。您可以在启动应用程序时调用一次。

public static function setLogger(LogInterface $logger)
{
    self::$log = $logger;
}

您可以做的第二件事是使用静态方法 returns 记录器实例而不是使用静态 属性.

private static function log()
{
    return Logger::getLogger( "testutil" );
}

那么您只需调用 self::log()->trace().

而不是调用 self::$log->trace()