package serverconfigs import ( "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" ) // AccessLogStorageType 访问日志存储类型(含「存储+写入目标」组合) type AccessLogStorageType = string const ( AccessLogStorageTypeFile AccessLogStorageType = "file" AccessLogStorageTypeFileMySQL AccessLogStorageType = "file_mysql" AccessLogStorageTypeFileClickhouse AccessLogStorageType = "file_clickhouse" AccessLogStorageTypeFileMySQLClickhouse AccessLogStorageType = "file_mysql_clickhouse" AccessLogStorageTypeES AccessLogStorageType = "es" AccessLogStorageTypeTCP AccessLogStorageType = "tcp" AccessLogStorageTypeSyslog AccessLogStorageType = "syslog" AccessLogStorageTypeCommand AccessLogStorageType = "command" ) // FindAllAccessLogStorageTypes 所有存储引擎列表(含写入目标组合:文件、文件+MySQL、文件+ClickHouse 等) func FindAllAccessLogStorageTypes() []*shared.Definition { return []*shared.Definition{ {Name: "文件", Code: AccessLogStorageTypeFile, Description: "节点写本地 JSON 文件"}, {Name: "文件+MySQL", Code: AccessLogStorageTypeFileMySQL, Description: "节点写文件 + API 写 MySQL"}, {Name: "文件+ClickHouse", Code: AccessLogStorageTypeFileClickhouse, Description: "节点写文件 + 落 ClickHouse(Fluent Bit 或 API 直写)"}, {Name: "文件+MySQL+ClickHouse", Code: AccessLogStorageTypeFileMySQLClickhouse, Description: "节点写文件 + API 写 MySQL + ClickHouse"}, {Name: "ElasticSearch", Code: AccessLogStorageTypeES, Description: "将日志存储在ElasticSearch中"}, {Name: "TCP Socket", Code: AccessLogStorageTypeTCP, Description: "将日志通过TCP套接字输出"}, {Name: "Syslog", Code: AccessLogStorageTypeSyslog, Description: "将日志通过syslog输出,仅支持Linux"}, {Name: "命令行输入流", Code: AccessLogStorageTypeCommand, Description: "启动一个命令通过读取stdin接收日志信息"}, } } // FindAccessLogStorageTypeName 根据类型查找名称 func FindAccessLogStorageTypeName(storageType string) string { for _, m := range FindAllAccessLogStorageTypes() { if m.Code == storageType { return m.Name } } return "" } // IsFileBasedStorageType 是否为基于文件的存储(需要显示文件路径等配置) func IsFileBasedStorageType(code string) bool { switch code { case AccessLogStorageTypeFile, AccessLogStorageTypeFileMySQL, AccessLogStorageTypeFileClickhouse, AccessLogStorageTypeFileMySQLClickhouse: return true default: return false } } // NormalizeAccessLogStorageType 统一存储类型编码(兼容历史别名)。 func NormalizeAccessLogStorageType(storageType string) string { switch storageType { case "clickhouse": return AccessLogStorageTypeFileClickhouse case "mysql_clickhouse": return AccessLogStorageTypeFileMySQLClickhouse default: return storageType } } // BuildWriteTargetsByStorageType 按 type(唯一真源)构建写入目标。 // disableDefaultDB 用于控制是否保留 MySQL 写入。 func BuildWriteTargetsByStorageType(storageType string, disableDefaultDB bool) *AccessLogWriteTargets { storageType = NormalizeAccessLogStorageType(storageType) targets := &AccessLogWriteTargets{} switch storageType { case AccessLogStorageTypeFile: targets.File = true case AccessLogStorageTypeFileMySQL: targets.File = true targets.MySQL = true case AccessLogStorageTypeFileClickhouse: targets.File = true targets.ClickHouse = true case AccessLogStorageTypeFileMySQLClickhouse: targets.File = true targets.MySQL = true targets.ClickHouse = true case AccessLogStorageTypeES, AccessLogStorageTypeTCP, AccessLogStorageTypeSyslog, AccessLogStorageTypeCommand: // 保持现有兼容语义:非 file 类型默认写 MySQL(除非停用默认数据库) targets.MySQL = true default: // 兜底保持可用 targets.File = true targets.MySQL = true } if disableDefaultDB { targets.MySQL = false } if !targets.File && !targets.MySQL && !targets.ClickHouse { targets.File = true } return targets } // ParseStorageTypeAndWriteTargets 从下拉框选中的类型解析出「实际存储类型」与「写入目标」 // 用于创建/更新策略:options 按 baseType 填(如 file),writeTargets 按组合填。 func ParseStorageTypeAndWriteTargets(selectedType string) (baseType string, writeTargets *AccessLogWriteTargets) { selectedType = NormalizeAccessLogStorageType(selectedType) writeTargets = &AccessLogWriteTargets{} switch selectedType { case AccessLogStorageTypeFile: baseType = AccessLogStorageTypeFile writeTargets.File = true case AccessLogStorageTypeFileMySQL: baseType = AccessLogStorageTypeFile writeTargets.File = true writeTargets.MySQL = true case AccessLogStorageTypeFileClickhouse: baseType = AccessLogStorageTypeFile writeTargets.File = true writeTargets.ClickHouse = true case AccessLogStorageTypeFileMySQLClickhouse: baseType = AccessLogStorageTypeFile writeTargets.File = true writeTargets.MySQL = true writeTargets.ClickHouse = true case AccessLogStorageTypeES, AccessLogStorageTypeTCP, AccessLogStorageTypeSyslog, AccessLogStorageTypeCommand: baseType = selectedType writeTargets.MySQL = true default: baseType = selectedType writeTargets.File = true writeTargets.MySQL = true } return baseType, writeTargets } // ComposeStorageTypeDisplay 根据策略的 Type + WriteTargets 得到下拉框显示用的类型 code(用于编辑页回显) func ComposeStorageTypeDisplay(policyType string, writeTargets *AccessLogWriteTargets) string { policyType = NormalizeAccessLogStorageType(policyType) if policyType != AccessLogStorageTypeFile { return policyType } if writeTargets == nil { return AccessLogStorageTypeFile } if writeTargets.File && writeTargets.MySQL && writeTargets.ClickHouse { return AccessLogStorageTypeFileMySQLClickhouse } if writeTargets.File && writeTargets.MySQL { return AccessLogStorageTypeFileMySQL } if writeTargets.File && writeTargets.ClickHouse { return AccessLogStorageTypeFileClickhouse } return AccessLogStorageTypeFile }