不影响正常运行的调试技巧 文件日志

以前习惯用 echo,print_r 等方法来测试php输出,这样多多少少会影响到代码的正常运行,现改成把测试变量输出到文本的形式,可实现日志形式的调试,如接口服务端调试。在生产环境中进行文件日志调试是确保应用程序稳定运行的重要手段。以下是一些关于如何在生产环境中进行文件日志调试的建议:

1. **日志级别设置**:
   - 确保日志级别设置为适当的级别,如`ERROR`、`WARNING`、`INFO`等。在生产环境中,通常建议将日志级别设置为`ERROR`或`WARNING`,以减少日志文件的大小并提高性能。
   - 对于调试目的,可以暂时将日志级别设置为`DEBUG`,但应尽快恢复到生产级别的日志级别。

2. **日志格式**:
   - 使用结构化的日志格式(如JSON)以便于分析和搜索。
   - 包含必要的上下文信息,如时间戳、请求ID、用户ID、错误代码等。

3. **日志文件管理**:
   - 定期轮转日志文件,以避免单个日志文件过大。
   - 使用日志管理工具(如ELK Stack、Splunk等)来集中管理和分析日志。

4. **日志监控**:
   - 设置日志监控,以便在出现问题时能够及时收到通知。
   - 使用监控工具(如Prometheus、Grafana等)来监控日志中的关键指标。

5. **敏感信息保护**:
   - 确保日志中不包含敏感信息,如密码、信用卡号等。
   - 使用日志过滤工具来自动去除敏感信息。

6. **日志调试**:
   - 在代码中添加日志语句,以便在出现问题时能够追踪问题的来源。
   - 使用条件日志记录,只在特定条件下记录日志,以减少日志文件的大小。

7. **性能考虑**:
   - 避免在性能关键路径中记录大量日志,以免影响应用程序性能。
   - 使用异步日志记录来减少对应用程序性能的影响。

8. **日志存储**:
   - 确保日志文件存储在安全的位置,并定期备份。
   - 使用云存储服务(如AWS S3、Google Cloud Storage等)来存储日志文件。

9. **日志分析**:
   - 使用日志分析工具来分析日志数据,以发现潜在的问题。
   - 定期审查日志数据,以确保应用程序的正常运行。

10. **日志清理**:
    - 定期清理旧的日志文件,以释放磁盘空间。
    - 使用日志管理工具来自动清理旧的日志文件。

通过以上措施,可以在生产环境中有效地进行文件日志调试,确保应用程序的稳定性和可靠性。

代码如下:

<?php

class Logger
{
    private $filename;

    public function __construct($filename)
    {
        $this->filename = $filename;
    }

    /**
     * 写文件函数
     * @param string $writeText 要写入的文本字符串
     * @param string $openMod 文本写入模式('w':覆盖重写,'a':文本追加)
     * @return boolean
     */
    private function newWriteFile($writeText, $openMod = 'w')
    {
        if (($fp = fopen($this->filename, $openMod)) === false) {
            error_log("Failed to open file: {$this->filename}");
            return false;
        }

        if (flock($fp, LOCK_EX) === false) {
            error_log("Failed to acquire lock on file: {$this->filename}");
            fclose($fp);
            return false;
        }

        if (fwrite($fp, $writeText) === false) {
            error_log("Failed to write to file: {$this->filename}");
            flock($fp, LOCK_UN);
            fclose($fp);
            return false;
        }

        flock($fp, LOCK_UN);
        fclose($fp);
        return true;
    }

    /**
     * 将“数组”转换成“数组字符串”(方便写入文本)
     * @param array $array 要转换的数组
     * @param int $level 转换级别/深度
     * @return string
     */
    private function newArr2Str($array, $level = 0)
    {
        $space = str_repeat("\t", $level);
        $evaluate = "Array\n$space(\n";
        $comma = $space;

        foreach ($array as $key => $val) {
            $key = is_string($key) ? '\'' . addcslashes($key, '\'\\') . '\'' : $key;
            if (is_array($val)) {
                $evaluate .= "$comma$key => " . $this->newArr2Str($val, $level + 1);
            } else {
                $val = !preg_match("/^\-?\d+$/", $val) || strlen((string)$val) > 12 || substr((string)$val, 0, 1) == '0'
                    ? '\'' . addcslashes($val, '\'\\') . '\''
                    : $val;
                $evaluate .= "$comma$key => $val";
            }
            $comma = ",\n$space";
        }

        $evaluate .= "\n$space)";
        $evaluate .= "\r\n";
        return $evaluate;
    }

    /**
     * 写数组到文件
     * @param array $array 要写入的数组
     * @param string $type 写入类型('w':覆盖重写,'a':文本追加)
     */
    public function writeArr($array, $type = 'a')
    {
        $writeText = "++++++++++++++++" . $this->getCurrentTimeWithMicroseconds() . "++++++++++++++++++\r\n";
        $writeText .= $this->newArr2Str($array);
        $this->newWriteFile($writeText, $type);
    }

    /**
     * 写对象(包括 数字、字符串、数组)到文件
     * @param mixed $writeText 要写入的对象
     * @param string $type 写入类型('w':覆盖重写,'a':文本追加)
     */
    public function write($writeText, $type = 'a')
    {
        $writeText = "++++++++++++++++" . $this->getCurrentTimeWithMicroseconds() . "++++++++++++++++++\r\n" . print_r($writeText, true) . "\r\n";
        $this->newWriteFile($writeText, $type);
    }

    /**
     * 获取当前时间包含微秒
     * @return string
     */
    private function getCurrentTimeWithMicroseconds()
    {
        list($usec, $sec) = explode(" ", microtime());
        return date("Y-m-d H:i:s", $sec) . "." . substr($usec, 2, 3);
    }
}

// 示例文件路径(可根据需求动态设置)
$defaultFilename = '/mnt/d/app.log';

// 创建日志实例
$logger = new Logger($defaultFilename);

// 示例调用
$logger->writeArr(['key' => 'value'], 'w');
$logger->write('Hello, World!', 'a');

 应用如下:

$arr = array(
    "w" => "wen",
    "j" => "jian",
    "b" => "bao"
);
write($arr);

 输出结果如下:

++++++++++++++++++++++++++++++++++++++++++
Array
(
    [w] => wen
    [j] => jian
    [b] => bao
)

 上面的仅仅是小技巧而已,最好还是用专业的调试工具去调试比较好。。。也可以

$data222 = $arr;

$text222 = print_r($data222, true);
$filename222 = 'd:\My Documents\1\write.txt';
file_put_contents($filename222, $text222);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值