LoggingLibrary สำหรับ PHP ส่งออกตามรูปแบบ JSON
ไลบรารีนี้มีวัตถุประสงค์เพื่อใช้ในเว็บแอปพลิเคชันเป็นหลัก
composer require nekonomokochan/php-json-logger
<?php
use Nekonomokochan PhpJsonLogger LoggerBuilder ;
$ context = [
' title ' => ' Test ' ,
' price ' => 4000 ,
' list ' => [ 1 , 2 , 3 ],
' user ' => [
' id ' => 100 ,
' name ' => ' keitakn ' ,
],
];
$ loggerBuilder = new LoggerBuilder ();
$ logger = $ loggerBuilder -> build ();
$ logger -> info ( ' ? ' , $ context );
มันออกมาดังนี้
{
"log_level" : " INFO " ,
"message" : " ? " ,
"channel" : " PhpJsonLogger " ,
"trace_id" : " 35b627ce-55e0-4729-9da0-fbda2a7d817d " ,
"file" : " / home / vagrant / php-json-logger / tests / LoggerTest.php " ,
"line" : 42 ,
"context" : {
"title" : " Test " ,
"price" : 4000 ,
"list" : [
1 ,
2 ,
3
],
"user" : {
"id" : 100 ,
"name" : " keitakn "
}
},
"remote_ip_address" : " 127.0.0.1 " ,
"server_ip_address" : " 127.0.0.1 " ,
"user_agent" : " unknown " ,
"datetime" : " 2018-06-04 17:21:03.631409 " ,
"timezone" : " Asia / Tokyo " ,
"process_time" : 631.50811195373535
}
หน่วยของ process_time
คือ ms(มิลลิวินาที)
เส้นทางไฟล์เอาต์พุตเริ่มต้นคือ /tmp/php-json-logger-yyyy-mm-dd.log
หากคุณต้องการเปลี่ยนเส้นทางไฟล์เอาต์พุต โปรดตั้งค่าเส้นทางไฟล์เอาต์พุตเป็นคลาสตัวสร้าง
<?php
use Nekonomokochan PhpJsonLogger LoggerBuilder ;
$ fileName = ' /tmp/test-php-json-logger.log ' ;
$ context = [
' cat ' => ' ? ' ,
' dog ' => ' ? ' ,
' rabbit ' => ' ? ' ,
];
$ loggerBuilder = new LoggerBuilder ();
$ loggerBuilder -> setFileName ( $ fileName );
$ logger = $ loggerBuilder -> build ();
$ logger -> info ( ' testSetLogFileName ' , $ context );
เส้นทางไฟล์เอาต์พุตคือ /tmp/test-php-json-logger-yyyy-mm-dd.log
มันออกมาดังนี้
{
"log_level" : " INFO " ,
"message" : " testSetLogFileName " ,
"channel" : " PhpJsonLogger " ,
"trace_id" : " 20f39cdb-dbd8-470c-babd-093a2974d169 " ,
"file" : " / home / vagrant / php-json-logger / tests / LoggerTest.php " ,
"line" : 263 ,
"context" : {
"cat" : " ? " ,
"dog" : " ? " ,
"rabbit" : " ? "
},
"remote_ip_address" : " 127.0.0.1 " ,
"server_ip_address" : " 127.0.0.1 " ,
"user_agent" : " unknown " ,
"datetime" : " 2018-06-05 11:28:03.214995 " ,
"timezone" : " Asia / Tokyo " ,
"process_time" : 215.09790420532227
}
trace_id
สามารถตั้งค่าใดๆ สำหรับ trace_id
ได้
สิ่งนี้จะช่วยคุณเมื่อค้นหาบันทึกที่คุณต้องการ
<?php
use Nekonomokochan PhpJsonLogger LoggerBuilder ;
$ context = [
' name ' => ' keitakn ' ,
];
$ loggerBuilder = new LoggerBuilder ();
$ loggerBuilder -> setTraceId ( ' MyTraceID ' );
$ logger = $ loggerBuilder -> build ();
$ logger -> info ( ' testSetTraceIdIsOutput ' , $ context );
มันออกมาดังนี้
{
"log_level" : " INFO " ,
"message" : " testSetTraceIdIsOutput " ,
"channel" : " PhpJsonLogger " ,
"trace_id" : " MyTraceID " ,
"file" : " / home / vagrant / php-json-logger / tests / LoggerTest.php " ,
"line" : 214 ,
"context" : {
"name" : " keitakn "
},
"remote_ip_address" : " 127.0.0.1 " ,
"server_ip_address" : " 127.0.0.1 " ,
"user_agent" : " unknown " ,
"datetime" : " 2018-06-05 11:36:02.394269 " ,
"timezone" : " Asia / Tokyo " ,
"process_time" : 394.35911178588867
}
กรุณาใช้ NekonomokochanPhpJsonLoggerLoggerBuilder::setLogLevel()
ตัวอย่างเช่น รหัสต่อไปนี้ไม่แสดงผลบันทึก
เนื่องจากระดับถูกตั้งค่าเป็น CRITICAL
<?php
use Nekonomokochan PhpJsonLogger LoggerBuilder ;
$ context = [
' cat ' => ' ? ' ,
' dog ' => ' ? ' ,
' rabbit ' => ' ? ' ,
];
$ loggerBuilder = new LoggerBuilder ();
$ loggerBuilder -> setLogLevel (LoggerBuilder:: CRITICAL );
$ logger = $ loggerBuilder -> build ();
$ logger -> info ( ' testSetLogLevel ' , $ context );
คุณสามารถตั้งค่าต่อไปนี้สำหรับ logLevel
สิ่งเหล่านี้เหมือนกับ logLevel
ที่กำหนดใน Monolog
ช่องทางเริ่มต้นคือ PhpJsonLogger
หากคุณต้องการเปลี่ยนช่องคุณสามารถเปลี่ยนได้ด้วยรหัสต่อไปนี้
$ loggerBuilder = new LoggerBuilder ();
$ loggerBuilder -> setChannel ( ' My Favorite Animals ' );
ตัวอย่างเช่นผลลัพธ์จะเป็นดังนี้
{
"log_level" : " INFO " ,
"message" : " testCanSetChannel " ,
"channel" : " My Favorite Animals " ,
"trace_id" : " 4b8aa070-a533-4376-9bf5-270c8fcc6d87 " ,
"file" : " / home / vagrant / php-json-logger / tests / Logger / LoggerTest.php " ,
"line" : 347 ,
"context" : {
"animals" : " ????? "
},
"remote_ip_address" : " 127.0.0.1 " ,
"server_ip_address" : " 127.0.0.1 " ,
"user_agent" : " unknown " ,
"datetime" : " 2018-06-07 17:56:48.538117 " ,
"timezone" : " Asia / Tokyo " ,
"process_time" : 538.48695755004883
}
นี่เป็นการตั้งค่าเริ่มต้นในการบันทึกบันทึกเป็นเวลา 7 วัน
หากคุณต้องการเปลี่ยนวันที่หมุนเวียนบันทึก คุณสามารถเปลี่ยนได้ด้วยรหัสต่อไปนี้
รหัสต่อไปนี้จะกำหนดระยะเวลาการเก็บรักษาบันทึกเป็น 2 วัน
$ loggerBuilder = new LoggerBuilder ();
$ loggerBuilder -> setMaxFiles ( 2 );
NekonomokochanPhpJsonLoggerJsonFormatter
คุณสามารถสร้าง MonologLogger
ของคุณเองได้โดยใช้ NekonomokochanPhpJsonLoggerJsonFormatter
เท่านั้น
วิธีการนี้มีประโยชน์เมื่อคุณต้องการ MonologLogger
ในเฟรมเวิร์กแอปพลิเคชันเว็บ (เช่น Laravel)
ต่อไปนี้เป็นโค้ดตัวอย่าง
<?php
use Monolog Logger ;
use Monolog Handler RotatingFileHandler ;
use Monolog Processor IntrospectionProcessor ;
use Nekonomokochan PhpJsonLogger JsonFormatter ;
$ logFileName = ' /tmp/extended-monolog-test.log ' ;
// create extendedMonolog Instance
$ formatter = new JsonFormatter ();
$ rotating = new RotatingFileHandler (
$ logFileName ,
7 ,
Logger:: INFO
);
$ rotating -> setFormatter ( $ formatter );
$ introspection = new IntrospectionProcessor (
Logger:: INFO ,
[ ' Nekonomokochan \ PhpJsonLogger \' ],
0
);
$ extraRecords = function ( $ record ) {
$ record [ ' extra ' ][ ' trace_id ' ] = ' ExtendedMonologTestTraceId ' ;
$ record [ ' extra ' ][ ' created_time ' ] = microtime ( true );
return $ record ;
};
$ extendedMonolog = new Logger (
' ExtendedMonolog ' ,
[ $ rotating ],
[ $ introspection , $ extraRecords ]
);
// output info log
$ context = [
' cat ' => ' ? ' ,
' dog ' => ' ? ' ,
' rabbit ' => ' ? ' ,
];
$ extendedMonolog -> info ( ' outputInfoLogTest ' , $ context );
เอาต์พุตไปที่ extended-monolog-test-yyyy-mm-dd.log
ดังต่อไปนี้
{
"log_level" : " INFO " ,
"message" : " outputInfoLogTest " ,
"channel" : " ExtendedMonolog " ,
"trace_id" : " ExtendedMonologTestTraceId " ,
"file" : " / home / vagrant / php-json-logger / tests / ExtendedMonologTest.php " ,
"line" : 85 ,
"context" : {
"cat" : " ? " ,
"dog" : " ? " ,
"rabbit" : " ? "
},
"remote_ip_address" : " 127.0.0.1 " ,
"server_ip_address" : " 127.0.0.1 " ,
"user_agent" : " unknown " ,
"datetime" : " 2018-06-06 17:14:26.042013 " ,
"timezone" : " Asia / Tokyo " ,
"process_time" : 0.1678466796875
}
โค้ดต่อไปนี้จำเป็นสำหรับเอาต์พุต trace_id
และ process_time
<?php
$ extraRecords = function ( $ record ) {
$ record [ ' extra ' ][ ' trace_id ' ] = ' ExtendedMonologTestTraceId ' ;
$ record [ ' extra ' ][ ' created_time ' ] = microtime ( true );
return $ record ;
};
โค้ดด้านล่างนี้คือโค้ดที่จำเป็นในการแสดงการติดตามสแต็กด้วย JSON
<?php
$ introspection = new IntrospectionProcessor (
Logger:: INFO ,
[ ' Nekonomokochan \ PhpJsonLogger \' ],
0
);
เมื่อต้องการส่งออกการติดตามสแต็กไปยังบันทึก ให้รันโค้ดต่อไปนี้
<?php
$ exception = new Exception ( ' ExtendedMonologTest.outputErrorLog ' , 500 );
$ context = [
' cat ' => ' ?(=^・^=)? ' ,
' dog ' => ' ?Uo・ェ・oU? ' ,
' rabbit ' => ' ??? ' ,
];
$ extendedMonolog -> error (
get_class ( $ exception ),
$ this -> formatPhpJsonLoggerErrorsContext ( $ exception , $ context )
);
โปรดใส่ใจกับส่วน $this->formatPhpJsonLoggerErrorsContext($exception, $context)
นี่เป็นการประมวลผลที่จำเป็นเพื่อจัดรูปแบบบันทึกข้อผิดพลาดลงใน JSON และส่งออกข้อมูลดังกล่าว
นี่เป็นวิธีการที่ใช้ใน NekonomokochanPhpJsonLoggerErrorsContextFormat
เอาต์พุตไปที่ extended-monolog-test-yyyy-mm-dd.log
ดังต่อไปนี้
หากคุณต้องการทราบรายละเอียดการใช้งานเพิ่มเติม โปรดดูที่ php-json-logger/tests/ExtendedMonologTest.php
{
"log_level" : " ERROR " ,
"message" : " Exception " ,
"channel" : " PhpJsonLogger " ,
"trace_id" : " ExtendedMonologTestTraceId " ,
"file" : " / home / vagrant / php-json-logger / tests / ExtendedMonologTest.php " ,
"line" : 126 ,
"context" : {
"cat" : " ?(=^・^=)? " ,
"dog" : " ?Uo・ェ・oU? " ,
"rabbit" : " ??? "
},
"remote_ip_address" : " 127.0.0.1 " ,
"server_ip_address" : " 127.0.0.1 " ,
"user_agent" : " unknown " ,
"datetime" : " 2018-06-06 17:37:57.440757 " ,
"timezone" : " Asia / Tokyo " ,
"process_time" : 0.16093254089355469 ,
"errors" : {
"message" : " ExtendedMonologTest.outputErrorLog " ,
"code" : 500 ,
"file" : " / home / vagrant / php-json-logger / tests / ExtendedMonologTest.php " ,
"line" : 117 ,
"trace" : [
" #0 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / src / Framework / TestCase.php(1145): Nekonomokochan \ Tests \ ExtendedMonologTest->outputErrorLog() " ,
" #1 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / src / Framework / TestCase.php(840): PHPUnit \ Framework \ TestCase->runTest() " ,
" #2 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / src / Framework / TestResult.php(645): PHPUnit \ Framework \ TestCase->runBare() " ,
" #3 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / src / Framework / TestCase.php(798): PHPUnit \ Framework \ TestResult->run() " ,
" #4 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / src / Framework / TestSuite.php(776): PHPUnit \ Framework \ TestCase->run() " ,
" #5 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / src / TextUI / TestRunner.php(529): PHPUnit \ Framework \ TestSuite->run() " ,
" #6 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / src / TextUI / Command.php(198): PHPUnit \ TextUI \ TestRunner->doRun() " ,
" #7 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / src / TextUI / Command.php(151): PHPUnit \ TextUI \ Command->run() " ,
" #8 / home / vagrant / php-json-logger / vendor / phpunit / phpunit / phpunit(53): PHPUnit \ TextUI \ Command::main() "
]
}
}
หากต้องการส่งบันทึกไปยัง Slack โปรดรันโค้ดต่อไปนี้
รหัสนี้จะถูกส่งไปหย่อนหากระดับบันทึกมี CRITICAL
หรือสูงกว่า
<?php
use Nekonomokochan PhpJsonLogger LoggerBuilder ;
use Nekonomokochan PhpJsonLogger SlackHandlerBuilder ;
$ exception = new Exception ( ' TestException ' , 500 );
$ context = [
' name ' => ' keitakn ' ,
' email ' => ' [email protected] ' ,
];
$ slackToken = ' YOUR_SLACK_TOKEN ' ;
$ slackChannel = ' YOUR_SLACK_CHANNEL ' ;
$ slackHandlerBuilder = new SlackHandlerBuilder ( $ slackToken , $ slackChannel );
$ slackHandlerBuilder -> setLevel (LoggerBuilder:: CRITICAL );
$ loggerBuilder = new LoggerBuilder ();
$ loggerBuilder -> setFileName ( $ this -> outputFileBaseName );
$ loggerBuilder -> setSlackHandler ( $ slackHandlerBuilder -> build ());
$ logger = $ loggerBuilder -> build ();
$ logger -> critical ( $ exception , $ context );
โปรดใช้ LoggerBuilder.setUseInDocker
เพื่อใช้งานบน Docker
เมื่อ setUseInDocker ถูกตั้งค่าเป็นจริง จะไม่มีเอาต์พุตไฟล์ใดเกิดขึ้น และบันทึกจะถูกเอาต์พุตเป็น stdout
<?php
use Nekonomokochan PhpJsonLogger LoggerBuilder ;
$ exception = new Exception ( ' TestException ' , 500 );
$ context = [
' name ' => ' keitakn ' ,
' email ' => ' [email protected] ' ,
];
$ loggerBuilder = new LoggerBuilder ();
$ loggerBuilder -> setFileName ( $ this -> outputFileBaseName );
$ loggerBuilder -> setUseInDocker ( true );
$ logger = $ loggerBuilder -> build ();
$ logger -> critical ( $ exception , $ context );
NekonomokochanPhpJsonLoggerLogger
เป็นคลาสย่อยที่ขยาย MonologLogger
คุณสามารถใช้มันเหมือน MonologLogger
อย่างไรก็ตาม สำหรับวิธีการต่อไปนี้ คุณสามารถส่งผ่านเฉพาะคลาสที่ขยาย Exception
หรือ Error
เป็นอาร์กิวเมนต์ได้
NekonomokochanPhpJsonLoggerLogger::error()
NekonomokochanPhpJsonLoggerLogger::critical()
NekonomokochanPhpJsonLoggerLogger::alert()
NekonomokochanPhpJsonLoggerLogger::emergency()
ในกรณีที่มีการละเมิด NekonomokochanPhpJsonLoggerLogger
จะโยน NekonomokochanPhpJsonLoggerInvalidArgumentException
เอ็มไอที