创建服务器日志


Create server log

我在一个相当大的网站上工作,我需要记录用户在使用网站时可能面临的错误。

以下是它的工作方式:

>if operation passed
     #operation success
>else
     #Log the failure

log()

>email admin
>create log

我需要知道的是创建这个日志的最佳实践,因为有几种方法可以做到这一点。

text based
database

可能还有更好的方法可以做到这一点,这就是为什么我要问堆栈溢出。

只要告诉我你会怎么做,我会自己做剩下的研究和编码。

我发现使用像airbrake.io或pagerduty.com这样的第三方服务是最好的。基本上,他们负责创建一张罚单,记录所有内容,并将事件通知相关人员。是的,你可以通过给管理员发电子邮件和创建自己的日志,按照你提到的方式编写自己的系统。。。但你也必须担心更新电子邮件列表和在正确的时间给正确的人发电子邮件。。。如果你在度假呢?届时谁将收到电子邮件?第三方服务为您管理所有这些。

您可以使用(可能也应该使用)针对您所使用的语言的开源日志记录框架。它们将为您提供满足所有日志记录需求的良好包装,大多数都可以选择通过电子邮件向您发送日志(甚至将文件上传到远程目录)。

如果你想创建自己的日志系统,我个人会这样做:

  • 创建log目录
  • 使用命名方案,每小时(或每天或X个时间单位)创建一个日志文件(纯文本)
  • 在文件中写入1行,先是时间,然后是一些分隔符,然后是错误(包括错误代码/消息等)

每过一个小时或一天,你就会制作一个新文件,并通过电子邮件将前一个文件发送给自己(或管理员)。您还可以针对致命错误/问题立即发送电子邮件。我个人不会真正使用数据库。

我为一个与游戏服务器对话的在线脚本实现了这样一个日志记录系统。最终结果是一个文件目录,其中包含每天每小时的日志。超过30天的文件也会被删除。它让我可以轻松地检查事情的进展情况,并确定游戏服务器上玩家体验到的某些事件/问题。然而,我只写了我自己的日志,因为没有脚本为我的游戏做这件事。

首先,由于在评论中提到了它,我们应该将php错误日志与自定义应用程序日志区分开来:

php错误日志在解释php文件时记录特定级别的错误(注意、错误、警告,具体取决于error_reporting()设置)。这意味着,当您试图使用一个数组键时,该数组键在生成警告并打印到屏幕或记录到php错误日志文件之前没有设置。

另一端的自定义应用程序记录器记录自定义消息,这些消息可能包含有关应用程序逻辑的警告和错误,并且可以由应用程序处理。

当我们比较以下两个代码示例时:

<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', sys_get_temp_dir() . '/php_error.log');
updateUser($_POST['user_id']);
// Assuming $_POST['user_id'] was not set the above lines would produce a notice in your php_error.log stating the use of an undefined index 'user_id'
?>

反对:

// Instantiate your own logger or a 3rd party logger
$myLogger = new Logger(sys_get_temp_dir() . '/application.log');
if (!array_key_exists('user_id', $_POST)) {
    $myLogger->error('Cannot update user since user_id was not set');
    // Handle the error in the UI accordingly
    header('Location: 404.php');
    die();
}
updateUser($_POST['user_id']);
?>

就我个人而言,在不同的日志文件中分离这两种类型的错误是有意义的:php错误通常是由于代码无法处理所有可以想象的情况(即用户手动从表单中删除隐藏的user_id字段),这是对您自己的一个提示,您应该更改代码以避免下次出现相同的错误。第二段代码处理完全相同的用例,但您在编写代码时考虑了这种情况,应用程序能够以某种方式做出反应。

无论您是决定选择第三方日志记录程序还是编写自己的日志记录程序:当您决定从基于文件的日志记录切换到基于数据库的日志记录机制时,请考虑使用一个符合PRS-3日志记录标准的日志记录器,使其可交换。通过这样做,当您决定切换记录器时,您不必更改太多代码,因为方法和一般用法是标准化的。

在编写自己的记录器时,请考虑以下几点:

  • 在写入日志文件时锁定和解锁日志文件
  • 日志轮换(每日、每周、每月)
  • 删除旧日志文件
  • 如上所述,考虑实施PSR-3