ฉันจะบันทึกข้อผิดพลาดและคำเตือนลงในไฟล์ได้อย่างไร


233

ฉันจะเปิดข้อผิดพลาดและคำเตือนทั้งหมดและบันทึกลงในไฟล์ได้อย่างไร แต่เพื่อตั้งค่าทั้งหมดในสคริปต์ (ไม่เปลี่ยนแปลงอะไรใน php.ini)

ฉันต้องการกำหนดชื่อไฟล์และเพื่อให้ข้อผิดพลาดและคำเตือนทั้งหมดเข้าสู่ระบบได้

คำตอบ:


358

ใช้รหัสต่อไปนี้:

ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log( "Hello, errors!" );

จากนั้นดูไฟล์:

tail -f /tmp/php-error.log

หรืออัปเดตphp.iniตามที่อธิบายไว้ในรายการบล็อกนี้ตั้งแต่ปี 2008


41
ini_setใช้งานได้หากรันโค้ดนั้นเท่านั้น ไม่มีประโยชน์สำหรับรหัสที่มีข้อผิดพลาดในการแยกวิเคราะห์เนื่องจากข้อผิดพลาดจะเกิดขึ้นก่อนที่รหัสจะถูกดำเนินการ แทนที่จะเขียนการเปลี่ยนแปลงเหล่านั้นลงใน php.ini
hakre

9
หากคุณไม่สามารถแก้ไข php.ini คุณควรจะสามารถที่จะเพิ่มใน .htaccess php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.logนี้: ดูperishablepress.com/.com/
Matthieu

1
ฉันมีคำถามวิธีรับไฟล์ error.log เพื่อสร้างในโฟลเดอร์ htdocs ของฉันแทน?
Tommy

ฉันเดาว่าคุณแค่เปลี่ยนโฟลเดอร์จากtmp/php-error.logตำแหน่งที่คุณต้องการ
ลุค

สิ่งนี้ขัดข้อง PHP ของฉันใน 5.4.0
Supuhstar

94

ดู

  • error_log - ส่งข้อความแสดงข้อผิดพลาดที่ใดที่หนึ่ง

ตัวอย่าง

error_log("You messed up!", 3, "/var/tmp/my-errors.log");

คุณสามารถปรับแต่งการจัดการข้อผิดพลาดด้วยตัวจัดการข้อผิดพลาดของคุณเองเพื่อเรียกใช้ฟังก์ชันนี้ให้คุณเมื่อใดก็ตามที่มีข้อผิดพลาดหรือคำเตือนหรือสิ่งที่คุณต้องเข้าสู่ระบบเกิดขึ้น สำหรับข้อมูลเพิ่มเติมโปรดดูบทการจัดการข้อผิดพลาดในคู่มือ PHP


42

เพียงวางรหัสเหล่านี้ที่ด้านบนของไฟล์ PHP / ดัชนีของคุณ:

error_reporting(E_ALL); // Error/Exception engine, always use E_ALL

ini_set('ignore_repeated_errors', TRUE); // always use TRUE

ini_set('display_errors', FALSE); // Error/Exception display, use FALSE only in production environment or real server. Use TRUE in development environment

ini_set('log_errors', TRUE); // Error/Exception file logging engine.
ini_set('error_log', 'your/path/to/errors.log'); // Logging file path

4
นั่นเป็นเพียงถ้าคุณยังต้องการข้อผิดพลาดทั้งหมดที่จะแสดงในการส่งออกและ / หรือเบราว์เซอร์ที่นอกเหนือจากการเข้าสู่ระบบ display_errorsไม่ควรเปิดใช้งานบนเซิร์ฟเวอร์ที่ใช้งานจริง - คำสั่งนั้นมีไว้สำหรับส่งออกไปยังผู้ใช้โดยเฉพาะและไม่มีผลต่อการบันทึก php.net/manual/en/…
Aaron Wallentine

22

เพิ่มรหัสนี้ใน. htaccess (เป็นทางเลือกของฟังก์ชั่นphp.ini / ini_set ):

