Laravel에서 Logger 느낌이 되게 좋았어요.

16327 단어 PHPLaravel레코드
일지가 중요하지.
나는 정보를 쉽게 생성할 수 있는 Logger를 정의하여 좋은 개발과 운용 환경을 만들고 싶다.
이 글은 전자 검색을 깊이 있게 하는 등 로그를 검색할 수 있도록 하는 것을 전제로 하고 좋은 감각으로 로그를 출력하는 것을 목표로 한다.

환경


Laravel 5.8

하고 싶은 일


Laravel 로그를 맞춤형으로 만들어서 기분이 좋아집니다.

좋은 느낌은요.

  • 라벨에 기록된 사건은 문제가 발생했을 때 신속하게 원인 규명과 대응을 할 수 있다.
  • 이 일대는 일지 지침을 제정함으로써 목적을 명확히 했다.
    (참조)
    출력 포인터를 기록하는 쓰기 - White Box 기술부
    https://seri.hatenablog.com/entry/2018/10/20/172656

    어떻게


    이 글은 로그 출력에 중점을 두고 있다


    기록에 관해서 나는 두 단계가 있다고 생각한다.
    1. 로그 출력
    2. 로그 검색
    여기서 우리는 로그 출력을 할 때 실현자의 사고를 최소화하고 로그 출력을 할 때마다 사고를 줄이는 전략을 작성할 것이다.검색에 관해서, 우리는 당신이 전자 검색에 깊이 들어가야 한다고 가정하고, 다른 기회에 상세한 정보를 다시 쓰려고 합니다.

    출력


    이 때문에
    - 응용 프로그램 작업자
    - 언제 일어났는지
    - 이벤트가 어디 있어요?
    - 무슨 일이야?
    - 이벤트 심각성 여부/즉각적인 응답 필요
    동적 관찰을 할 때의 축심점.
    그리고 설치자는 가능한 한 쓸데없는 일을 고려하지 않고 설치하기를 바란다.
    이상은 다음과 같은 말을 쓰면 필요한 것을 모두 아는 것이다.
    \Log::info('Fail to get user own posts.');
    
    그래서 다음 내용은 자동으로 출력하고 싶은 곳입니다.
  • 운영자 정보
  • 언제 활동
  • 어디서 일어났는지
  • 총결산

    操作者情報といつ・どこで起きたかに関して、ロガーに実装者が情報を渡さなくてもよしなに出力される。목표로, 우리는 다음과 같은 몇 가지 점에서 Laravel의 실시를 추진할 것이다.

    하는 일


    다음 두 개의 로그 출력을 실행합니다.
  • 이벤트 로그
  • 실시자가 로그 프로그램을 사용하여 출력한 실행 로그입니다.
    로그인을 구현하는 경우 로그인을 기록합니다.
    API와의 스왑에서도 매개변수의 컨텐트 등이 남겠죠.
    datetime:2020-01-08 14:48:23    channel:local   level_name:INFO message:fugafuga     uid:e86d557c07  file:/var/www/app/Http/Controllers/HomeController.php   line:30 class:App\Http\Controllers\HomeController       function:index
    
  • 동작 로그
  • 요청마다 생성된 로그입니다.
    여기서 사용자 ID, 세션 ID, 요청 ID를 부여하여 연결합니다.
    ※ (추론) 세션 ID는 Laravel에서 암호화되어 표면에 사용되지만 그대로 보존하면 보안상의 불안이 남으므로 산열화를 권장합니다.
    datetime:2020-01-08 14:48:23    channel:local   level_name:INFO message:action_log      user_id:0       session_id:c00b8c1116c6958a66ad799b     uid:e86d5  url:/   ip:172.25.12.11   http_method:GET server:localhost   referrer:http://localhost/fuga
    

    요청을 각 이벤트에 연결하면 오류 로그가 감지될 때 앞뒤의 작업을 추적할 수 있습니다.

    실시


    통용

  • LTSV 포맷 라이브러리 가져오기
  • 해석할 때 LTSV 형식이면 간단해질 수 있으므로 LTSV로 출력합니다.
    Laravel의 로그에 사용된 Monolog에서 LTSV를 사용하기 위해서는 아래 라이브러리가 좋기 때문에 이것을 넣으세요.
    ※ Laravel5의 경우 Monolog 버전은 1계, Laravel6는 버전 2입니다.이와 함께 상술한 라이브러리의 버전도 1→2로 바뀌었기 때문에 각자의 환경에 따라 사용하는 것이 좋다.

    이벤트 로그


    로그에 대한 사용자 정의는 아래를 참조하십시오.
    고급 Monolog 채널 사용자 정의
    https://readouble.com/laravel/5.8/ja/logging.html#customizing-monolog-for-channels
    Laravel 로그에서 파일 이름 또는 메소드 이름 내보내기
    https://qiita.com/iakio/items/7b8539db928d2b419921
    Laravel에서 로그 형식을 변경하는 방법 - 오류 없는 수명
    https://blog.nobug-nolife.com/entry/20181202/1543762300
    Seldaek/monolog
    https://github.com/Seldaek/monolog
  • 로그 설정 추가
  • Laravel5.8에서 로그 채널을 설정할 수 있습니다.
    기본적으로 config/logging.php 채널을 사용하고, stack 채널은 stack 채널에 상세한 정보를 정의합니다.이번에는 날짜별로 파일을 출력할 수 있기 때문에 데일리 채널 형식으로 형식을 변경합니다.
    config/logging.php
    
       'daily' => [
           'driver' => 'daily',
           'path' => storage_path('logs/laravel.log'),
    +      'tap' => ['App\Logging\CustomizeFormatter'],
           'level' => 'debug',
           'days' => 14,
       ],
    
  • 포맷 프로그램 설치
  • app/Logging/CustomizeFormatter.php
    <?php
    
    namespace App\Logging;
    use Hikaeme\Monolog\Formatter\LtsvFormatter;
    use Monolog\Logger;
    use Monolog\Processor\IntrospectionProcessor;
    
    class CustomizeFormatter
    {
        public function __invoke($logger)
        {
            $uidprocessor = app()->make('Monolog\Processor\UidProcessor');
            $introprocessor = new IntrospectionProcessor(Logger::DEBUG, [
                'Monolog\\',
                'Illuminate\\',
            ]);
            $ltsvformatter = new LtsvFormatter(
                'Y-m-d H:i:s',
                [
                    'datetime' => 'datetime',
                    'channel' => 'channel',
                    'level_name' => 'level_name',
                    'message' => 'message',
                ]
            );
            foreach ($logger->getHandlers() as $handler) {
                $handler->setFormatter($ltsvformatter);
                $handler->pushProcessor($introprocessor);
                $handler->pushProcessor($uidprocessor);
            }
        }
    }
    
        public function register()
        {
    +        $this->app->singleton(UidProcessor::class, function ($app) {
    +            return new UidProcessor(10);
    +        });
    
        }
    
    모든 요청한 uid를 유일하게 하기 위해 UidProcessor는 이를 singleton으로 등록합니다.그렇지 않으면 모든 로그의 uid가 바뀝니다.

    작업 로그

  • 로그 설정 추가
  • config/logging.php
    +        'action' => [
    +            'driver' => 'daily',
    +            'path' => storage_path('logs/laravel.log'),
    +            'tap' => ['App\Logging\ActionLogFormatter'],
    +            'level' => 'debug',
    +            'days' => 14,
    +        ],
    
  • 정식 설치
  • 이벤트 로그와 통용되는 uid와 요청 정보를 출력할 수 있습니다.
    app/Logging/ActionLogFormatter.php
    <?php
    
    namespace App\Logging;
    use Hikaeme\Monolog\Formatter\LtsvFormatter;
    use Monolog\Processor\WebProcessor;
    
    class ActionLogFormatter
    {
        public function __construct()
        {
        }
        public function __invoke($logger)
        {
            $uidprocessor = app()->make('Monolog\Processor\UidProcessor');
            $webprocessor = new WebProcessor();
            $ltsvformatter = new LtsvFormatter(
                'Y-m-d H:i:s',
                [
                    'datetime' => 'datetime',
                    'channel' => 'channel',
                    'level_name' => 'level_name',
                    'message' => 'message',
                ]
            );
            foreach ($logger->getHandlers() as $handler) {
                $handler->setFormatter($ltsvformatter);
                $handler->pushProcessor($webprocessor);
                $handler->pushProcessor($uidprocessor);
            }
        }
    }
    
  • 미들웨어에 등록
  • 중간부품을 등록하고 작업 로그를 가져올 경로로 설정합니다.
    app/Http/Kernel.php
    +        'action_log' => \App\Http\Middleware\ActionLogMiddleware::class,
    
    route/web.php
    Route::group(['middleware' => 'action_log'], function () {
       ...対象にしたいroute
    });
    
    app/Http/Middleware/ActionLogMiddleware.php
    <?php
    
    namespace App\Http\Middleware;
    use Closure;
    use Illuminate\Support\Facades\Auth;
    
    class ActionLogMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $user_id = Auth::id() ?? 0;  // 今回はLaravelのAuthの仕組みを使っているので、そこから取得されるidをuser_idとして使います。
            $session_id = session()->getId();
            \Log::channel('action')->info('action_log', [
                'user_id' => $user_id,
                'session_id' => $this->hash($session_id),
            ]);
            $response = $next($request);
            return $response;
        }
    
        private function hash($string)
        {
            return ハッシュ化ロジック($string);
        }
    }
    

    경품


    이상의 설정을 하면 로그는 LTSV에서 출력되지만 Stack trace의 줄바꿈도 반각 공간에 의해 바뀌기 때문에 디버깅할 때 좀 보기 싫습니다.
    따라서 기본 로그 설정은 daily 채널로 개발 환경에서 사용됩니다.
    config/logging.php
    +       'local' => [
    +           'driver' => 'daily',
    +           'path' => storage_path('logs/laravel.log'),
    +           'level' => 'debug',
    +           'days' => 14,
    +       ],
    
    로컬env 다시 쓰기:.
    .env
    - LOG_CHANNEL=stack
    + LOG_CHANNEL=local
    

    과제


    어쨌든 이렇게 하면 추적 조작이 가능하겠지.아직 많은 문제(로그인 전과 로그인 후의 관련성, 오프라인 자체 검사 데이터 취득 등)가 있을 수 있다는 점은 앞으로 개선될 것이다.
    검색을 위한 구조도 다시 쓸 수 있었으면 좋겠어요.

    좋은 웹페이지 즐겨찾기