Tìm hiểu Laravel (P6) - Logging
Bài đăng này đã không được cập nhật trong 3 năm
Indexs
- Phần 1: Cài đặt
- Phần 2: Form đăng nhập
- Phần 3: Send Mail
- Phần 4: Error page
- Phần 5: Application Structure
- Ở 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àmdd()
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àmdd()
là tiến trình sẽ bị dừng lại ngay tại điểm đặt hàmdd()
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ênlaravel.log
và có dạng như sau:
- 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ànhcreated_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 fileconfig/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ìnhlog_max_files
vào trongapp.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ứcconfigureMonologUsing
, và gọi nó trước khi biến$app
được trả về trong filebootstrap/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
, classLog
config trongconfig/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