타운광장토픽게시판

PHP 개발할때 가장 불편한 점은 로그 출력이죠.

서버 사이드에서 실행되는 스크립트이다보니 로그가 파일로 출력되어

화면에 실시간으로 띄워서 보기가 어렵습니다.

보통 tail로 살펴보는 방법이 일반적으로 사용됩니다만

이 역시 서버의 특성상 나 혼자 접속한 개발서버라면 모르겠지만

여러 사람이 접속중이라면 로그가 섞이는 문제를 피할 수 없죠.

이 문제를 극복하기 위해서 서버단의 PHP에서 발생한 로그를

웹브라우저의 console에 출력하기 위한 라이브러리가 몇 있습니다.

제가 올리는 라이브러리는 그중에서 PHPConsole을 쓰기 편리하도록

약간 커스터마이즈한 것입니다. 

설치방법도 매우 간단한데 그냥 아무 디렉토리에나 풀어놓고서

로그를 써야하는 곳에서 MyLog.php를 require 또는 include 하기만 하면

즉시 사용 가능 상태가 됩니다.

원래는 composer로 설치해야 하는데 이게 새로운 프로젝트를 시작하는게

아니라 기존 돌아가던 소스에 적당히 설치해서 로그 출력을 해야하는 경우에는

composer를 통하는게 너무 불편해서 설치를 간단하게 할 수 있도록 개조했습니다.

사용방법은 간단합니다.

 

require_once __DIR__ . '/../lib/MyLog/MyLog.php';
$log = new MyLogger('TOP');

 

이런 식으로 Logger 이름을 지정해서 MyLogger 객체를 생성해서 쓰면 됩니다.

출력은 웹브라우저 콘솔, 파일, 서버콘솔을 지원합니다. (서버콘솔은 CLI모드로 썼을때만)

파일 출력은 기본적으로 메인 로그 파일에 출력을 하고 거기에만 하는게 아니라

pushFileHandler()를 이용해서 맘대로 파일을 추가할 수 있습니다.

필요에 따라 로거별로 다른 파일로 출력하게 할 수 있죠.

아참 중요한 사항이 있습니다... 웹브라우저 콘솔로 로그를 출력하려면

크롬 브라우저에 PHPConsole 익스텐션을 설치해야 합니다. (크롬 이외의 브라우저는 X)

 

그리고 MyLib.php는 그냥 제가 자주 사용하는 유틸리티 함수를 모아놓은 것입니다.

꽤 재미있는 함수들이 많습니다.

특히 db쪽 함수들은 제가 여러가지 라이브러리나 프레임워크들의 db쪽 함수들 사용방법들을

참고해서 나름 가장 편리하고 심플하게 쓸 수 있게 한거라서... 분석해보시면 재미있을겁니다.

저는 요즘 PHP에서 손을 뗀 상태라... 그냥 썩혀두니까 많이 아깝네요.

누군가에게 도움이 될 수 있기를 바랍니다.

 

-추신

 

아참 그리고 깜빡 하고 말씀 안드린게 있는데 XDebug_Helper라는 것도 크롬 웹스토어에서 설치하세요
XDebug_Helper는 XDebug를 on/off하는 툴인데 제가 드린 소스도 여기 연동되어 있어서
XDebug의 TRACE가 ON이 되어야만, 즉 req 헤더에 XDEBUG_TRACE가 포함되어야만 로그가 출력됩니다.
이렇게 하는 이유는 이 로그시스템은 실제 동작되는 서버에도 포함되게 되는데 모든 사람들에게

일일이 계속 로그를 출력하면 서버에 부담이 되니까요..

필요할 때만 간단하게 브라우저쪽에서 로그를 껐다 켰다 할 수 있습니다.
디폴트가 OFF인거고 XDebug Helper로 TRACE ON 하시면 딱 나한테만 로그가 나오지요.

아니면 귀찮으시면 MyLog.php를 여신 다음에 XDEBUG_TRACE를 체크하는 라인을 찾아서

if 문을 지워버리세요. 그럼 그냥 항상 로그가 나올겁니다.

그리고 윈도우에서도 잘 됩니다. 저도 개발은 윈도우에서 했던터라

