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 } } // ParseStorageTypeAndWriteTargets 从下拉框选中的类型解析出「实际存储类型」与「写入目标」 // 用于创建/更新策略:options 按 baseType 填(如 file),writeTargets 按组合填。 func ParseStorageTypeAndWriteTargets(selectedType string) (baseType string, writeTargets *AccessLogWriteTargets) { 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 } // ResolveWriteTargetsByType 仅根据策略类型与 disableDefaultDB 计算写入目标(不依赖 writeTargets 字段) func ResolveWriteTargetsByType(policyType string, disableDefaultDB bool) *AccessLogWriteTargets { t := &AccessLogWriteTargets{} switch policyType { case AccessLogStorageTypeFileMySQL: t.File = true t.MySQL = true case AccessLogStorageTypeFileClickhouse: t.File = true t.ClickHouse = true case AccessLogStorageTypeFileMySQLClickhouse: t.File = true t.MySQL = true t.ClickHouse = true case AccessLogStorageTypeFile: t.File = true t.MySQL = !disableDefaultDB default: t.MySQL = !disableDefaultDB } if !t.File && !t.MySQL && !t.ClickHouse { t.File = true t.MySQL = true } return t } // ComposeStorageTypeDisplay 根据策略的 Type + WriteTargets 得到下拉框显示用的类型 code(用于编辑页回显) func ComposeStorageTypeDisplay(policyType string, writeTargets *AccessLogWriteTargets) string { 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 }