Yii - Ghi nhật ký
Yii cung cấp một khuôn khổ có thể tùy chỉnh cao và có thể mở rộng. Với sự trợ giúp của khung công tác này, bạn có thể dễ dàng ghi các loại thông báo khác nhau.
Để ghi lại một tin nhắn, bạn nên gọi một trong các phương pháp sau:
Yii::error() - Ghi lại một thông báo lỗi nghiêm trọng.
Yii::warning() - Ghi lại một thông báo cảnh báo.
Yii::info() - Ghi lại một tin nhắn với một số thông tin hữu ích.
Yii::trace() - Ghi lại một thông báo để theo dõi cách một đoạn mã chạy.
Các phương pháp trên ghi lại thông báo nhật ký ở các hạng mục khác nhau. Họ chia sẻ chữ ký chức năng sau:
function ($message, $category = 'application')
ở đâu -
$message - Thông báo nhật ký được ghi lại
$category - Thể loại của thông báo nhật ký
Cách đặt tên đơn giản và thuận tiện là sử dụng hằng số ma thuật PHP __METHOD__. Ví dụ -
Yii::info('this is a log message', __METHOD__);
Mục tiêu nhật ký là một thể hiện của lớp yii \ log \ Target. Nó lọc tất cả các thông báo nhật ký theo danh mục và xuất chúng sang tệp, cơ sở dữ liệu và / hoặc email.
Step 1 - Bạn cũng có thể đăng ký nhiều mục tiêu nhật ký, như.
return [
// the "log" component is loaded during bootstrapping time
'bootstrap' => ['log'],
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning', 'trace', 'info'],
],
[
'class' => 'yii\log\EmailTarget',
'levels' => ['error', 'warning'],
'categories' => ['yii\db\*'],
'message' => [
'from' => ['[email protected]'],
'to' => ['[email protected]', '[email protected]'],
'subject' => 'Application errors at mydomain.com',
],
],
],
],
],
];
Trong mã trên, hai mục tiêu được đăng ký. Mục tiêu đầu tiên chọn tất cả các lỗi, cảnh báo, dấu vết và thông báo thông tin và lưu chúng vào cơ sở dữ liệu. Mục tiêu thứ hai gửi tất cả các thông báo lỗi và cảnh báo đến email quản trị viên.
Yii cung cấp các mục tiêu nhật ký tích hợp sau:
yii\log\DbTarget - Lưu trữ thông báo nhật ký trong cơ sở dữ liệu.
yii\log\FileTarget - Lưu thông báo đăng nhập trong tệp.
yii\log\EmailTarget - Gửi thông báo nhật ký đến các địa chỉ email được xác định trước.
yii\log\SyslogTarget - Lưu thông báo nhật ký vào nhật ký hệ thống bằng cách gọi hàm syslog () trong PHP.
Theo mặc định, thông báo nhật ký được định dạng như sau:
Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text
Step 2 - Để tùy chỉnh định dạng này, bạn nên cấu hình yii\log\Target::$prefixbất động sản. Ví dụ.
[
'class' => 'yii\log\FileTarget',
'prefix' => function ($message) {
$user = Yii::$app->has('user', true) ? Yii::$app->get('user') : 'undefined user'; $userID = $user ? $user->getId(false) : 'anonym';
return "[$userID]";
}
]
Đoạn mã trên định cấu hình mục tiêu nhật ký để đặt trước tất cả thông báo nhật ký bằng userID hiện tại.
Theo mặc định, thông báo nhật ký bao gồm các giá trị từ các biến PHP toàn cầu này: $ _GET, $_POST, $_SESSION, $_COOKIE, $_FILES và $ _SERVER. Để sửa đổi hành vi này, bạn nên định cấu hìnhyii\log\Target::$logVars thuộc tính với tên của các biến mà bạn muốn đưa vào.
Tất cả các thông báo nhật ký được duy trì trong một mảng bởi đối tượng ghi nhật ký. Đối tượng trình ghi nhật ký chuyển các thông báo đã ghi vào mục tiêu nhật ký mỗi khi mảng tích lũy một số lượng thông báo nhất định (mặc định là 1000).
Step 3 - Để tùy chỉnh số này, bạn nên gọi flushInterval property.
return [
'bootstrap' => ['log'],
'components' => [
'log' => [
'flushInterval' => 50, // default is 1000
'targets' => [...],
],
],
];
Ngay cả khi đối tượng trình ghi nhật ký gửi thông báo nhật ký đến các mục tiêu nhật ký, chúng không được xuất ngay lập tức. Việc xuất xảy ra khi mục tiêu nhật ký tích lũy một số lượng thông báo nhất định (mặc định là 1000).
Step 4 - Để tùy chỉnh số này, bạn nên cấu hình exportInterval bất động sản.
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 50, // default is 1000
]
Step 5 - Bây giờ, sửa đổi config/web.php nộp hồ sơ theo cách này.
<?php
$params = require(__DIR__ . '/params.php'); $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'flushInterval' => 1,
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
'logVars' => []
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params, ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
?>
Trong đoạn mã trên, chúng tôi xác định thành phần ứng dụng nhật ký, đặt flushInterval và exportIntevalthuộc tính 1 để tất cả thông báo nhật ký xuất hiện trong tệp nhật ký ngay lập tức. Chúng tôi cũng bỏ qua thuộc tính cấp của mục tiêu nhật ký. Nó có nghĩa là thông báo nhật ký của tất cả các danh mục (lỗi, cảnh báo, thông tin, dấu vết) sẽ xuất hiện trong tệp nhật ký.
Step 6 - Sau đó, tạo một hàm có tên là actionLog () trong SiteController.
public function actionLog() {
Yii::trace('trace log message');
Yii::info('info log message');
Yii::warning('warning log message');
Yii::error('error log message');
}
Trong đoạn mã trên, chúng tôi chỉ viết bốn thông báo nhật ký thuộc các danh mục khác nhau vào các tệp nhật ký.
Step 7 - Nhập URL http://localhost:8080/index.php?r=site/logtrong thanh địa chỉ của trình duyệt web. Thông báo nhật ký sẽ xuất hiện trong thư mục app / runtime / logs trong tệp app.log.