Tìm hiểu Laravel (P6) - Logging

Indexs

  • Ở các bài trước ta đã cùng nhau tìm về cấu trúc của laravel, bài viết mà lẽ ra ta phải tìm hiểu nó đầu tiên trước khi làm quen với một Framework mới. Nhưng đọc đến phần này thì chắc chắn đa phần các bạn đã nắm được cấu trúc của cơ bản của Laravel 5.x rồi. Để tiếp nối phần 4: Error page thì phần 6 này ta sẽ xem xét phần Logging.

1. Giới thiệu

  • Là một developer chắc chắn ai cũng đã từng trải qua quá trình debug gian nan. Và khi gặp lỗi thì ta nghĩ đến điều gì đầu tiên, tại sao lại lỗi, do data lỗi hay gì khác,.. Và để kiểm tra thì var_dump(); die(); huyền thoại sẽ được lôi ra sử dụng, hay trong Laravel thì ta có thể dùng hàm dd() có chức năng tương tự nhưng được style lại đẹp mắt hơn. Nhưng nhược điểm của hàm dd() là tiến trình sẽ bị dừng lại ngay tại điểm đặt hàm dd() nên nhiều trường hợp developer chỉ nhận được kết quả kiểm tra data chứ không nắm rõ được tiến trình xử lý, luồng chạy của ứng dụng. Để giải quyết vấn đề này ta sẽ dùng file log để debug.
  • Mặc định khi bắt đầu một project Laravel mới thì file log đã được cấu hình sẵn. Laravel tích hợp sẵn với thư viện Monolog, đây là thư viện hỗ trợ xử lý log rất hữu hiệu.

2. Cấu hình

  • File log nằm trong thư mục app/storage/logs/ với tên laravel.log và có dạng như sau:

laravel_log.png

  • Nhìn có vẻ rất nhì nhằng và ghê gớm, nhưng để ý phần message ở đầu bạn sẽ thấy, mình chỉ sửa created_at thành created_at1 để gây lỗi, nên khi debug ta chỉ cần quan tâm các message lỗi ở trên, các lỗi báo ở core sẽ hết sau khi ta fix xong lỗi ở trên.
  • Để Laravel có thể ghi log được vào file laravel.log thì như đã nói ở phần một ta cần cấp quyền ghi 755 cho thư mục app/storage/.
  • Cơ bản, Laravel hỗ trợ các chế độ log này single, daily, syslog, và errorlog. Ví dụ, nếu bạn muốn ghi log file hàng ngày, thay vì ghi vào một file, bạn đơn giản chỉ cần thiết lập giá trị log trong file config/app.php:
'log' => 'daily'
  • Mặc định ban đầu là chế độ log single. Khi sử dụng chế độ daily, Laravel sẽ chỉ lưu trữ log files của 5 ngày. Nếu bạn muốn điều chỉnh số lượng file lưu trữ, bạn có thể thêm vào cấu hình log_max_files vào trong app.php:
'log_max_files' => 30
  • Nếu bạn muốn thay đổi cấu hình mặc định của Monolog. Bạn có thể sử dụng phương thức configureMonologUsing, và gọi nó trước khi biến $app được trả về trong file bootstrap/app.php
    $app->configureMonologUsing(function($monolog) {
        $monolog->pushHandler(...);
    });

    return $app;

Logging

  • Để viết thêm vào file log ta sẽ sử dụng Log Facede, class Log config trong config/app.config sẽ được gọi:
...
'Log' => Illuminate\Support\Facades\Log::class,
...
  • Ví dụ:
<?php

    namespace App\Http\Controllers;

    use Log;
    use App\User;
    use App\Http\Controllers\Controller;

    class UserController extends Controller
    {

        public function showProfile($id)
        {
            Log::info('Showing user profile for user: '.$id);

            return view('user.profile', ['user' => User::findOrFail($id)]);
        }
    }
  • khi đó ta kiểm tra trong file log sẽ thấy: [2016-09-26 19:45:43] local.INFO: Showing user profile for user: 2
  • Ta cũng có thể truyền vào một mảng các dữ liệu, chẳng hạn:
    Log::info('Showing user profile for user:', ['user' => $user]);
  • Kết quả ta thu được sẽ là: [2016-09-26 19:45:43] local.INFO: giang {"user":["[object] (User: {\"id\":2,\"name\":\"Thuong\",\"created_at\":\"2016-05-22 14:52:23\",\"updated_at\":\"2016-05-22 14:52:23\"})"]}
  • Logger cung cấp 8 level log cơ bản như sau:
    Log::emergency($error);
    Log::alert($error);
    Log::critical($error);
    Log::error($error);
    Log::warning($error);
    Log::notice($error);
    Log::info($error);
    Log::debug($error);

3. Kết luận

  • Việc ghi lại log của mỗi hệ thống là điều rất cần thiết và nên làm. Nó không chỉ giúp ta dễ dàng nhận ra lỗi ở một thời điểm nhất định, như khi ta sử dụng nó để debug lỗi. Mà khi ta cần khảo sát một lỗi xảy ra do quá trình, nhìn vào file log ta có thể dễ dàng đưa ra nhận xét chính xác. Chẳng hạn khi ta gặp một lỗi không rõ ràng, lúc bị lúc không, khi đó rất khó để đưa ra phán đoán chính xác nếu không dựa vào file log.
  • Để hiểu rõ hơn bạn có thể tham khảo documment ở trang chủ: Errors & Logging

All Rights Reserved