samayo/autolog

一个简单的PHP日志库

0.1.3 2017-09-18 08:24 UTC

This package is auto-updated.

Last update: 2024-09-17 13:37:20 UTC


README

一个PHP类,用于从您的应用程序或从 /var/log/ 记录/保存/发送错误/通知。

安装

使用git

$ git clone https://github.com/samayo/autolog.git

使用composer

$ composer require samayo/autolog

用法

简例。

快速发送用户活动日志的电子邮件

require __DIR__ . "/src/Logger.php"; 

$log = new Autolog\Logger(["email" => "user@domain.tld"]);

if($comment){
   $log->log("$user just commented \n $comment", $log::INFO, $log::EMAIL); 	
}

$log->log() 方法接受4个参数,但只需要第一个参数 $msg

/**
 * $msg (required) the actual content to send/log
 * $type (optional) the message type: error, info, notification..
 * $handler (optional) where to send it (db, email, file log)
 * $verbosity (optional) log as simple or verbose info
 */
log($msg, $type, $handler, $verbosity);

可用的日志类型、处理器和详细程度

$type::INFO; // for simple tasks
$type::ERROR; // for errors ex: 404 .. 
$type::ALERT; // for fatal errors or suspicious activity

$handler::EMAIL; // send to email
$handler::FILE; // write to file
$handler::DATABASE; // insert to database 
$handler::SMS; // send to sms (not yet implemented)

$verbosity::SIMPLE; // send simplified log
$verbosity::VERBOSE; // send every log information

// the below will log an error, in verbose format and mail it
$log = new Autolog\Logger(["email" => "user@domain.tld"]);
$log->log($msg, $log::ERROR, $log::EMAIL, $log::VERBOSE);

仅传递第一个参数: $log->log($msg),日志将被视为 ERROREMAILVERBOSE

示例

发送日志到您的电子邮件

$log = new Autolog\Logger; 
$log["email"] = "user@domain.tld"; // add email

// or add your email list this: 
$log = new Autolog\Logger(["email" => "user@domain.tld"]); 

// then log it!
if($something){
   $log->log("something"); // email 'something'
}

记录到文件

要记录到文件,需要传递一个可写的文件到 error.log

$log = new Autolog\Logger(["error.log" => __DIR__ . "/mylogs.txt"]); 
$log->log("ERROR: $error", $log::INFO, $log::FILE); // don't forget $log::FILE

插入到数据库

要将日志存储在数据库中,创建一个具有以下模式的数据库

--- database name can be anything, but table and columns should be as seen below
CREATE DATABASE IF NOT EXISTS autolog;  
USE autolog;
CREATE TABLE `logs` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `time` DATETIME DEFAULT NULL,
  `subject` VARCHAR(255) DEFAULT NULL,
  `level` VARCHAR(50) DEFAULT NULL,
  `message` TEXT,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4

然后调用 pdo() PDO 对象后记录您的信息/错误

$log = new Autolog\Logger;
$log->pdo(new \PDO(
   // your pdo host, db, pass here
)); 
$log->log("simple log", $log::ERROR, $log::DATABASE);

方法链

您甚至可以快速链接方法,例如

(new \Autolog\Logger)
   ->pdo(new PDO(/**/))->log("user: $user modified his/her profile", $log::INFO, $log::DATABASE); 

处理异常/错误

要记录所有的异常/错误,请使用下面的示例

$logger = Autolog\Logger(["email" => "user@example.com"]); 

// mail all thrown exceptions
set_exception_handler(function($e) use($logger){
   $logger->log($e, $log::ERROR, $log::EMAIL);
}); 

// mail all errors
set_error_handler(function($no, $str, $file, $line) use ($logger){
   $logger->log("Your site has error: $str in file $file at line $line", $log::ERROR, $log::EMAIL);
})

Autologs (通过cronjob)

要自动检测日志文件更改和日志消息,请使用 watch() 方法。

// always watch new errors that appear in (nginx, php) log files
$log->watch(true);

要监视新的日志并接收通知,请将 watch() 方法放置在其自己的文件中,例如: log_mailer.php

// log_mailer.php
require __DIR__ . "/src/Logger.php";
(new Autolog\Logger([
  "nginx.log"  => "/var/log/nginx/error.log",
  "php-fpm.log"  => "/var/log/php-fpm/error.log",
  "mariadb.log" => "/var/log/mariadb/mariadb.log",
  "access.log"  => "access.txt",
  "email"  => "user@example.com"
]))->watch(true); 

现在,您可以设置一个cronjob,每分钟/每小时执行上述脚本,那么每次在 /var/log/... 中记录新错误时,您都会收到一封新邮件。

重要的是要给 access.log 一个文件,其中包含最后一次访问的时间,如:nginx.log。这是因为为了检测新的错误,我们必须存储我们检查nginx.log的最后时间戳。所以,如果nginx文件的时间戳与我们存储的不相同,这意味着找到了新的日志。

许可证:MIT