PHP滚动日志的代码实现

 PHP滚动日志类库

PHP记录日志,我之前接触过的有按照年月分文件夹,然后按照日分文件的日志记录方式,这种方式有利有弊,有他的使用场景,我今天要说的是另一种日志记录方式——文件滚动方式记录日志,当然了,这种滚动机制也可以加在前面那种日志记录方式中。

如何让日志滚动起来

滚动日志,顾名思义,记录一个模块的日志用一系列的日志文件,同一模块文件个数有限制,最多maxNum个,大小也有限制,最大maxSize字节,文件名有一定的命名方式,比如:testlog.log、testlog_1.log,testlog_2.log、、、、、、其中testlog.log是正在使用的日志文件,当testlog.log文件大小到达限制maxSize的时候就会向后滚动日志文件,就像下面这样:

 

 代码如下:

testlog_2.log -> testlog_3.log
testlog_1.log -> testlog_2.log
testlog.log -> testlog_1.log
testlog.log #0kb

 

当日志文件个数到达限制maxNum的时候就会启动淘汰机制,删除最老的日志,比如说maxNum设置为10,这个时候算上testlog.log一共最多有10个文件,当滚动的时候如果存在testlog_9.log就会从testlog_8.log开始滚动,覆盖掉testlog_9.log,这样就可以保证日志正常记录,而且不会出现很大很大的日志文件,保证日志系统的正常运行。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

