# Panda Logger

一个轻量级的 Rust 彩色日志库，支持彩色输出、文件记录、计时器和灵活的配置选项。

## 特性

- **7 个日志级别**：Trace, Debug, Info, Warn, Error, Fatal, Custom
- **彩色输出**：便于识别不同级别的日志（使用 ANSI 转义序列）
- **完整信息**：时间戳、线程名称、文件路径和行号
- **灵活配置**：
  - 日志级别过滤
  - 路径显示方式（完整路径或仅文件名）
  - 自定义日期格式
  - 文件输出（控制台/文件/同时输出）
- **链式配置**：运行时动态修改配置
- **单例模式**：全局共享配置
- **计时器功能**：内置性能计时器
- **高性能**：优化的颜色处理和字符串格式化
- **零外部依赖**：仅依赖 chrono 和 once_cell

## 安装

```toml
[dependencies]
panda-logger = "0.1.0"
```

## 快速开始

```rust
#[macro_use]
extern crate panda_logger;

fn main() {
    panda_logger::Logger::get_instance().init();
    log_info!("程序启动");
    log_error!("发生错误");
}
```

## 日志输出格式

```
2026-04-25 23:22:24.128 [main] [I] logger\src\main.rs:22  这是 INFO 级别的日志
```

### 格式说明

| 元素 | 示例 | 说明 | 颜色 |
|------|------|------|------|
| 时间戳 | `2026-04-25 23:22:24.128` | 当前时间，可自定义格式 | 亮灰 |
| 线程名 | `[main]` | 线程名称，多线程时自动识别 | 哈希随机色 |
| 级别标识 | `[I]` | 日志级别 | 与消息同色 |
| 文件路径 | `logger\src\main.rs` | 调用日志的源文件 | 哈希随机色 |
| 行号 | `22` | 调用日志的代码行 | 亮灰 |
| 消息 | `这是 INFO 级别的日志` | 日志内容 | 与级别标识同色 |

## 级别标识

| 级别 | 标识 | 宏 | 颜色 |
|------|------|-----|------|
| TRACE | `[T]` | `log_trace!(...)` | 亮灰 |
| DEBUG | `[D]` | `log_debug!(...)` | 亮蓝 |
| INFO | `[I]` | `log_info!(...)` | 亮绿 |
| WARN | `[W]` | `log_warn!(...)` | 亮黄 |
| ERROR | `[E]` | `log_error!(...)` | 亮紫 |
| FATAL | `[F]` | `log_fatal!(...)` | 亮红 |
| CUSTOM | `[C]` | `log_custom!(...)` | 亮青 |

## 可用宏

| 宏 | 说明 | 颜色 |
|-----|------|------|
| `log_trace!(...)` | TRACE 级别，最详细调试信息 | 亮灰 |
| `log_debug!(...)` | DEBUG 级别，开发调试用 | 亮蓝 |
| `log_info!(...)` | INFO 级别，一般信息 | 亮绿 |
| `log_warn!(...)` | WARN 级别，警告信息 | 亮黄 |
| `log_error!(...)` | ERROR 级别，错误信息 | 亮紫 |
| `log_fatal!(...)` | FATAL 级别，严重错误 | 亮红 |
| `log_custom!(...)` | CUSTOM 级别，自定义日志 | 亮青 |
| `log!(level, ...)` | 通用宏，动态指定级别 | - |

## 配置示例

### 链式配置（推荐）

```rust
use panda_logger::{LogLevel, PathDisplay};

fn main() {
    panda_logger::Logger::get_instance()
        .init()
        .set_level(LogLevel::Debug)
        .set_path_display(PathDisplay::Full)
        .set_date_format("%Y/%m/%d %H:%M:%S.%3f");
}
```

### 运行时修改配置

```rust
use panda_logger::{LogLevel, PathDisplay};

fn main() {
    panda_logger::Logger::get_instance()
        .set_level(LogLevel::Trace)
        .set_path_display(PathDisplay::FileName)
        .set_date_format("%H:%M:%S.%3f");
}
```

### 多线程日志

```rust
#[macro_use]
extern crate panda_logger;
use panda_logger::Logger;

fn main() {
    Logger::get_instance().init().set_level(panda_logger::LogLevel::Info);

    let handle = std::thread::Builder::new()
        .name("worker-1".to_string())
        .spawn(|| {
            log_info!("这是在 worker-1 线程中的日志");
        })
        .unwrap();

    handle.join().unwrap();
}
```

### 文件输出

```rust
#[macro_use]
extern crate panda_logger;
use panda_logger::{Logger, LogOutput};

fn main() {
    Logger::get_instance()
        .init()
        .set_output(LogOutput::Both)
        .set_file_path("app.log")
        .set_level(panda_logger::LogLevel::Info);

    log_info!("这条日志会同时输出到控制台和文件");

    Logger::get_instance().close();
}
```

## 计时器功能

```rust
use panda_logger::{GlobalTimer, Timer, format_duration};

fn main() {
    // 全局计时器
    println!("程序已运行: {}", GlobalTimer::elapsed_format());
    println!("程序已运行: {:.3} 秒", GlobalTimer::elapsed_secs());

    // 局部计时器
    let timer = Timer::start();
    // ... 执行某些操作 ...
    println!("经过的时间: {}", timer.elapsed_format());
}
```

## 性能对比

与标准日志库 simplelog 的性能对比：

| 日志库 | 运行时间（15次日志调用） | 额外开销 |
|--------|--------------------------|----------|
| panda_logger | ~5.0s | ~0ms |
| simplelog | ~5.0s | ~5ms |

## License

MIT
