| package log |
| |
| var formatterCreators = map[string]CreateFormatterFunc{} |
| |
| // CreateFormatterFunc is a function which creates a new instance |
| // of a Formatter. |
| type CreateFormatterFunc func(name, kind string) (Formatter, error) |
| |
| // createFormatter creates formatters. It accepts a kind in {"text", "JSON"} |
| // which correspond to TextFormatter and JSONFormatter, and the name of the |
| // logger. |
| func createFormatter(name string, kind string) (Formatter, error) { |
| if kind == FormatEnv { |
| kind = logxiFormat |
| } |
| if kind == "" { |
| kind = FormatText |
| } |
| |
| fn := formatterCreators[kind] |
| if fn == nil { |
| fn = formatterCreators[FormatText] |
| } |
| |
| formatter, err := fn(name, kind) |
| if err != nil { |
| return nil, err |
| } |
| // custom formatter may have not returned a formatter |
| if formatter == nil { |
| formatter, err = formatFactory(name, FormatText) |
| } |
| return formatter, err |
| } |
| |
| func formatFactory(name string, kind string) (Formatter, error) { |
| var formatter Formatter |
| var err error |
| switch kind { |
| default: |
| formatter = NewTextFormatter(name) |
| case FormatHappy: |
| formatter = NewHappyDevFormatter(name) |
| case FormatText: |
| formatter = NewTextFormatter(name) |
| case FormatJSON: |
| formatter = NewJSONFormatter(name) |
| } |
| return formatter, err |
| } |
| |
| // RegisterFormatFactory registers a format factory function. |
| func RegisterFormatFactory(kind string, fn CreateFormatterFunc) { |
| if kind == "" { |
| panic("kind is empty string") |
| } |
| if fn == nil { |
| panic("creator is nil") |
| } |
| formatterCreators[kind] = fn |
| } |