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) } }