Atachment
첨부
  • profile
    와 이렇게 좋은 자료를!!
    정말 너무 감사합니다!
  • ?
    오우~~ 이런귀한 자료를...감사합니다.
  • profile
    작동법이 어떻게 되는지요?

    require_once(_XE_PATH_.'libs/MyLog/MyLog.php');
    $log = new MyLogger('TOP');
    $log->info('This is a log! ^_^ ');
    $log->warning('This is a log warning! ^_^ ');
    $log->error('This is a log error! ^_^ ');

    이렇게 했는데 아무것도 안쌓이네요.
    윈도우 xampp에서는 안되는건지..
  • profile ?

    크롬 웹스토어에서 PHPConsole을 설치하세요
    아참 그리고 깜빡 하고 말씀 안드린게 있는데 XDebug_Helper라는 것도 크롬 웹스토어에서 설치하세요
    XDebug_Helper는 XDebug를 on/off하는 툴인데 제가 드린 소스도 여기 연동되어 있어서
    XDebug의 TRACE가 ON이 되어야만, 즉 req 헤더에 XDEBUG_TRACE가 포함되어야만 로그가 출력됩니다.
    이렇게 하는 이유는 이 로그시스템은 실제 동작되는 서버에도 포함되게 되는데 모든 사람들에게

    일일이 계속 로그를 출력하면 서버에 부담이 되니까요..

    필요할 때만 간단하게 브라우저쪽에서 로그를 껐다 켰다 할 수 있습니다.
    디폴트가 OFF인거고 XDebug Helper로 TRACE ON 하시면 딱 나한테만 로그가 나오지요.

    아니면 귀찮으시면 MyLog.php를 여신 다음에 XDEBUG_TRACE를 체크하는 라인을 찾아서

    if 문을 지워버리세요. 그럼 그냥 항상 로그가 나올겁니다.

    그리고 윈도우에서도 잘 됩니다. 저도 개발은 윈도우에서 했던터라

  • ? profile

    자꾸 질문 드려서 죄송합니다.
    152번째줄
    foreach ($this->options['debugTagsKeysInContext'] as $key) {
    에서 에러가 계속 나네요.

    왜그런지 $this를 로그로 보면 $this->options에 값이 있는데
    $this->options을 로그로 막상 찍어 보면 NULL 값이네요 ㅠㅠ

  • profile ?

    음.. 말씀만 들어서는 원인이 뭔지 잘 모르겠네요.. 로그 출력 코드쪽을 보여주셔야 할 것 같아요.
    로그 출력 코드는
    $log->debug('text', [$value1, $value2]) 이런 식으로 주게 되어 있습니다.
    첫번째 파라미터는 무조건 문자열
    두번째 파라미터는 무조건 배열이어야 합니다. 값을 하나만 출력한다면
    $log->debug('text', [$value1])
    두번째 파라미터를 안준다면 원래는
    $log->debug('text', [])
    이렇게 줘야 하는데 $log->debug('text') 이렇게만 쓰면 []는 디폴트 파라미터로 들어가요

    $log->debug('text', null)

    이렇게 줘도 안됩니다. 두번째 파라미터는 무조건 배열입니다.

  • ? profile
    require_once(_XE_PATH_.'libs/MyLog/MyLog.php');
    $log = new MyLogger('TOP');
    $log->debug('test log',null);

    이렇게 실행 했고요.
    로그는
    [24-Feb-2020 17:51:48 Asia/Seoul] PHP Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\otoshop_xe\libs\MyLog\MyLog.php on line 152

    이렇게 나왔습니다.
  • profile ?

    $log->debug('test log',null);
    이렇게 하시면 안됩니다. 위에 제가 답글 달았다시피 두번째 파라미터는 무조건 배열이어야 합니다.
    $log->debug('test log',[null]);
    차라리 이런 식으로 null을 [ ]로 감싸서 배열로 만드시면 에러가 안날겁니다.
    두번째 파라미터는 뭔가 변수의 값을 찍어보고 싶을때 사용하는데 무조건 배열 형태로 넘겨야 합니다.
    찍을게 없으면 null이 아니라 size가 0인 배열을 넘기는거구요.
    찍을 변수가 딱 하나라고 해도 [$value1] 이런 식으로 배열로 만들어서 넘겨야 합니다.
    이게 좀 일반적인 사용법이 아닌 느낌이라 저도 실수 많이 했었는데 이런 사용법이 PHP 표준이라더군요.
    그 뭐시기냐 PSR인가 하는 PHP 표준 권고랍니다.

  • ? profile

    배열로 넘겨서 로그 나오게 했습니다.

    근데 보니까 로그가 두군데 찍히네요.
    libs\MyLog 쪽에 찍히는건 저런 에러구요.

    모듈 폴더에 생성되는 파일은 원하는데로 찍히네요.
    근데 아래 같은 메시지도 계속 쌓이네요.
    <<18:07:55>> NOTICE: E_DEPRECATED: Non-static method Context::get() should not be called statically {"code":8192,"message":"Non-static method Context::get() should not be called statically","file":"C:\\xampp\\htdocs\\otoshop_xe\\modules\\otoshopmanager\\otoshopmanager.view.php","line":87}

    이거 없앨 방법 없을까요?
    너무 많이 쌓여서 ㅠㅠ

  • profile ?
    글쎄요.. 이건 저도 첨 보는건데요..
    DEPRECATED 뜨는거 보니까 PHP 버젼 문제인가 본데...
    이건 error_reporting()을 사용하셔서 발생되는 PHP에러의 레벨을 조절하셔야 할 것 같아요.
    MyLog.php 열어보시면 __construct() 함수 안에
    error_reporting() 관련해서 컴멘트로 막아놓은 라인이 있을겁니다.
    그 라인의 컴멘트를 풀어보세요
    error_reporting(E_ERROR | E_RECOVERABLE_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING );
    그럼 위처럼 설정될텐데 그러면 아마 안뜰겁니다.
  • ? profile
    찾았습니다.
    $log->setLogLevel(300);
    $log->error('test_log',[]);
    이렇게 하니까 notice는 사라지네요.

    이제 잘 쓸 수 있을것 같네요!
    감사합니다!
  • profile
    [24-Feb-2020 17:51:48 Asia/Seoul] PHP Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\otoshop_xe\libs\MyLog\MyLog.php on line 152

    위 에러는
    157번째 줄을 foreach (self::$options['debugTagsKeysInContext'] as $key) {
    고치면 됩니다.
    static 변수를 $this로 호출하고 있었네요 ㅎ
  • profile ?

    아뇨.. $this가 맞습니다.
    스태틱변수인 $options를 생성자 내부에서 인스턴스 안쪽의 $this->options에다가
    복사해서 사용하고 있어요. 스태틱 변수에서 주는 옵션은 디폴트이고
    logger 를 new 할때 파라미터로 세부 변경이 가능합니다.

    이게 클래스 상속받아서 필요한 부분만 일부 바꾼거라서

    풀소스가 MyLog.php 안에 있는게 아닙니다.

  • ? profile
    그렇군요
    근데 참 이상한게 $this->option으로 접근이 안됩니다.
    신기한건 error_log(var_export($this,1));로 하면 option 이 보이는데요.
    error_log(var_export($this->option,1)); 으로 하면 Null값으로 나옵니다.
    제가 뭔가 놓치고 있나봐요
  • profile ?
    음.. option이 아니라 options입니다. 변수이름 뒤에 s를 빼먹으신게 아닌지...
  • ? profile
    아뇨 단순 오타입니다 ㅎㅎ
  • profile ?

    아아.. 아마 상속받은 부모 클래스에서 $options가 private로 되어 있어서 그런거 같군요
    protected로 바꾸시면 될지도... 음 이거 저도 신경 못쓴 부분이었는데 버그였었군요.
    원래 MonoLog는 제가 하듯이 클래스를 상속받아서 수정할 수 있게 열어둔 구조가
    아니었습니다. 근데 제가 필요에 의해서 강제로 뜯어고치느라 좀 무리한 부분이 있어요.
    원래 MonoLog에서 private로 되어 있는걸 제가 상속해서 접근이 가능하도록
    protected로 고친게 좀 있습니다.

    이게 composer를 쓸 수 없는 큰 이유이기도 하지요.  MonoLog 원본소스에 손을 댔기에...
    하여튼 이 부분도 그런 부분인거 같군요. 대놓고 에러가 안나서 몰랐을뿐...

  • ? profile
    Monolog/Handler/PHPConsoleHandler.php
    42번째 줄을
    protected static $options
    변경하니까 잘 됩니다 !
    감사합니다!