网站运行过程中出现白屏、报错、功能异常时,最直接的排查方式就是查看日志。日志记录了程序执行时的每一步信息,包括错误原因、请求参数、执行时间等。很多网站问题无法直接复现,但日志里会留下完整线索。本教程将详细讲解如何为常见网站程序(PHP 类程序如 WordPress、ThinkPHP、Laravel,以及前端 Nginx 服务器)开启日志记录,并告诉你日志文件在哪里、如何读取。
### 前言介绍
日志记录是网站调试和运维的基础。没有日志,当网站出现 500 错误、接口超时、数据库连接失败时,你只能靠猜。开启日志后,程序会在指定文件里写下错误发生的时间、文件路径、行号以及具体错误描述。本教程覆盖三种最主流的环境:Apache/Nginx 服务器日志、PHP 程序自身错误日志、以及常见框架(ThinkPHP、Laravel、WordPress)的日志配置。无论你是用虚拟主机还是云服务器,都能找到对应方法。
### 前置准备
1. **服务器访问权限**:你需要能登录服务器(SSH 或远程桌面),或者能通过主机控制面板(如 cPanel、宝塔面板)修改文件。
2. **文件编辑工具**:推荐使用 Notepad++、VS Code 或服务器自带的 vi/vim 编辑器。不要用记事本编辑 Linux 配置文件,否则可能导致格式错误。
3. **网站根目录路径**:确认你的网站程序放在哪个文件夹,例如 `/var/www/html` 或 `D:\wwwroot`。
4. **备份原始配置**:在修改任何配置文件前,先复制一份备份,例如把 `php.ini` 复制为 `php.ini.bak`。
5. **日志查看工具**:Windows 用 Notepad++ 或自带记事本,Linux 用 `tail -f` 命令实时查看日志。
### 分步操作步骤
#### 1. 开启 PHP 程序自身错误日志(最通用,适用于所有 PHP 网站)
PHP 的错误日志是独立于服务器日志的,专门记录 PHP 代码执行时的错误(如语法错误、未定义变量、数据库查询失败)。无论你用什么框架,这一步都能生效。
- **找到 PHP 配置文件**:
- Linux 服务器:通常位于 `/etc/php.ini` 或 `/etc/php/7.4/cli/php.ini`(版本号可能不同)。如果你用宝塔面板,可以在面板左侧“软件商店”->“PHP 设置”->“配置文件”中直接编辑。
- Windows 服务器:位于 PHP 安装目录下,例如 `C:\php\php.ini`。
- 虚拟主机用户:无法直接修改 php.ini,可以在网站根目录下新建一个 `.user.ini` 文件(如果支持),或者通过 .htaccess 文件配置(见下文)。
- **修改关键参数**:
打开 php.ini 文件,搜索以下三个参数,并修改为如下值:
```
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
```
- **display_errors Off**:关闭在网页上直接显示错误。生产环境必须关闭,否则可能暴露数据库密码等敏感信息。
- **log_errors On**:开启错误日志记录。
- **error_log**:指定日志文件的绝对路径。Linux 建议放在 `/var/log/` 下,Windows 建议放在 `C:\logs\` 下。路径必须存在且 PHP 有写入权限。
- **设置日志文件权限**(Linux 服务器):
创建日志文件并赋予写入权限:
```bash
sudo touch /var/log/php_errors.log
sudo chmod 644 /var/log/php_errors.log
sudo chown www-data:www-data /var/log/php_errors.log
```
`www-data` 是常见 Web 用户,具体用户取决于你的服务器配置(也可能是 `nobody` 或 `apache`)。如果不确定,可以执行 `ps aux | grep nginx` 或 `ps aux | grep apache` 查看运行用户。
- **重启 PHP 服务**:
- 宝塔面板:在软件商店里重启 PHP。
- 命令行:`sudo systemctl restart php7.4-fpm`(版本号根据实际修改)。
- Windows:在 IIS 管理器中重启 PHP 或重启整个网站池。
- **验证日志是否生效**:
在网站根目录创建一个测试文件 `test_log.php`,写入以下代码:
```php
// 故意触发一个警告
echo $undefined_variable;
?>
```
访问 `http://你的域名/test_log.php`,页面应该空白(因为 display_errors 已关闭)。然后查看 `/var/log/php_errors.log` 文件,如果看到类似 `PHP Notice: Undefined variable` 的记录,说明配置成功。记得删除测试文件。
#### 2. 为 Nginx 服务器开启访问日志和错误日志(适用于 Nginx 用户)
Nginx 日志记录的是 HTTP 层面的信息,包括谁访问了哪个 URL、返回了什么状态码(200、404、500)、请求耗时等。当网站出现 502 Bad Gateway 或 404 时,查 Nginx 错误日志最直接。
- **编辑 Nginx 主配置文件**:
宝塔面板用户:左侧“软件商店”->“Nginx”->“设置”->“配置修改”。
手动安装用户:`sudo vi /etc/nginx/nginx.conf`。
- **在 http 块中配置日志格式和路径**:
找到 `http { ... }` 块,在内部添加或修改以下内容:
```nginx
http {
# 定义日志格式(main 是格式名称,可自定义)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 指定访问日志路径和使用的格式
access_log /var/log/nginx/access.log main;
# 指定错误日志路径和记录级别(debug, info, notice, warn, error, crit)
error_log /var/log/nginx/error.log warn;
}
```
- `access_log`:记录所有正常请求。如果磁盘空间紧张,可以设置 `off` 关闭。
- `error_log`:记录错误信息。`warn` 级别会记录警告及以上错误,生产环境建议使用 `error` 级别减少日志量。
- **为特定站点单独配置日志**(推荐):
在 `server` 块中覆盖全局设置,避免所有站点的日志混在一起:
```nginx
server {
listen 80;
server_name example.com;
# 单独指定该站点的日志文件
access_log /var/log/nginx/example_access.log main;
error_log /var/log/nginx/example_error.log error;
# 其他配置...
}
```
- **创建日志目录并赋予权限**:
```bash
sudo mkdir -p /var/log/nginx
sudo chmod 755 /var/log/nginx
sudo chown -R www-data:www-data /var/log/nginx
```
- **测试配置并重启 Nginx**:
```bash
sudo nginx -t # 测试配置文件语法
sudo systemctl restart nginx # 重启 Nginx
```
- **实时查看日志**:
```bash
# 实时查看访问日志
tail -f /var/log/nginx/example_access.log
# 实时查看错误日志
tail -f /var/log/nginx/example_error.log
```
#### 3. 为 Apache 服务器开启日志(适用于 Apache 用户)
Apache 的日志配置与 Nginx 类似,但语法不同。
- **编辑 Apache 配置文件**:
宝塔用户:软件商店->Apache->设置->配置修改。
手动安装用户:`sudo vi /etc/httpd/conf/httpd.conf` 或 `/etc/apache2/apache2.conf`。
- **开启日志模块并配置**:
确保以下模块已启用(取消注释):
```apache
LoadModule log_config_module modules/mod_log_config.so
```
在 `
```apache
# 定义日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
# 指定访问日志
CustomLog "/var/log/httpd/access_log" combined
# 指定错误日志
ErrorLog "/var/log/httpd/error_log"
# 错误日志级别:debug, info, notice, warn, error, crit
LogLevel warn
```
- **重启 Apache**:
```bash
sudo systemctl restart httpd # CentOS
sudo systemctl restart apache2 # Ubuntu/Debian
```
#### 4. 为常用 PHP 框架开启专属日志(ThinkPHP、Laravel、WordPress)
框架通常有自己的日志系统,配置更精细,建议优先使用框架日志,因为它会记录 SQL 语句、请求参数等更详细的信息。
- **ThinkPHP 6/8 开启日志**:
打开 `config/log.php` 文件,修改如下:
```php
return [
// 默认日志通道
'default' => env('log.channel', 'file'),
'channels' => [
'file' => [
// 日志记录级别:debug, info, notice, warning, error, critical, alert, emergency
'level' => ['debug', 'info', 'notice', 'warning', 'error', 'critical', 'alert', 'emergency'],
// 单文件日志(true 表示所有日志写入一个文件,false 按天生成文件)
'single' => false,
// 日志文件大小限制(单位:MB),超过自动分割
'file_size' => 100,
// 日志路径,默认在 runtime/log/
'path' => app()->getRuntimePath() . 'log',
],
],
];
```
日志文件位置:`runtime/log/2025/04/10.log`(按日期生成)。查看时直接打开对应日期的文件。
- **Laravel 开启日志**:
Laravel 默认使用 `stack` 通道,同时写入多个地方。推荐修改 `.env` 文件:
```env
# 将日志级别设为 debug,记录所有信息
LOG_LEVEL=debug
# 使用 daily 模式,每天一个文件,保留 30 天
LOG_CHANNEL=daily
```
然后打开 `config/logging.php`,确保 `daily` 通道配置正确:
```php
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 30, // 保留天数
],
```
日志位置:`storage/logs/laravel-2025-04-10.log`。
- **WordPress 开启调试日志**:
WordPress 默认不记录错误日志,需要修改根目录下的 `wp-config.php` 文件。在 `/* That's all, stop editing! Happy publishing. */` 这一行之前添加:
```php
// 开启调试模式
define('WP_DEBUG', true);
// 将错误记录到文件,不显示在页面上
define('WP_DEBUG_LOG', true);
// 关闭前端显示
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);
```
日志文件位置:`wp-content/debug.log`。注意:这个文件可能很大,排查完问题后记得将 `WP_DEBUG` 改回 `false`。
### 常见问题
**Q1:修改 php.ini 后日志文件没有生成?**
A:检查三个地方:① error_log 指定的目录是否存在且 PHP 有写入权限(Linux 下执行 `ls -ld /var/log` 查看权限)。② 是否重启了 PHP 服务。③ 在 php.ini 中搜索 `disable_functions`,看是否禁用了 `error_log` 函数。
**Q2:Nginx 日志文件一直在增长,磁盘空间快满了怎么办?**
A:配置日志轮转(logrotate)。Linux 系统通常自带 logrotate,创建一个配置文件 `/etc/logrotate.d/nginx`:
```bash
/var/log/nginx/*.log {
daily # 每天轮转
rotate 30 # 保留 30 天
compress # 压缩旧日志
delaycompress # 延迟一天压缩
missingok # 日志文件不存在不报错
notifempty # 空文件不轮转
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
```
然后执行 `sudo logrotate -f /etc/logrotate.d/nginx` 立即测试。
**Q3:WordPress 开启 debug.log 后网站变慢?**
A:`WP_DEBUG` 会记录所有通知和警告,生产环境流量大时确实影响性能。建议只在排查问题时临时开启,排查完立即关闭。或者将日志级别调高,只记录错误:在 `wp-config.php` 中添加 `define('WP_DEBUG_LOG', true);` 后,再添加 `@ini_set('log_errors_max_len', 0);` 限制单条日志长度。
**Q4:日志文件里全是乱码或看不懂的符号?**
A:可能是编码问题。用支持 UTF-8 的编辑器打开(如 VS Code),或者用 `cat` 命令在终端查看。如果日志里包含二进制数据,说明程序有 fatal error 导致输出混乱,检查 PHP 代码中是否有 `exit` 或 `die` 输出非文本内容。
**Q5:虚拟主机用户无法修改 php.ini 怎么办?**
A:尝试在网站根目录创建 `.htaccess` 文件(Apache 环境),写入:
```apache
php_flag display_errors off
php_flag log_errors on
php_value error_log /home/yourusername/logs/php_errors.log
```
如果主机商禁止 `.htaccess` 覆盖,联系客服申请开启错误日志,或者使用框架自带的日志功能(如 WordPress 的 `wp-config.php` 方法)。
### 收尾总结
日志是网站开发者的眼睛。通过本教程,你学会了三种核心日志的配置方法:PHP 通用错误日志、服务器(Nginx/Apache)访问与错误日志、以及主流框架(ThinkPHP、Laravel、WordPress)的专属日志。配置完成后,当网站再次出现白屏、500 错误或功能异常时,直接打开对应的日志文件,搜索 `error`、`fatal`、`exception` 等关键词,就能快速定位到具体文件和行号。记住一个原则:生产环境关闭前端错误显示(display_errors=Off),但必须开启日志记录(log_errors=On)。定期检查日志文件大小,配置日志轮转,避免日志撑爆磁盘。现在就去检查你的服务器,确保日志已经在记录。