Làm cách nào để ghi nhật ký lỗi và cảnh báo vào một tệp?


233

Làm cách nào để bật tất cả lỗi và cảnh báo và đăng nhập chúng vào một tệp, nhưng để thiết lập tất cả các lỗi đó trong tập lệnh (không thay đổi bất cứ điều gì trong php.ini)?

Tôi muốn xác định tên tệp và để tất cả các lỗi và cảnh báo được đăng nhập vào nó.

Câu trả lời:


358

Sử dụng mã sau đây:

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

Sau đó xem tập tin:

tail -f /tmp/php-error.log

Hoặc cập nhật php.ininhư được mô tả trong mục blog này từ năm 2008.


41
ini_setkhông chỉ hoạt động nếu mã đó được thực thi. Không hữu ích cho mã có lỗi phân tích cú pháp vì lỗi sẽ xảy ra trước khi mã được thực thi. Thay vào đó hãy viết những thay đổi đó vào php.ini.
hakre

9
Nếu bạn không thể chỉnh sửa php.ini, bạn sẽ có thể thêm phần này vào .htaccess : php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log. Xem perishablepress.com/ Kẻ
Matthieu

1
Tôi có một câu hỏi, làm thế nào để lấy tệp error.log để được tạo trong thư mục htdocs của tôi?
Tommy

Tôi đoán bạn chỉ cần thay đổi thư mục từ tmp/php-error.logvị trí mà bạn mong muốn?
Lu-ca

Điều này làm
sập


42

Chỉ cần đặt các mã này ở đầu tệp PHP / index của bạn:

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
Điều đó chỉ khi bạn cũng muốn tất cả các lỗi được hiển thị ở đầu ra và / hoặc cho trình duyệt, ngoài việc đăng nhập. display_errorsKHÔNG BAO GIỜ được bật trên máy chủ sản xuất trực tiếp - lệnh đó dành riêng cho đầu ra cho người dùng và không có tác dụng trong việc đăng nhập. php.net/manual/en/...
Aaron Wallentine

22

thêm mã này vào .htaccess (thay thế cho hàm 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>

* như đã nhận xét: đây là cho các máy chủ Apache -type và không dành cho Nginx hoặc các máy chủ khác.


7
Tuy nhiên, điều này rất đặc biệt với mô-đun PHP của Apache.
HolySkull

9

Đó là chức năng ngắn cá nhân của tôi

# 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

Hãy xem log_errorstùy chọn cấu hình trong php.ini. Nó dường như chỉ làm những gì bạn muốn. Tôi nghĩ bạn cũng có thể sử dụng error_logtùy chọn để thiết lập tệp nhật ký của riêng mình.

Khi lệnh log_errorsđược đặt thành On, mọi lỗi được báo cáo bởi PHP sẽ được ghi vào nhật ký máy chủ hoặc tệp được chỉ định với error_log. Bạn cũng có thể thiết lập các tùy chọn này ini_setnếu cần.

(Xin lưu ý rằng display_errorsnên được tắt trong php.ini nếu tùy chọn này được bật)


1
Tại sao nên display_errorsbị vô hiệu hóa nếu bạn kích hoạt log_errors? Không có ý nghĩa trong quan điểm của tôi. :)
Guido Hendriks

5
Bởi vì không cần phải xuất nội dung lỗi ra công chúng trên máy chủ sản xuất, đặc biệt nếu văn bản lỗi được đăng nhập kín đáo vào một tệp.
Shabbycoat

3
Lỗi hiển thị phải luôn bị vô hiệu hóa trên máy chủ sản xuất. Không phải nếu đăng nhập lỗi được cấu hình ở một nơi khác, nhưng luôn luôn. Lỗi được ghi vào nhật ký lỗi apache theo mặc định, điều đó thường là đủ.
Pihhan

1
Hiển thị lỗi khi sản xuất làm cho PHP trở nên phổ biến hơn :)
PeterM

0

Ngoài ra, bạn cần chỉ thị "Tùy chọn AllowOverride" để làm việc này. (Apache 2.2.15)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.