# log-collector
**Repository Path**: teeoo/log-collector
## Basic Information
- **Project Name**: log-collector
- **Description**: 基于Spring Boot 3的日志收集组件,支持异步采集WARNING及以上级别的日志,并提供多种存储方式(MySQL/Elasticsearch)
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-03-29
- **Last Updated**: 2025-03-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Log Collector
基于Spring Boot 3的日志收集组件,支持异步采集WARNING及以上级别的日志,并提供多种存储方式(MySQL/Elasticsearch)。
## 项目架构
本项目采用模块化设计,主要包含以下组件:
- **log-collector-core**: 核心模块,提供日志收集的基础功能
- LogCollectorService: 日志收集服务,提供异步日志收集能力
- LogEntry: 日志实体类,定义日志数据结构
- LogStorage: 存储接口,基于SPI机制支持多种存储实现
- **log-collector-demo**: 示例应用,展示如何集成和使用日志收集器
## 特性
- **基于Spring Boot 3**: 充分利用Spring Boot 3的新特性和性能优化
- **异步处理**: 使用@Async注解实现异步日志收集,不影响主业务流程
- **多种存储方式**: 基于SPI机制实现可扩展的存储层
- MySQL存储: 支持将日志存储到MySQL数据库
- Elasticsearch存储: 支持将日志存储到Elasticsearch,便于日志检索和分析
- **简单集成**: 提供简单的配置方式和API,快速集成到现有项目
- **可定制化**: 支持自定义日志收集级别、存储方式和其他配置
## 快速开始
### 1. 添加依赖
```xml
cn.kickegg.log
log-collector-core
1.0-SNAPSHOT
org.mybatis.spring.boot
mybatis-spring-boot-starter
3.0.3
mysql
mysql-connector-java
8.0.33
```
### 2. 配置存储方式
#### MySQL存储配置示例(application.yml)
```yaml
# 日志收集器配置
log:
collector:
storage:
type: mysql
# 数据源配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/logs?createDatabaseIfNotExist=true
username: your-username
password: your-password
driver-class-name: com.mysql.cj.jdbc.Driver
# MyBatis配置
mybatis:
mapper-locations: classpath*:mapper/*.xml # 使用classpath*以支持扫描依赖jar包中的mapper
configuration:
map-underscore-to-camel-case: true # 开启驼峰命名转换
```
#### MySQL存储的Mapper配置
在您的项目中创建以下配置类:
```java
@Configuration
@MapperScan(basePackages = {
"cn.kickegg.log.core.mapper", // 扫描core包中的mapper
"your.package.mapper" // 您自己的mapper包
})
public class MyBatisConfig {
}
```
#### Elasticsearch存储配置示例(application.yml)
```yaml
log:
collector:
storage:
type: elasticsearch
elasticsearch:
hosts: localhost:9200
username: elastic # 可选
password: your-password # 可选
ssl: false
certificate-path: /path/to/certificate # 如果启用SSL时需要
connection-timeout: 5000
socket-timeout: 60000
index-name: application_logs
```
### 3. 使用日志收集器
```java
@Service
public class YourService {
private final LogCollectorService logCollectorService;
public YourService(LogCollectorService logCollectorService) {
this.logCollectorService = logCollectorService;
}
public void someMethod() {
try {
// 你的业务代码
} catch (Exception e) {
logCollectorService.collectLog(
"your-app-name",
"ERROR",
e.getMessage(),
getStackTrace(e),
this.getClass().getName(),
"methodName",
Thread.currentThread().getName()
);
}
}
private String getStackTrace(Exception e) {
StringBuilder sb = new StringBuilder();
for (StackTraceElement element : e.getStackTrace()) {
sb.append(element.toString()).append("\n");
}
return sb.toString();
}
}
```
## 配置说明
### MySQL配置要求
MySQL存储方式需要使用方提供以下配置:
1. 数据源配置(spring.datasource):
- url:数据库连接URL
- username:数据库用户名
- password:数据库密码
- driver-class-name:数据库驱动类
2. MyBatis配置(可选):
- mapper-locations:Mapper XML文件位置
- type-aliases-package:实体类包路径
### Elasticsearch配置项
| 配置项 | 说明 | 默认值 |
| ------------------ | ------------------ | ---------------- |
| hosts | ES主机地址列表 | localhost:9200 |
| username | 用户名 | null |
| password | 密码 | null |
| ssl | 是否启用SSL | false |
| certificate-path | 证书路径 | null |
| connection-timeout | 连接超时时间(ms) | 5000 |
| socket-timeout | Socket超时时间(ms) | 60000 |
| index-name | 索引名称 | application_logs |
## 数据库表结构
MySQL存储方式使用的表结构如下:
```sql
CREATE TABLE log_entries (
id VARCHAR(36) PRIMARY KEY,
application_name VARCHAR(100),
level VARCHAR(20),
message TEXT,
stack_trace TEXT,
class_name VARCHAR(255),
method_name VARCHAR(255),
timestamp DATETIME,
thread_name VARCHAR(100)
);
```
## 示例项目
项目中包含了一个完整的示例应用(log-collector-demo),展示了如何集成和使用这个日志收集器。你可以参考这个示例来了解具体的使用方式。
## 最佳实践
### 日志收集策略
1. **选择合适的日志级别**
- WARNING: 业务警告信息
- ERROR: 业务错误信息
- FATAL: 致命错误信息
2. **异常处理最佳实践**
```java
try {
// 业务代码
} catch (BusinessException e) {
// 业务异常,使用WARNING级别
logCollectorService.collectLog(
"your-app-name",
"WARNING",
e.getMessage(),
getStackTrace(e),
this.getClass().getName(),
"methodName",
Thread.currentThread().getName()
);
} catch (Exception e) {
// 系统异常,使用ERROR级别
logCollectorService.collectLog(
"your-app-name",
"ERROR",
e.getMessage(),
getStackTrace(e),
this.getClass().getName(),
"methodName",
Thread.currentThread().getName()
);
}
```
3. **日志信息规范**
- applicationName: 使用有意义的应用名称,便于区分不同应用
- message: 提供清晰的错误描述
- stackTrace: 包含完整的堆栈信息
- className和methodName: 准确记录异常发生的位置
### 存储选择建议
1. **MySQL存储**
- 适用于日志量较小的应用
- 需要与业务数据关联分析的场景
- 对实时性要求不高的场景
2. **Elasticsearch存储**
- 大规模日志收集和分析
- 需要复杂查询和聚合分析
- 实时日志监控和告警
## 注意事项
1. **环境准备**
- 确保选择的存储方式(MySQL/Elasticsearch)服务可用
- 所有数据源配置(MySQL/MyBatis等)都需要在您自己的项目中完成
- 如果使用MySQL存储,需要确保数据表已经创建
2. **性能考虑**
- 日志收集是异步进行的,不会影响主业务流程
- 默认只收集WARNING及以上级别的日志
- 建议定期清理历史日志数据
- 合理设置Elasticsearch的索引策略
3. **安全建议**
- 妥善保管数据库和Elasticsearch的访问凭证
- 避免在日志中记录敏感信息
- 建议启用SSL加密传输
## 常见问题
1. **日志丢失问题**
- 确保存储服务的可用性
- 检查异步线程池配置
- 验证存储服务的连接配置
2. **性能问题**
- 合理设置日志级别
- 优化日志内容大小
- 定期维护存储服务
3. **存储选择**
- 小规模应用推荐使用MySQL
- 大规模应用推荐使用Elasticsearch
- 可以根据需求同时使用多种存储方式