157 lines
3.9 KiB
Go
157 lines
3.9 KiB
Go
package main
|
||
|
||
import (
|
||
"io"
|
||
"log"
|
||
"os"
|
||
"time"
|
||
|
||
"github.com/wuko233/sysmonitord/internal/config"
|
||
"github.com/wuko233/sysmonitord/internal/monitor"
|
||
"gopkg.in/natefinch/lumberjack.v2"
|
||
)
|
||
|
||
func main() {
|
||
// 设置日志输出到文件和控制台
|
||
log.SetOutput(os.Stdout)
|
||
fileLogger := &lumberjack.Logger{
|
||
Filename: "/var/log/sysmonitord/sysmonitord.log",
|
||
MaxSize: 10, // MB
|
||
MaxBackups: 5,
|
||
MaxAge: 28, // days
|
||
Compress: true,
|
||
}
|
||
log.SetOutput(io.MultiWriter(os.Stdout, fileLogger))
|
||
|
||
log.Println("启动sysmonitord...")
|
||
|
||
// SSH监控配置
|
||
sshCfg := &config.SSHMonitor{
|
||
Enabled: true,
|
||
DisplayOnShell: true,
|
||
AlertOnRootLogin: true,
|
||
}
|
||
|
||
// 信息监控配置
|
||
infoCfg := &monitor.InfoMonitorConfig{
|
||
Enabled: true,
|
||
Interval: 30 * time.Second, // 每30秒采集一次
|
||
LogFilePath: "/var/log/sysmonitord/info_monitor.log",
|
||
MaxLogSize: 100 * 1024 * 1024, // 100MB
|
||
LogRetention: 30, // 保留30天
|
||
ProcessLimit: 10, // 显示10个进程
|
||
CollectNetwork: true,
|
||
CollectProcess: true,
|
||
}
|
||
|
||
alertChan := make(chan monitor.Alert, 100)
|
||
metricsChan := make(chan monitor.ServerMetrics, 100)
|
||
|
||
log.Println("初始化监控器...")
|
||
|
||
// 创建SSH监控器
|
||
sshMonitor := monitor.NewSSHMonitor(sshCfg, alertChan)
|
||
|
||
// 创建信息监控器
|
||
infoMonitor := monitor.NewInfoMonitor(infoCfg, metricsChan)
|
||
|
||
// 启动告警处理
|
||
log.Println("启动告警处理...")
|
||
go handleAlerts(alertChan)
|
||
|
||
// 启动指标处理
|
||
log.Println("启动指标处理...")
|
||
go handleMetrics(metricsChan)
|
||
|
||
// 启动SSH监控器
|
||
go func() {
|
||
log.Println("启动SSH监控器...")
|
||
if err := sshMonitor.Start(); err != nil {
|
||
log.Fatalf("启动SSH监控器失败: %v", err)
|
||
}
|
||
}()
|
||
|
||
// 启动信息监控器
|
||
go func() {
|
||
log.Println("启动信息监控器...")
|
||
if err := infoMonitor.Start(); err != nil {
|
||
log.Fatalf("启动信息监控器失败: %v", err)
|
||
}
|
||
}()
|
||
|
||
time.Sleep(3 * time.Second)
|
||
|
||
log.Println("sysmonitord监控系统已启动.")
|
||
log.Println("按Ctrl+C退出...")
|
||
|
||
stopChan := make(chan os.Signal, 1)
|
||
|
||
<-stopChan
|
||
|
||
log.Println("正在停止监控器...")
|
||
|
||
// 停止信息监控器
|
||
if err := infoMonitor.Stop(); err != nil {
|
||
log.Printf("停止信息监控器失败: %v", err)
|
||
}
|
||
|
||
// 停止SSH监控器
|
||
if err := sshMonitor.Stop(); err != nil {
|
||
log.Printf("停止SSH监控器失败: %v", err)
|
||
}
|
||
|
||
time.Sleep(1 * time.Second)
|
||
|
||
log.Println("sysmonitord已退出.")
|
||
}
|
||
|
||
func handleAlerts(alertChan <-chan monitor.Alert) {
|
||
for alert := range alertChan {
|
||
log.Printf("[告警] 类型: %s | 级别: %s | 时间: %s | 消息: %s | 数据: %+v\n",
|
||
alert.Type, alert.Level, alert.Timestamp.Format(time.RFC3339), alert.Message, alert.Data)
|
||
|
||
switch alert.Type {
|
||
case "SSH_ROOT_LOGIN":
|
||
log.Println("ROOT用户登入警告!")
|
||
// Todo: 接入发信接口
|
||
}
|
||
}
|
||
}
|
||
|
||
func handleMetrics(metricsChan <-chan monitor.ServerMetrics) {
|
||
for metrics := range metricsChan {
|
||
// 这里可以处理指标数据,比如:
|
||
// 1. 存储到数据库
|
||
// 2. 发送到监控系统
|
||
// 3. 生成告警
|
||
|
||
// 示例:检查指标并生成告警
|
||
checkMetrics(&metrics)
|
||
}
|
||
}
|
||
|
||
func checkMetrics(metrics *monitor.ServerMetrics) {
|
||
// 检查CPU使用率
|
||
if metrics.CPU.UsagePercent > 90 {
|
||
log.Printf("[警告] CPU使用率过高: %.2f%%\n", metrics.CPU.UsagePercent)
|
||
}
|
||
|
||
// 检查内存使用率
|
||
if metrics.Memory.UsedPercent > 90 {
|
||
log.Printf("[警告] 内存使用率过高: %.2f%%\n", metrics.Memory.UsedPercent)
|
||
}
|
||
|
||
// 检查磁盘使用率
|
||
for _, disk := range metrics.Disk {
|
||
if disk.UsedPercent > 90 {
|
||
log.Printf("[警告] 磁盘%s使用率过高: %.2f%%\n",
|
||
disk.Mountpoint, disk.UsedPercent)
|
||
}
|
||
}
|
||
|
||
// 检查负载
|
||
if metrics.Load.RelativeLoad1 > 3.0 {
|
||
log.Printf("[警告] 系统负载过高: %.2f\n", metrics.Load.Load1)
|
||
}
|
||
}
|