# PM2 错误日志

URL: https://caijiao.org/pm2/troubleshooting/error-logs
Source: docs/pm2/troubleshooting/error-logs.md
Description: 学习如何通过 PM2 捕获和分析 Node.js 应用的错误日志，帮助你诊断应用问题、优化性能，确保应用在生产环境中的稳定性。

PM2 是一个强大的进程管理工具，不仅能够帮助你管理 Node.js 应用的生命周期，还能为你提供详细的错误日志，帮助你快速定位和解决应用中的问题。通过分析 PM2 生成的错误日志，开发者可以诊断应用故障、优化性能，并确保应用在生产环境中的稳定运行。

## 1. **PM2 日志系统概述**

PM2 会自动捕获应用的标准输出（`stdout`）和标准错误输出（`stderr`），并将它们记录到日志文件中。开发者可以通过 PM2 提供的命令查看这些日志，帮助他们快速发现和修复应用的问题。

### 默认日志路径

PM2 默认将日志文件存储在以下路径：

- **标准输出日志**：`~/.pm2/logs/<app-name>-out.log`
- **错误日志**：`~/.pm2/logs/<app-name>-error.log`

其中 `<app-name>` 是你在启动应用时指定的名称。

## 2. **查看错误日志**

PM2 提供了简单的命令来查看日志。通过这些命令，开发者可以快速查看应用的输出信息以及错误信息。

### 查看所有日志

```bash
pm2 logs
````

该命令将显示所有正在运行的应用的日志，包括标准输出和错误日志。

### 查看特定应用的日志

如果你只关心某个特定应用的日志，可以使用以下命令：

```bash
pm2 logs <app-name>
```

例如，要查看名为 `my-app` 的应用日志：

```bash
pm2 logs my-app
```

### 查看错误日志

如果你只想查看错误日志，可以使用 `--error` 标志：

```bash
pm2 logs <app-name> --error
```

例如：

```bash
pm2 logs my-app --error
```

这将仅显示 `my-app` 的错误日志，帮助你快速定位问题。

### 查看最后 1000 行日志

如果日志过长，可以通过 `--lines` 标志查看最近的日志行。例如，查看最近的 1000 行日志：

```bash
pm2 logs my-app --lines 1000
```

### 持续查看日志

如果你希望实时查看日志，可以使用 `--follow` 标志：

```bash
pm2 logs my-app --follow
```

该命令将持续输出日志内容，直到你手动停止查看。

## 3. **分析错误日志**

分析 PM2 的错误日志对于排查应用故障至关重要。错误日志通常包含了应用崩溃、内存问题、未捕获异常等信息。以下是一些常见的错误日志类型：

### 1. **未捕获的异常（Uncaught Exceptions）**

未捕获的异常通常是应用崩溃的常见原因。比如，访问了一个未定义的变量或发生了未处理的错误，都会导致应用崩溃并生成错误日志。

#### 示例错误日志

```txt
TypeError: Cannot read property 'name' of undefined
    at /path/to/app.js:42:16
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
```

在这种情况下，你需要检查应用代码的第 42 行，确保变量 `name` 是定义且有效的。

### 2. **内存溢出（Out of Memory）**

内存溢出通常是由于内存泄漏或大量数据操作引起的。当应用使用的内存超过了系统的限制时，Node.js 会抛出 `Out of Memory` 错误。

#### 示例错误日志

```txt
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
```

为解决内存溢出问题，可以通过增加 `--max-old-space-size` 标志来提高 Node.js 进程的最大内存限制，或者查找代码中的内存泄漏问题。

### 3. **端口冲突（Port Conflict）**

如果你的应用尝试绑定一个已被占用的端口，PM2 会记录端口冲突的错误。

#### 示例错误日志

```txt
Error: listen EADDRINUSE: address already in use 0.0.0.0:3000
    at Server.setupListenHandle [as _listen2] (net.js:1263:14)
    at listenInCluster (net.js:1367:12)
    at Server.listen (net.js:1462:7)
```

在这种情况下，检查应用是否已经在该端口上运行，或者修改应用的端口配置。

### 4. **外部依赖错误**

如果应用依赖的外部服务（如数据库、API）不可用或返回错误，PM2 也会记录相关错误。

#### 示例错误日志

```txt
Error: Cannot connect to database: Connection refused
    at /path/to/database/connection.js:50:15
```

解决方法包括检查数据库连接配置、网络连接和数据库服务是否正常。

## 4. **使用 PM2 错误日志进行故障排查**

### 步骤 1: 确认错误日志

首先，使用 `pm2 logs <app-name> --error` 查看应用的错误日志，记录下错误的详细信息，例如错误类型、堆栈信息和发生错误的行数。

### 步骤 2: 重现错误

通过分析错误日志中的堆栈信息，定位问题的根源。尽量在开发环境中重现错误，并查看是否能通过调试工具（如 `console.log` 或 `debugger`）进一步确认问题。

### 步骤 3: 修复并重新部署

根据错误信息修复代码问题后，重新启动应用。如果是内存溢出或性能问题，考虑优化代码，减少内存消耗或提高性能。

使用以下命令重启应用：

```bash
pm2 restart <app-name>
```

### 步骤 4: 监控应用

修复后，使用 `pm2 monit` 或 `pm2 logs` 实时监控应用，确保问题已得到解决。

## 5. **总结**

PM2 提供了强大的错误日志功能，帮助你轻松捕获和分析 Node.js 应用中的错误。通过查看和分析错误日志，你可以快速定位问题并进行修复，确保应用在生产环境中的稳定性。常见的错误包括未捕获的异常、内存溢出、端口冲突和外部依赖错误，PM2 提供的日志信息和监控工具能够有效帮助开发者解决这些问题。
