# LogManager 使用指南

## 文件位置

`src/Utils/LogManager.cs`

## 用途

统一的日志记录管理器。在 Navisworks 插件环境中，`Console.WriteLine` 不可见，必须使用 LogManager。

## 日志级别

```csharp
LogManager.Debug("调试信息");      // 开发调试使用
LogManager.Info("普通信息");       // 一般操作记录
LogManager.Warning("警告信息");    // 需要注意但非错误
LogManager.Error("错误信息");      // 错误（可选异常参数）
LogManager.Fatal("致命错误");      // 严重错误
```

## 核心方法

### 基本信息日志

```csharp
LogManager.Info("路径创建成功");
LogManager.Info($"路径名称: {route.Name}, 长度: {route.TotalLength}");
```

### 带异常的错误日志

```csharp
try
{
    // 某些操作
}
catch (Exception ex)
{
    // ✅ 正确：记录异常详情
    LogManager.Error($"操作失败: {ex.Message}", ex);
}
```

### 调试日志（开发时）

```csharp
LogManager.Debug($"当前路径点数: {path.Points.Count}");
LogManager.Debug($"网格大小: {grid.Width} x {grid.Height}");
```

## 使用示例

### 示例1：记录操作开始和完成

```csharp
public void CreatePath()
{
    LogManager.Info("=== 开始创建路径 ===");
    
    try
    {
        // 执行操作
        var route = GeneratePath();
        
        LogManager.Info($"路径创建成功: {route.Name}, ID: {route.Id}");
    }
    catch (Exception ex)
    {
        LogManager.Error($"路径创建失败: {ex.Message}", ex);
        throw;  // 重新抛出或处理
    }
    
    LogManager.Info("=== 创建路径完成 ===");
}
```

### 示例2：记录重要状态变更

```csharp
public void SetStartPoint(Point3D point)
{
    _startPoint = point;
    
    LogManager.Info($"起点已设置: ({point.X:F2}, {point.Y:F2}, {point.Z:F2})");
    
    if (_endPoint != null)
    {
        double distance = GeometryHelper.Distance(point, _endPoint);
        LogManager.Info($"起点终点距离: {distance:F2} 米");
    }
}
```

## 日志文件位置

日志文件存储在：
```
C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\TransportPlugin\logs\
```

文件命名：
- `debug.log` - 当前日志
- `debug.log.1`, `debug.log.2` - 历史日志（自动轮转）

## 注意事项

1. **永远不要使用 Console.WriteLine**：
   ```csharp
   // ❌ 错误：在Navisworks中不可见
   Console.WriteLine("Error occurred");
   
   // ✅ 正确：写入日志文件
   LogManager.Error("Error occurred");
   ```

2. **错误日志要包含异常**：
   ```csharp
   // ❌ 不够详细
   LogManager.Error($"失败: {ex.Message}");
   
   // ✅ 包含堆栈信息
   LogManager.Error($"失败: {ex.Message}", ex);
   ```

3. **避免在循环中大量记录**：
   ```csharp
   // ❌ 可能导致日志文件过大
   foreach (var point in points)
   {
       LogManager.Debug($"处理点: {point.Name}");  // 1000个点=1000条日志
   }
   
   // ✅ 只记录摘要
   LogManager.Debug($"开始处理 {points.Count} 个点...");
   // ... 处理 ...
   LogManager.Debug($"点处理完成");
   ```

4. **使用类别前缀便于过滤**：
   ```csharp
   LogManager.Info("[路径规划] 开始生成");
   LogManager.Info("[碰撞检测] 发现3个碰撞");
   LogManager.Info("[渲染] 路径显示完成");
   ```
