action/log/log.go (111 lines of code) (raw):
package log
import (
"fmt"
"github.com/seata/seata-ctl/action/log/logadapter"
"github.com/seata/seata-ctl/model"
"github.com/seata/seata-ctl/tool"
"github.com/spf13/cobra"
"gopkg.in/yaml.v3"
"os"
)
var LogCmd = &cobra.Command{
Use: "log",
Short: "get seata log",
Run: func(cmd *cobra.Command, args []string) {
err := getLog()
if err != nil {
tool.Logger.Errorf("get log error: %s", err)
}
},
}
func init() {
LogCmd.PersistentFlags().StringVar(&Level, "level", DefaultLogLevel, "seata log level")
LogCmd.PersistentFlags().IntVar(&Number, "number", DefaultNumber, "seata number")
LogCmd.PersistentFlags().StringVar(&Label, "label", "{}", "seata label")
LogCmd.PersistentFlags().StringVar(&Start, "start", "", "seata start")
LogCmd.PersistentFlags().StringVar(&End, "end", "", "seata end")
}
func getLog() error {
context, currency, err := getContext()
if err != nil {
return err
}
logType := context.Types
var client logadapter.LogQuery
var filter = make(map[string]interface{})
switch logType {
case ElasticSearchType:
{
client = &logadapter.Elasticsearch{}
filter = buildElasticSearchFilter()
}
case LokiType:
{
client = &logadapter.Loki{}
filter = buildLokiFilter()
}
case LocalType:
{
client = &logadapter.Local{}
filter = buildLocalFilter()
}
}
if client == nil {
return fmt.Errorf("can not get client")
}
err = client.QueryLogs(filter, currency, Number)
if err != nil {
return err
}
return nil
}
func getContext() (*model.Cluster, *logadapter.Currency, error) {
file, err := os.ReadFile("config.yml")
if err != nil {
return nil, nil, fmt.Errorf("read config.yml error: %s", err)
}
var config model.Config
err = yaml.Unmarshal(file, &config)
if err != nil {
return nil, nil, fmt.Errorf("unmarshal config.yml error: %s", err)
}
contextName := config.Context.Log
for _, cluster := range config.Log.Clusters {
if cluster.Name == contextName {
currency := logadapter.Currency{
Address: cluster.Address,
Source: cluster.Source,
Username: cluster.Username,
Password: cluster.Password,
Index: cluster.Index,
}
return &cluster, ¤cy, nil
}
}
return nil, nil, fmt.Errorf("failed to find context in config.yml")
}
func buildElasticSearchFilter() map[string]interface{} {
filter := make(map[string]interface{})
filter["query"] = Label
return filter
}
func buildLokiFilter() map[string]interface{} {
filter := make(map[string]interface{})
filter["query"] = Label
if Start != "" {
filter["start"] = Start
}
if End != "" {
filter["end"] = End
}
return filter
}
func buildLocalFilter() map[string]interface{} {
filter := make(map[string]interface{})
if Level != "" {
filter["logLevel"] = Level
} else {
//reset the constants value
filter["logLevel"] = DefaultLocalLogLevel
}
return filter
}