首页 > 编程语言 >PHP文件日志记录

PHP文件日志记录

时间:2022-11-25 12:03:49浏览次数:43  
标签:function 记录 file threshold path 日志 PHP public


<?php

/**
* @notes: Logging
* @auther: Bin Shi
* @dateTime: 2020/05/13 17:44
*/
class Logging {

/**
* 进程唯一ID
*
* @var string
*/
private $uniqid = null;

/**
* 日志根路径
*
* @var string
*/
private $path = '';

/**
* 日志缓冲区
*
* @var array
*/
private $logs = array();

/**
* 日志缓冲数量阈值
*
* @var int
*/
private $threshold = 100;

/**
* 日志缓冲时间间隔(单位:秒)
*
* @var int
*/
private $interval = 600;

/**
* 把日志缓冲区里的日志写入文件的时间(Unix 时间戳)
*
* @var int
*/
private $dumpTime = 0;

/**
* 自动清理多久以前的日志文件(单位:秒) 30天自动清理
*
* @var int
*/
private $cleanCycle = 2592000;
private static $instance;

/**
* 单例模式
*
* @return self
*/
public static function getInstance() {
if (!self::$instance instanceof self) {
self::$instance = new self();
}
return self::$instance;
}

public function __construct() {
$this->uniqid = uniqid();
$this->path = rtrim('/root/project/', '/');
if (!is_dir($this->path)) {
@mkdir($this->path, 0777, true);
}
}

public function __destruct() {
$this->dump();
}

/**
* 获取日志缓冲数量阈值
*
* @return int 日志缓冲数量阈值
*/
public function getThreshold() {
return $this->threshold;
}

/**
* 设置日志缓冲数量阈值
*
* @param int $threshold
*/
public function setThreshold($threshold) {
$this->threshold = $threshold;
}

/**
* 获取自动清理多久以前的日志文件(单位:秒)
*
* @return int 自动清理多久以前的日志文件(单位:秒)
*/
public function getCleanCycle() {
return $this->cleanCycle;
}

/**
* 设置自动清理多久以前的日志文件(单位:秒)
*
* @param int $cleanCycle
*/
public function setCleanCycle($cleanCycle) {
$this->cleanCycle = $cleanCycle;
}

/**
* 写入日志
*
* @param mixed $message 日志消息
* @param string $module 日志模块目录,默认为 default
* @param string $level 日志级别,包括:
* - debug:调试日志
* - info: 信息日志(默认)
* - notice: 通知日志
* - warning: 警告日志
* - error: 错误日志
* - emergency: 紧急日志
*/
public function log($message, $module = 'default', $level = 'info') {
if (!is_string($message)) {
$message = print_r($message, true);
}
list($msec, $sec) = explode(" ", microtime());
$str = date("Y-m-d H:i:s", $sec) . '.' . sprintf('%04d', round($msec * 10000)) . ' | ' . $this->uniqid . ' | ' . $level . ' | ' . $message . PHP_EOL;
$file = $this->path . '/' . $module . '/' . date("Y-m-d") . '.log';
$this->logs[] = array('str' => $str, 'file' => $file);
if (count($this->logs) >= $this->threshold || $this->dumpTime < time() - $this->interval) {
$this->dump();
}
}

/**
* 把日志缓冲区里的日志写入文件
*
* 备注:一般不需要手动调用,系统会在日志数量达到日志缓冲阈值时自动执行,也会在此对象被销毁时自动执行。
*/
public function dump() {
$logs = array_splice($this->logs, 0, count($this->logs));
$threshold = $this->threshold;
list($msec, $sec) = explode(" ", microtime());
$datas = array();
$paths = array();
// 把写入同一个日志文件的数据拼接起来,方便后续一次写入,减少IO操作
while (count($logs)) {
$log = array_shift($logs);
$str = $log['str'];
$file = $log['file'];
$path = dirname($file);
if (!file_exists($path)) {
@mkdir($path, 0777, true);
}
if (!isset($datas[$file])) {
$datas[$file] = array();
}
$datas[$file][] = $str;
$paths[$path] = $path;
}
// 输出日志到文件
$prefix = date("Y-m-d H:i:s", $sec) . '.' . sprintf('%04d', round($msec * 10000)) . ' | ' . $this->uniqid;
foreach ($datas as $file => $strs) {
$str = $prefix . ' | 日志写入文件 | ' . $threshold . ' | ' . sprintf('%0' . strlen($threshold) . 'd', count($strs)) . ' | ' . $file . PHP_EOL . implode('', $strs);
// 在写入时获得一个独占锁,,防止多进程同时写入造成内容丢失。
file_put_contents($file, $str, FILE_APPEND | LOCK_EX);
}
// 自动清理以前的日志文件
foreach ($paths as $path) {
foreach (glob($path . '/*.*') as $fn) {
if (is_file($fn) && @filemtime($fn) < $sec - $this->cleanCycle) {
@unlink($fn);
}
}
}
$this->dumpTime = $sec;
}

}

标签:function,记录,file,threshold,path,日志,PHP,public
From: https://blog.51cto.com/u_13940603/5886222

相关文章

  • iTOP-IMX8M开发板Yocto系统使用 Gstarwmr-agstreamer日志级别设置
    gst的日志等级分为none(0)error(1)warning(2)info(3)debug(4)log(5)。默认gst的日志等级为1,即error打印,出错时会打印。1)全局日志级别设置如果需要更高级别打印,......
  • 【Hibernate框架开发之三】搭建Hibernate日志(slf4j转log4j)环境并搭建Junit单元测试
    本站文章均为​​ 李华明Himi ​​​原创,转载务必在明显处注明由于最新写cocos2dx动作编辑器的解析和框架所以没更新,那么从今天开始继续来学习Hibernate,那么接着第二篇文......
  • 安装php环境
    环境:192.168.11.20PHP(主机名)PHP节点关闭防火墙配置好yum源用centos7.5-1804(1)安装配置基础服务[[email protected]]#yuminstall-ygccgcc-c++libxml2-......
  • 【Mysql】 linux | mysql | 配置日志路径 | 关闭binlog
    一、说明        1、linux环境       2、操作数据库,一定要慎重;尤其是涉及到配置,搞不好数据就丢了,备份,备份,备份。二、日常维护1、配置错误日志路径1)mysql重......
  • 安装php7.2
    #方法一:rpm-Uvhhttps://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmrpm-Uvhhttps://mirror.webtatic.com/yum/el7/webtatic-release.rpm#......
  • nginx过滤access_log中HEAD、OPTIONS请求记录
    网上很多教程说是这样做:if($request_method=HEAD){access_logoff;}试了之后是不行的,正确的做法如下:http{map$request_method$loggable{......
  • Nginx在日志中输出代码文件名和行号
    Nginx源码版本是1.22.1 error.log函数:ngx_log_error_core对应日志前半部分对应日志后半部分输出日志时打印文件名和行号效果......
  • 聊一聊如何截获 C# 程序产生的日志
    一:背景1.讲故事前段时间分析了一个dump,一顿操作之后,我希望用外力来阻止程序内部对某一个com组件的调用,对,就是想借助外力实现,如果用windbg的话,可以说非常轻松,但现实情况......
  • php危险函数
    php危险函数可以执行linux系统命令,如果没有禁用相关函数,也没有对函数使用的参数进行严格有效的过滤,可能产生命令执行漏洞。1.eval()函数eval()函数把字符串按照PHP代......
  • LeetCode刷题记录.Day24
    有效的括号20.有效的括号-力扣(LeetCode)classSolution{public:boolisValid(strings){if(s.size()%2!=0)returnfalse;//奇数必不符合......