<IfModule mod_php5.c>
php_flag log_errors on 
php_value error_log ./path_to_MY_PHP_ERRORS.log
# php_flag display_errors on 
</IfModule>

* ตามที่แสดงความคิดเห็น: นี่สำหรับเซิร์ฟเวอร์Apache -type และไม่ใช่สำหรับNginxหรืออื่น ๆ


7
อย่างไรก็ตามนี่เป็นเรื่องเกี่ยวกับโมดูล PHP ของ Apache โดยเฉพาะ
SacredSkull

9

นั่นคือฟังก์ชั่นสั้นส่วนตัวของฉัน

# logging
/*
[2017-03-20 3:35:43] [INFO] [file.php] Here we are
[2017-03-20 3:35:43] [ERROR] [file.php] Not good
[2017-03-20 3:35:43] [DEBUG] [file.php] Regex empty

mylog ('hallo') -> INFO
mylog ('fail', 'e') -> ERROR
mylog ('next', 'd') -> DEBUG
mylog ('next', 'd', 'debug.log') -> DEBUG file debug.log
*/
function mylog($text, $level='i', $file='logs') {
    switch (strtolower($level)) {
        case 'e':
        case 'error':
            $level='ERROR';
            break;
        case 'i':
        case 'info':
            $level='INFO';
            break;
        case 'd':
        case 'debug':
            $level='DEBUG';
            break;
        default:
            $level='INFO';
    }
    error_log(date("[Y-m-d H:i:s]")."\t[".$level."]\t[".basename(__FILE__)."]\t".$text."\n", 3, $file);
}

6

ลองดูที่log_errorsตัวเลือกการกำหนดค่าใน php.ini ดูเหมือนว่าจะทำในสิ่งที่คุณต้องการ ฉันคิดว่าคุณสามารถใช้error_logตัวเลือกในการตั้งค่าไฟล์บันทึกของคุณเองได้เช่นกัน

เมื่อlog_errorsสั่งถูกตั้งค่าเป็นOnข้อผิดพลาดที่รายงานโดย PHP error_logจะได้รับการบันทึกลงในบันทึกเซิร์ฟเวอร์หรือแฟ้มที่ระบุไว้ด้วย คุณสามารถตั้งค่าตัวเลือกเหล่านี้ได้ini_setเช่นกันหากต้องการ

(โปรดทราบว่าdisplay_errorsควรปิดใช้งานใน php.ini หากเปิดใช้งานตัวเลือกนี้)


1
ทำไมควรdisplay_errorsถูกปิดใช้งานถ้าคุณเปิดใช้งานlog_errors? ไม่สมเหตุสมผลในความคิดของฉัน :)
Guido Hendriks

5
เนื่องจากไม่จำเป็นต้องส่งออกเนื้อหาของข้อผิดพลาดสู่สาธารณะบนเซิร์ฟเวอร์ที่ใช้งานจริงโดยเฉพาะถ้าข้อความของข้อผิดพลาดนั้นถูกบันทึกอย่างรอบคอบในไฟล์
Shabbyrobe

3
ข้อผิดพลาดในการแสดงผลควรปิดการใช้งานบนเซิร์ฟเวอร์ที่ใช้งานจริงเสมอ ไม่ใช่ถ้าการบันทึกข้อผิดพลาดถูกกำหนดค่าไว้ที่อื่น แต่เสมอ ข้อผิดพลาดจะถูกบันทึกไว้ในบันทึกข้อผิดพลาด apache โดยค่าเริ่มต้นซึ่งมักจะเพียงพอ
Pihhan

1
การแสดงข้อผิดพลาดเกี่ยวกับการผลิตทำให้ PHP เป็นที่นิยมมากขึ้น :)
PeterM

0

นอกจากนี้คุณต้องมีคำสั่ง "AllowOverride Options" เพื่อให้สามารถใช้งานได้ (Apache 2.2.15)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.