2017-10-23 8 views
-1

유틸리티 클래스의 정적 메서드에 로깅을 추가하는 가장 좋은 방법을 찾으려고합니다. 로깅을 위해 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"); 
    } 
} 

그러나 이것은 내가 많은 많은 유틸리티 클래스를 가지고 제공, 중복 코드의 과도한 양처럼 보인다 정적 메소드. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

모든 경우에 정적 방법을 사용하는 특별한 이유가 있습니까? – Devon

+0

나는 모든 것에 정적 메서드를 사용하지 않습니다. 절차 기능을 함께 그룹화하는 방법. 응용 프로그램이 연결된 메서드를 사용하여 개체에 적합한 경우 비 정적 메서드를 사용합니다. – Talisphere

답변

1

로거를 정의하는 정적 메서드가있을 수 있습니다. 응용 프로그램을 시작할 때 한 번 호출 할 수 있습니다.

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

두 번째로 할 수있는 일은 정적 속성 대신 로거 인스턴스를 반환하는 정적 메서드를 사용하는 것입니다. 대신 self::$log->trace()를 호출

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

그런 다음, 당신은 단지 self::log()->trace()를 부를 것이다.

+0

첫 번째 제안을 위해 웹 응용 프로그램이 시작될 때 모든 유틸리티 클래스를 초기화하는 것을 볼 수있었습니다. 이미 WEBSITE_BASE_DIR 상수를 설정하고 log4php 구성 매개 변수를 초기화하려면이 작업을 수행해야합니다. 그러나 각 유틸리티 클래스에 대해이 작업을 수행해야합니다. 두 번째 제안은 영리합니다. 준비를 할 필요가 없으므로 전화하는 방식 만 변경하면됩니다. 유일한 단점은 내 로깅 코드가 비 정적 메서드를 사용하는 클래스 개체와 다르다는 것입니다. – Talisphere

+0

인터페이스가있는 첫 번째 방법은 종속성을 추상화 할 때 대용량 응용 프로그램에서이를 처리하는 가장 좋은 방법입니다. DI 컨테이너는 전체 응용 프로그램에 대해 한 번만 종속성을 정의 할 때 유용 할 수 있습니다. – Devon

+0

그래, 좋은 지적이야. 나는'Logger' 클래스가 이미 싱글 톤이기 때문에 실제로 아무런 차이가 없을 것이라고 생각했습니다. – Talisphere