PHP項目中,記錄錯誤日志

一、場景介紹:

環境:LNMP

我們通常是通過nginx的錯誤日志來分析分錯的,也就是我們在各個server中定義的error_log。

比如下面這樣,就是將錯誤日志定義在/etc/nginx/logs/error/www.xiaobudiu.top.log,發生錯誤,可以查看的對應錯誤日志文件即可。

server {
    listen       80 default_server;
    server_name  www.xiaobudiu.top;

    charset utf-8;
    error_log    /etc/nginx/logs/error/www.xiaobudiu.top.log error;
    access_log  /etc/nginx/logs/access/www.xiaobudiu.top.log main;

    root   /data/www;
    index  index.html index.htm index.php;

    location /favicon.ico {
        log_not_found off;
        access_log off;
    }error_page  404 403 500 502 503 504  /404.html;

   location = /404.html {
        root   /data/errorPage;
   }location ~ \.php$ {
        fastcgi_pass   unix:/dev/shm/php-cgi.sock;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
   }location ~ /\.ht {
        deny  all;
    }}

但是,這只是將一個網站的所有錯誤日志都放在了一起,十分不利于分析。

比如,用戶訂單操作錯誤時,我們最好把有關訂單的錯誤寫到一個日志。再比如登錄操作錯誤的,我們最好也是把出錯誤日志寫在登錄錯誤日志中,如何實現呢。

這里,我們只需要在程序中自定義一個錯誤日志函數即可,然后,在程序中進行相應的判斷,如果程序沒執行成功,則調用記錄錯誤日志函數,比如下面這樣。



二、自定義錯誤日志格式,并進行記錄日志


1、程序中編寫相應程序

<?php
function set_debug($uid = '', $order = '', $data = ''){$error_path = 'order.error.html';//自定義錯誤日志保存的文件和路徑
    $error_data = array('time' => date("Y-m-d H:i",time()),//記錄錯誤發生的時間
        'error' => urlencode($data),//防止中文亂碼
        'order'=> $order,//記錄訂單
        'user_name'=> $uid,//記錄當前用戶
    );
    //判斷文件大小,選擇追加還是重新寫入,注意之前防止亂碼用了urlencode
    if( abs(filesize($error_path)) < 10240 ){@file_put_contents($error_path, urldecode(json_encode($error_data))."<br>",FILE_APPEND);
    }else{@file_put_contents($error_path, urldecode(json_encode($error_data)) ."<br>");
    };
}//模擬訂單錄入錯誤時,將日志記錄到錯誤日志中
$uid = 1000070;//模擬用戶uid
$order = 2132215641000070;//模擬用戶訂單號
if (true)  {set_debug($uid,$order,'訂單錄入失敗');
}


2、創建錯誤文件,并賦予權限

?cd /data/www

?touch order.error.html

?chmod 777 order.error.html?


3、效果


注:鑒于安全考慮,錯誤日志外人肯定是不能訪問到的,所以可以在server中定義正則匹配location,要求指定ip地址段才可以訪問這個文件。可以使用nginx自帶的?http_access_module 模塊進行ip鑒權。當然,也可以采取其他辦法。

這里,以http_access_module 模塊ip鑒權為例。

server {
    listen       80 default_server;
    server_name  www.xiaobudiu.top;

    charset utf-8;
    error_log    /etc/nginx/logs/error/www.xiaobudiu.top.log error;
    access_log  /etc/nginx/logs/access/www.xiaobudiu.top.log main;

    root   /data/www;
    index  index.html index.htm index.php;

    location /favicon.ico {
        log_not_found off;
        access_log off;
    }error_page  404 403 500 502 503 504  /404.html;

   location = /404.html {
        root   /data/errorPage;
   }location ~ \.php$ {
        fastcgi_pass   unix:/dev/shm/php-cgi.sock;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
   }location ~ ^/order.error.html$ {
       allow 183.128.227.94;  #這個ip能訪問order.error.html
       deny all;              #其他的不可以訪問這個頁面
   }location ~ /\.ht {
        deny  all;
    }}

