Laravel에서 Logger 느낌이 되게 좋았어요.
나는 정보를 쉽게 생성할 수 있는 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
요청을 각 이벤트에 연결하면 오류 로그가 감지될 때 앞뒤의 작업을 추적할 수 있습니다.
실시
통용
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
기본적으로
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,
],
<?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가 바뀝니다.작업 로그
+ 'action' => [
+ 'driver' => 'daily',
+ 'path' => storage_path('logs/laravel.log'),
+ 'tap' => ['App\Logging\ActionLogFormatter'],
+ 'level' => 'debug',
+ 'days' => 14,
+ ],
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.phpRoute::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
과제
어쨌든 이렇게 하면 추적 조작이 가능하겠지.아직 많은 문제(로그인 전과 로그인 후의 관련성, 오프라인 자체 검사 데이터 취득 등)가 있을 수 있다는 점은 앞으로 개선될 것이다.
검색을 위한 구조도 다시 쓸 수 있었으면 좋겠어요.
Reference
이 문제에 관하여(Laravel에서 Logger 느낌이 되게 좋았어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Anderiens/items/42f536fd5e1eb55ed65d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)