Fields override order
As you may have noticed, the log fields are constantly being overwritten. It's important that you understand the order in which all this operation is executed.
Everything starts at the Base fields, go through PreHooks, AdHoc fields and end at the PostHooks:
Base fields: gets overriden by everyonePreHooks: overrideBase fields, gets overriden byAdHocsandPostHooksAdHoc fields: overrideBase fieldsandPreHooks, gets overriden byPostHooksPostHooks: overrides everyone
It means that if you define some field using the Fields method, it will be overriden by fields defined by the PreHooks method, if they have the same key. Example:
someLogger := logger.New(logger.DefaultConfig()). Fields(logger.LogFields{ "lvl": "Trying to override the 'lvl' field", "msg": "Trying to override the 'msg' field", "base-field": 1, "preHook": 1, "adhoc-field": 1, "postHook": 1, }). PreHooks(logger.Hooks{ "lvl": func(l logger.Log) interface{} { return "Trying to override the 'lvl' field (2)" }, "msg": func(l logger.Log) interface{} { return "Trying to override the 'msg' field (2)" }, "preHook": func(l logger.Log) interface{} { return 2 }, "adhoc-field": func(l logger.Log) interface{} { return 2 }, "postHook": func(l logger.Log) interface{} { return 2 }, }). PostHooks(logger.Hooks{ "lvl": func(l logger.Log) interface{} { return "Trying to override the 'lvl' field (4)" }, "msg": func(l logger.Log) interface{} { return "Trying to override the 'msg' field (4)" }, "postHook": func(l logger.Log) interface{} { return 4 }, }). Outputs(logger.OutputJsonToWriter(os.Stdout, nil))someLogger.Debug("some log", logger.LogFields{ "lvl": "Trying to override the 'lvl' field (3)", "msg": "Trying to override the 'msg' field (3)", "adhoc-field": 3, "postHook": 3,})/* { "msg": "some log", "lvl": 2, "base-field": 1, "preHook": 2, "adHoc-field": 3, "postHook": 4, }*/info
The lvl and msg fields will be the last to be applied, overriding everyone else. You cannot change this behaviour