<?php
final class LOGS {
private $level;
private $maxFileNum;
private $maxFileSize;
private $logPath;
private $file;
 
//日志的级别DEBUG,MSG,ERR
const LOGS_DEBUG = 0;
const LOGS_MSG = 1;
const LOGS_ERR = 2;
 
private static $instance = null;
 
private function __construct(){}
 
public static function getInstance()
{
if(self::$instance == null)
{
self::$instance = new self();
}
return self::$instance;
}
 
/**
* @Desc 初始化
* @Param $level int 记录级别
* @Param $maxNum int 最大日志文件数目
* @Param $maxSize int 最大日志文件大小
* @Param $logPath string 日志文件保存路径
* @Param $file string 日志文件名称前缀
* @Return boolean
*/
public function init($level, $maxNum, $maxSize, $logPath, $file)
{
$level = intval($level);
$maxNum = intval($maxNum);
$maxSize = intval($maxSize);
!is_dir($logPath) && mkdir($logPath, 0777, true);
if(!in_array($level, array(self::LOGS_DEBUG, self::LOGS_MSG, self::LOGS_ERR)) || $maxNum <= 0 || $maxSize <= 0 || !is_dir($logPath))
{
return false;
}
$this->level = $level;
$this->maxFileNum = $maxNum;
$this->maxFileSize = $maxSize;
$this->logPath = $logPath;
$this->file = $file;
return true;
}
 
/**
* @Desc 获取格式化时间串
*/
public function formatTime()
{
$ustime = explode ( " ", microtime () );
return "[" . date('Y-m-d H:i:s', time()) .".". ($ustime[0] * 1000) . "]";
}
 
/**
* @Desc 滚动方式记录日志文件
*/
public function log($str)
{
$path = $this->logPath.DIRECTORY_SEPARATOR.$this->file.".log";
clearstatcache();
if(file_exists($path))
{
if(filesize($path) >= $this->maxFileSize)
{
$index = 1;
//获取最大的滚动日志数目
for(;$index < $this->maxFileNum; $index++)
{
if(!file_exists($this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log"))
{
break;
}
}
//已经存在maxFileNum个日志文件了
if($index == $this->maxFileNum)
{
$index--;
}
//滚动日志
for(;$index > 1; $index--)
{
$new = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log";
$old = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".($index - 1).".log";
rename($old, $new);
}
 
$newFile = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_1.log";
rename($path, $newFile);
}
}
$fp = fopen($path, "a+b");
fwrite($fp, $str, strlen($str));
fclose($fp);
return true;
}
 
/**
* @Desc 记录调试信息
* @Param string 日志信息
* @Param string 日志所在文件
* @Param string 日志所在行
*/
public function debug($msg, $file, $line)
{
if($this->level <= self::LOGS_DEBUG)
{
$this->log($this->formatTime()."[{$file}:{$line}]DEBUG: ${msg}n");
}
}
 
/**
* @Desc 记录信息
* @Param string 日志信息
* @Param string 日志所在文件
* @Param string 日志所在行
*/
public function msg($msg, $file, $line)
{
if($this->level <= self::LOGS_MSG)
{
$this->log($this->formatTime()."[{$file}:{$line}]MSG: ${msg}n");
}
}
 
/**
* @Desc 记录错误信息
* @Param string 日志信息
* @Param string 日志所在文件
* @Param string 日志所在行
*/
public function err($msg, $file, $line)
{
if($this->level <= self::LOGS_ERR)
{
$this->log($this->formatTime()."[{$file}:{$line}]ERR: ${msg}n");
}
}
}

看个例子

#例子中设置记录级别为msg(此时debug信息是不会纪录的),日志文件个数为5,大小为200个字节(测试方便),文件名称为testlog

1
2
3
4
5

$logs = LOGS::getInstance();
$logs->init(1, 5, 200, "./", 'testlog');
 
$logs->msg("YRT", __FILE__, __LINE__);
$logs->debug("YRT", __FILE__, __LINE__);

当我们不停的运行这个例子的时候,会在代码所在文件夹下生成5个文件就像下面这样:

1
2
3
4
5

testlog_4.log
testlog_3.log
testlog_2.log
testlog_1.log
testlog.log #最新的日志在这个文件中

时间: 2025-01-04 23:22:41

PHP滚动日志的代码实现的相关文章

PHP滚动日志的代码实现_php技巧

PHP滚动日志类库 PHP记录日志,我之前接触过的有按照年月分文件夹,然后按照日分文件的日志记录方式,这种方式有利有弊,有他的使用场景,我今天要说的是另一种日志记录方式--文件滚动方式记录日志,当然了,这种滚动机制也可以加在前面那种日志记录方式中. 如何让日志滚动起来 滚动日志,顾名思义,记录一个模块的日志用一系列的日志文件,同一模块文件个数有限制,最多maxNum个,大小也有限制,最大maxSize字节,文件名有一定的命名方式,比如:testlog.log.testlog_1.log,test

javascript跟随滚动效果插件代码(javascript Follow Plugin)

这篇文章介绍了javascript跟随滚动效果插件代码(javascript Follow Plugin),有需要的朋友可以参考一下   Js 跟随滚动效果插件 支持定义多个跟随ID,采用css fixed属性,不支持ie6,兼容其他主流浏览器. 支持定义滚动到底部的最小高度,不会覆盖底部 页面大小resize后,插件会自动重置参数 ======= Js 跟随滚动效果插件 1.支持定义多个跟随ID,采用css fixed属性,不支持ie6,兼容其他主流浏览器. 2.支持定义滚动到底部的最小高度,

求java 实现滚动截屏代码

问题描述 求java 实现滚动截屏代码 找一个使用java对浏览器进行滚动截屏的方法,可我收了好久也没找到合适的方法,望高人指点 解决方案 Java截屏代码java截屏代码截屏代码(java) 解决方案二: 滚动截屏是什么意思?截取显示不出来的页面部分?

jquery 图片滚动切换效果代码

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.111cn.net/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="conte

急需显示我的日志,添加日志和删除日志的代码

问题描述 我在做日志记事本,我想问哈怎么显示我的日志.添加日志,还有删除日志的代码...我想实现象qq空间里那样的功能.点击我的日志然后就在textbox中显示日志的时间,名称,如果再点击日志名称则显示日志内容.如果点击添加日志则显示日志的标题,时间.及内容框等.点击删除日志时则删除点击的日志....急急...谢谢哈 解决方案 解决方案二:楼主,你问的这个问题并不难,但是你没有说清楚很多问题你的日志打算保存在那里?文本文件orXML文件or数据库?结构是如何的?不了解这些我写出来的未必是你想要的

基于JS实现无缝滚动思路及代码分享_javascript技巧

原理: 1.给ul一个绝对定位使其脱离文档流,left设置为0,把图片塞进ul里,编写一个"移动"函数,函数功能能够使ul的left以一个正速度向右跑动, 2.设置一个定时器,让"移动"函数每30(参数可变)毫秒执行一次 3.因为ul的长度会"跑"完,此时可以使ul的content也就是img增加一倍, oUl.innerHTML +=oUl.innerHTML; 4.此时因为ul的content增加,其width也会随着增大,根据实际项目展示图

关于网页中的无缝滚动的js代码_javascript技巧

随便打开一个网页,基本上都会看到无缝滚动或者轮播图,比如淘宝还有360官网的首页 观察这些轮播图可以发现图片可以来回循环地切换,那么是怎样做到的呢? 做到轮播图或者说无缝滚动主要有两种方式,一种是通过对图片的明暗即透明图的改变来显示或隐藏图片,另一种是通过运动框架,将图片显示在可视区域.这两种方式都会用到同一个东西,那就是定时器. JavaScript中的定时器有两种,1.setInterval();2.setTimeout();相对应的关闭定时器也有两种方法,clearInterval()和c

DIV随滚动条滚动而滚动的实现代码【推荐】_jquery

记得以前写这样的代码比较麻烦,现在有了JQuery简单多了,就几行代码搞定! <script type="text/javascript" src="Js/jquery-1.7.2.min.js"></script> <script type="text/javascript"> $(function() { $(window).scroll(function() { var top = $(window).s

Global.asax的Application_Error实现错误记录/错误日志的代码_实用技巧

利用Global.asax的Application_Error实现错误记录 错误日志 复制代码 代码如下: void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 Exception ex = Server.GetLastError().GetBaseException(); StringBuilder str = new StringBuilder(); str.Append("\r\n" + D