這樣,就實現了除了我規定的ip地址外,其他ip地址是訪問不到這個文件的。

注:也可以參考https://blog.csdn.net/m_nanle_xiaobudiu/article/details/80688740?最后面內容。



三、使用PHP自帶的error_log 或者?trigger_error 函數

代碼:

<?php
$uid = 1000060;
if (true) {//采取下面記錄php錯誤日志的其中一種
    if (true) {error_log($uid."訂單錄入錯誤,請核實后重新錄入");
    }if (true) {trigger_error($uid."訂單錄入錯誤,請核實后重新錄入,heihei~");
    }
}

效果:



總結:其實在項目中,最好還是使用自定義的記錄錯誤函數比較好,簡單明了,而使用error_log 或者?trigger_error 則沒有太大必要,當做一個輔助措施即可。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282308.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

持續集成指南:GitLab 的 CI/CD 工具配置與使用

1前言寫代碼這項工作&#xff0c;本質就是將工作自動化&#xff0c;減少手工操作提供效率&#xff0c;因為人的本質都是懶狗&#xff0c;程序員也不能例外&#xff0c;為了各種意義的效率提升&#xff08;懶&#xff09;&#xff0c;我們需要持續集成工具&#xff0c;將代碼測試…

php 錯誤日志 redis' already loaded in Unknown on line 0

環境介紹&#xff1a;LNMP 報錯信息&#xff1a;注&#xff1a;這個php_errors.log 是我在php.ini 中定義的錯誤日志路徑 問題原因&#xff1a; 報錯信息給出的意思是&#xff1a;redis和memcache 模塊已經加載過問題解決&#xff1a; php加載模塊有兩種方式&#xff0c;一種是…

第一周作業

我的Git賬號&#xff1a;AI1452349541 和代碼圖 這是我在電腦和手機上下的網易有道詞典 &#xff0c; C也下了。 ***學習內容總結*** 感覺任務并不是很難&#xff0c;有些任務沒完成是 因為還沒買電腦不好弄&#xff0c;下周電腦一定到位。 ***遇到的問題…

升級MariaDB為10.1版本

2019獨角獸企業重金招聘Python工程師標準>>> CentOS中升級mariadb為10.1GA版本。 1、如果有&#xff0c;停止服務 systemctl stop mariadb 2、卸載原來的數據庫服務 yum -y remove mari* 3、刪除數據庫文件 rm -rf /var/lib/mysql/* 4.創建/etc/yum.repos.d/MariaDB…

第一篇文章

第一次寫博客。歡迎各位大牛捧場轉載于:https://www.cnblogs.com/clnchanpin/p/6753665.html

羊了個羊的Ignite大會又來啦

據說最近羊了個羊非常火啊&#xff5e;可惜沒有時間精力研究。不過&#xff0c;薅微軟羊毛的機會我是一定不會錯過的&#xff0c;這不&#xff0c;薅羊毛的機會來了&#xff0c;哈哈哈。作為經常薅微軟羊毛的老司機&#xff0c;今天收到了微軟的郵件&#xff0c;告知有新的羊毛…

清除谷歌瀏覽器的dns緩存

谷歌地址欄輸入&#xff1a; chrome://net-internals/#dns出現下面界面&#xff1a;找到DNS選項&#xff0c;選擇clear host cache即可效果&#xff1a;這樣&#xff0c;谷歌瀏覽器上的dns緩存就清理掉了。應用場景&#xff1a; 本地環境和線上環境用的是一個host&#xff0c;這…

生產YUM源搭建

企業內部YUM源搭建轉載于:https://www.cnblogs.com/xiangtanglaojing/p/7603581.html

什么樣的代碼稱得上是好代碼?

“軟件自有其美感所在” --《重構》圖片&#xff1a;崇禮瀚海梁的山花 拍攝于2022年8月13日 攝影師&#xff1a;劉先生這篇內容寫作于4年前&#xff08;2018年&#xff09;&#xff0c;是自己多年軟件開發工作的一點感悟&#xff0c;現在看來雖有偏頗&#xff0c;但總體思想方…

Coding and Paper Letter(十四)

