咱们有时需要记录用户或后端的某个操作事件的运行状况,能够运用后端语言如PHP将操作结果记录到日志文件中,方便测试和查询问题。尤其是这些在后端运行的而前端不可直接看到运行结果的,那样就能够用日志文件记录下来,倘若你经常跟有些接口研发如支付宝接口、微X卡券接口打交道的话,日志记录就必不可少了。
咱们讲的PHP记录日志,便是将日志信息写入到一个日志文件中,区别于内存日志。写入日志的流程是:打开日志文件(倘若不存在则新创建),而后将日志内容追加到日志文件的后面,最后关闭日志文件。
本文中,咱们将日志内容以json个格式保留,方便必要时直接读取。 PHP写日志文件PHP写日志文件需要打开、写入和关闭文件等操作,PHP有fopen(),fwrite()和fclose()三个函数与之对应,而另一个函数
file_put_contents()它亦能字符串写入文件,其实这个函数实现了依次调用 fopen(),fwrite() 以及
fclose()。因此咱们运用file_put_contents()非常简洁。值得重视的是,往文件后面追加内容时需要带上参
数:FILE_APPEND。
实质运行中,咱们有可能会遇到日志文件超大的状况,因此咱们设置一个最大值,当日志文件体积超过这个最大值时,将此日志文件备份好,而后重新生成一个新的日志文件来记录新的日志内容。
在写日志前,咱们将日志内容进行json格式化,因此需要将内容转化成JSON格式,而后写入文件。当然你亦能够不消json,或换作别的工具程序(如日志分析工具)能够阅读的格式。总之,咱们写入的内容是方便必要时能够方便读取。
function writeLog($filename,$msg){
$res = array();
$res[msg] = $msg;
$res[logtime] = date("Y-m-d H:i:s",time());
//倘若日志文件超过了指定体积则备份日志文件
if(file_exists($filename) && (abs(filesize($filename)) > 1024000)){
$newfilename = dirname($filename)./.time().-.basename($filename);
rename($filename, $newfilename);
}
//倘若是新建的日志文件,去掉内容中的第1个字符逗号
if(file_exists($filename) && abs(filesize($filename))>0){
$content = ",".json_encode($res);
}else{
$content = json_encode($res);
}
//往日志文件内容后面追加日志内容
file_put_contents($filename, $content, FILE_APPEND); }PHP读日志文件必要时,咱们会读取日志内容进行分析,一样咱们运用PHP的file_get_contents()函数,直接将内容读取,并且转换成json格式,方便调用。
function readLog($filename){
if(file_exists($filename)){
$content = file_get_contents($filename);
$json = json_decode([.$content.],true);
}else{
$json = {"msg":"The file does not exist."};
}
return $json; }日志写入和读取类写入和读取日志的功能咱们经常要用到,因此我将写入和读取功能整理成类,方便调用。
/*
* 日志类
* 每日生成一个日志文件,当文件超过指定体积则备份日志文件并重新生成新的日志文件
*/
class Log {
private $maxsize = 1024000; //最大文件体积1M
//写入日志
public function writeLog($filename,$msg){
$res = array();
$res[msg] = $msg;
$res[logtime] = date("Y-m-d H:i:s",time());
//倘若日志文件超过了指定体积则备份日志文件
if(file_exists($filename) && (abs(filesize($filename)) > $this->maxsize)){
$newfilename = dirname($filename)./.time().-.basename($filename);
rename($filename, $newfilename);
}
//倘若是新建的日志文件,去掉内容中的第1个字符逗号
if(file_exists($filename) && abs(filesize($filename))>0){
$content = ",".json_encode($res);
}else{
$content = json_encode($res);
}
//往日志文件内容后面追加日志内容
file_put_contents($filename, $content, FILE_APPEND);
}
//读取日志
public function readLog($filename){
if(file_exists($filename)){
$content = file_get_contents($filename);
$json = json_decode([.$content.],true);
}else{
$json = {"msg":"The file does not exist."};
}
return $json;
}
} ?>
运用办法: $filename = "logs/log_".date("Ymd",time()).".txt"
; $msg = 写入了日志
; $Log = new Log(); //实例化$Log->writeLog($filename,$msg); //写入日志$loglist = $Log->readLog($filename); //读取日志
|