php文件日志类,按年月日组织目录结构。

<?php

class FileLog
{
private $_filepath; //文件路径
private $_filename; //日志文件名
private $_filehandle; //文件句柄 function __construct($fileName = 'log')
{
date_default_timezone_set('PRC');
$this->_filename = $fileName;
$this->init();
} /*
* 构造函数调用,初始化文件保存路径,文件名
*/
function init()
{
//如果有定义LOG_PATH常量,日志记录在LOG_PATH下,如果没有定义记录在当前目录 的logs
$this->_filepath = defined('LOG_PATH') ? LOG_PATH : './logs';
$this->_filepath = rtrim($this->_filepath, '/');
$this->_filepath .= '/' . date('y', time()) . '/' . date('m', time());
if (!is_dir($this->_filepath)) {
mkdir($this->_filepath, 0777, true);
}
if (!is_dir($this->_filepath)) {
//如果目录创建失败直接返回
$this->_filehandle = null;
return;
}
//拼接完整的文件名
$pathinfo = pathinfo($this->_filename);
$extension = isset($pathinfo['extension']) ? $pathinfo['extension'] : '';//取文件的扩展名
$this->_filename = $this->_filepath . '/' . $pathinfo['filename'] . '_' . date('d', time());
$this->_filename .= empty($extension) ? '.log' : '.' . $extension;
//打开文件
$this->_filehandle = fopen($this->_filename, "a+");
} /**
*作用:初始化记录类,写入记录
*输入:要写入的记录,可以是数组
*输出:写入成功返回true失败返回false
*/
public function addLog($log)
{
if (empty($this->_filehandle))
return false;
$strLog = '';
$strLog .= date("Y-m-d H:i:s") . ' ' . $this->_getUrl() . "\r\n";
$strLog .= "POST: " . $this->_postData() . "\r\n";
if (is_array($log)) {
$strLog .= $this->array2string($log);
} else {
$strLog .= $log . "\r\n";
}
$strLog .= "\r\n"; //写日志
fwrite($this->_filehandle, $strLog) !== false;
} function array2string($data)
{
$log_a = "";
foreach ($data as $key => $value) {
if (is_array($value)) $log_a .= "[" . $key . "] => (" . $this->array2string($value) . ") \r\n";
else $log_a .= "[" . $key . "] => " . $value . "\r\n";
}
return $log_a;
} /**
*作用:获取完整URL路径
*输入:完整URL路径
*输出:URL路径字串
*/
private function _getUrl()
{
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost');
return 'http' . (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 's' : '')
. '://'
. $host
. $_SERVER['REQUEST_URI'];
} /**
*作用:获取POST数据
*输入:POST数据
*输出:POST数组
*/
private function _postData()
{
$strPost = '';
if (isset($_POST) && count($_POST) > 0) {
foreach ($_POST as $key => $val) {
$strPost .= $key . '=' . $val . '&';
}
}
$strPost=trim($strPost,'&');
return $strPost;
} /**
*功能: 析构函数,释放文件句柄
*输入: 无
*输出: 无
*/
function __destruct()
{
//关闭文件
if (!empty($this->_filehandle))
fclose($this->_filehandle);
}
} ?>

php 文件日志类的更多相关文章

  1. 【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待

     [等待事件]等待事件系列(3+4)--System IO(控制文件)+日志类等待   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可 ...

  2. [C#] 日志类

    在程序发布到服务器上的时候,不能在像本地执行一样可以调试,在发生错误时候,往往不能很方便的查找错误.将错误信息写入文件是一种比较常用的处理方法.以下是一个日志类,实现以下功能: 1)按日期每天生产不同 ...

  3. android Loger日志类(获取内置sd卡)

    Android手机自带内部存储路径的获取 原文地址:http://my.oschina.net/liucundong/blog/288183 直接贴代码: public static String g ...

  4. 【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据

    很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心 ...

  5. 自己编写的 C++ 超轻量级日志类

    [自己编写的 C++ 超轻量级日志类(兼容vc++6.0.vs2010.vs2015)] 先来看效果: [测试文件:test.cpp] /* 作者:闫文山 时间:2017/07/02 介绍: 本日志类 ...

  6. C++ IO操作API及注意事项(包含一个日志类的实现)

    C++是一个抽象程度比C高很多的语言,在使用C++时,编译器做了很多工作,如果我们不对C++的某些特性的实现机制进行了解,那么编程时也许会有很多疑惑,我们也许知道怎样做才是正确的,但不知道为什么要这样 ...

  7. python3 配置logging日志类

    配置类config_file: from configparser import ConfigParser class config_file: def __init__(self,conf_file ...

  8. Python3自定义日志类教程

    一.说明 Python3的logging功能是比较丰富的支持不同层次的日志输出,但或是我们想在日志前输出时间.或是我们想要将日志输入到文件,我们还是想要自定义日志类. 之前自己也尝试写过但感觉文档太乱 ...

  9. python3+selenium框架设计03-封装日志类

    首先我们先来实现日志的功能,日志可以使用python3自带logging模块,不会的可以百度一下相关文章,也可以看我另外一篇文章Python3学习笔记24-logging模块 在封装日志类前,我们需要 ...

随机推荐

  1. 如何让自己的app尽量不被系统杀死

    1. 在Service中重写下面的方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重写创建 @Override public int onStartComman ...

  2. Android 双击 Back 键退出程序

    双击退出程序的原理无非就是设置一个退出标识(询问是否退出),如果改变了这个标识(确认退出),则再次点击时立马退出,如果短时间内没有退出,则延时重置这个标识(不退出). ================ ...

  3. sqlserver中判断表或临时表是否存在

    转自:http://www.cnblogs.com/yugen/archive/2010/07/25/1784749.html 1.判断数据表是否存在 方法一: use yourdb;go if ob ...

  4. div自定义下拉框

    因为原生的下拉框不能修改其属性,很难美化下拉框. 所以自己用div简单自定义了一下下拉框,想美化直接修改css即可 <!DOCTYPE html> <html lang=" ...

  5. 昨天开发引入的两个错误--Parcelable

    以下的代码有两处明显的错误,一不小心就会写出如下错误的代码,其中第2个问题调试起来很麻烦: 1 public class AddedBannerInfo implements Parcelable { ...

  6. NSString相关操作

    //创建一个字符串对象 NSString * str_1 = @"Hello"; //字面量方法 ; NSString * str_2 = [NSString stringWith ...

  7. poj1703_Find them, Catch them_并查集

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42451   Accepted: ...

  8. JavaScript高级程序设计学习笔记--高级技巧

    惰性载入函数 因为浏览器之间行为的差异,多数JavaScript代码包含了大量的if语句,将执行引导到正确的代码中,看看下面来自上一章的createXHR()函数. function createXH ...

  9. 基于命令行编译打包phonegap for android应用 分类: Android Phonegap 2015-05-10 10:33 73人阅读 评论(0) 收藏

    也许你习惯了使用Eclipse编译和打包Android应用.不过,对于使用html5+js开发的phonegap应用,本文建议你抛弃Eclipse,改为使用命令行模式,绝对的快速和方便. 一直以来,E ...

  10. VS2012无法打开文件“kernel32.lib”问题的解决办法

    后来经过百度搜索发现解决办法: 1.在项目属性[VC++目录]下的 [包含目录] 添加 $(WindowsSDK_IncludePath) ,在[库目录]添加$(WindowsSDK_LibraryP ...