2019獨角獸企業重金招聘Python工程師標準>>> 資源整理。 1 Coding: 1.R語言包ungeviz&#xff0c;ggplot2的拓展包&#xff0c;專門用來作不確定性的可視化。 ungeviz 2.計算機圖形學相關開源項目。 計算機圖形學光線追蹤開源項目C源碼。 computer graphics ray tra…

QBC運算符含義

HQL運算符 QBC運算符 含義 Restrictions.eq() 等于 <> Restrictions.not(Exprission.eq()) 不等于 > Restrictions.gt() …

eclipse安裝反編譯插件

一、下載插件 1、官方地址&#xff1a;http://jd.benow.ca/ 2、百度網盤&#xff1a;http://pan.baidu.com/s/1eSJ7Tiq 密碼&#xff1a;sr6p 二、打開eclipse&#xff0c;點擊“Help > Install New Software” 三、Name填&#xff1a;JD-Eclipse Update Site&#xff08;可…

PHP 項目中緩存的多種應用實現

一、CDN緩存原理和介紹 1、各地部署多套靜態存儲服務&#xff0c;本質上是空間成本換時間 2、CDN是域名和真實服務器中間的一個環節&#xff0c;添加cdn節點后&#xff0c;用戶訪問時&#xff0c;自動選擇最近的節點內容&#xff0c;不存在再請求原始服務器 3、CDN本質上是一種…

【tomcat】servlet原理及其生命周期

1.什么是servlet&#xff1f; Servlet&#xff08;Servlet Applet&#xff09;&#xff0c;全稱Java Servlet,是用Java編寫的服務器端程序。而這些Servlet都要實現Servlet這個接口。其主要功能在于交互式的瀏覽和修改數據&#xff0c;生成動態Web內容。Servlet運行于支持Java的…

實現一個監控 IP 的 windows 服務

實現一個監控 IP 的 windows 服務Intro我們公司的 VPN 用自己的電腦連公司的臺式機的時候需要用 IP 地址&#xff0c;有一次嘗試去連的時候發現連不上&#xff0c;第二天到公司發現 IP 變掉了&#xff0c;不是之前連的 IP 了&#xff0c;于是就想寫一個簡單 Windows 服務來監控…

微信企業號開發:啟用回調模式

微信企業號開發怎樣啟用回調模式&#xff1f;就是簡單的登陸PC版微信&#xff0c;點擊應用中心&#xff0c;選擇須要應用&#xff0c;再點擊回調模式啟用&#xff1f;似乎不是這么簡單。&#xff01;能夠看到核心的僅僅有三個URL。Token&#xff0c;EncodingAESKey這三個參數能…

MVC中提交表單的4種方式

一&#xff0c;MVC HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttributes){} BeginRouteForm 方法 (HtmlHelper, String, Object, FormMethod) 二&#xff0c;傳統Form表單Aciton屬性提交 三&#xff0c;JqueryAjax 提交表單 四&#xff0c;MVC C…

photoshop制作網站圓形圖標ico

1、選擇左側工具欄中的橢圓工具2、鼠標直接在圖片上選擇區域3、在圖片上鼠標右鍵建立選區&#xff0c;在彈出的對話框直接點確定變成這樣&#xff1a;4、點擊選擇&#xff0c;然后點擊反選變成這樣5、圖層欄&#xff0c;在圖片上右鍵復制圖層&#xff0c;彈出對話框直接確定即可…

《簡明 PHP 教程》00 開篇

《簡明 PHP 教程》是一本旨在介紹如何使用 PHP 語言進行編程的自由圖書。它以教材與指南的形式為入門者介紹 PHP 編程語言。如果你對電腦知識的了解僅限于如何保存文本文件的話&#xff0c;那這本書就是為你準備的。 本博客后續將以連載的方式為讀者呈現這本書。 關于作者 一名…

WPF 窗體設置亞克力效果

WPF 窗體設置亞克力效果控件名&#xff1a;WindowAcrylicBlur作者&#xff1a; WPFDevelopersOrg - 吳鋒原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。項目使用 MIT 開源許可協議。WindowAcrylicB…