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.mzph.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;这…

什么样的代码称得上是好代码?

“软件自有其美感所在” --《重构》图片&#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…

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;弹出对话框直接确定即可…

WPF 窗体设置亚克力效果

WPF 窗体设置亚克力效果控件名&#xff1a;WindowAcrylicBlur作者&#xff1a; WPFDevelopersOrg - 吴锋原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议。WindowAcrylicB…

数据分块加载——BigPipe 技术【类似facebook】

一、原理 分块加载&#xff0c;加载完一块&#xff0c;就先把页面数据刷给用户&#xff0c;再加载下面的&#xff0c;直到加载完毕二、基础需知&#xff1a;三、服务端和php的相应配置 如果想实现分块加载【bigpipe技术】&#xff0c;还需要对nginx.conf 和 php.ini 进行相应配…

右键一下,哇塞!

面向 Dev 频道的 Windows 预览体验成员微软推送了 Windows 11 预览版Insider Preview Build 25211主要变化1.微软改进了 Windows 11 小组件面板&#xff0c;小组件面板中的添加按钮更加醒目&#xff0c;点击用户头像将打开小组件设置。Windows 11 小组件由 Microsoft Edge 浏览…

前端学习 -- Css -- 内联元素的盒模型

内联元素不能设置width和height&#xff1b;设置水平内边距,内联元素可以设置水平方向的内边距&#xff1a;padding-left&#xff0c;padding-right&#xff1b;垂直方向内边距&#xff0c;内联元素可以设置垂直方向内边距&#xff0c;但是不会影响页面的布局&#xff1b;为元素…