以前习惯用 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);