php 文件日志类

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

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
<?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);
    }
}
 
?>

 

posted @   male110  阅读(477)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示