LoggerMiddleware.default() <> MyOtherMiddleware().lift(...)
MyOtherMiddleware().logger().lift(...)
(same as adding LoggerMiddleware.default() in the chain as seen in the first option)
MyOtherMiddleware().lift(...).logger()
IdentityMiddleware<InterestingAction, InterestingAction, InterestingState>()
.logger()
.lift(...) // lift InterestingAction and InterestingState to AppAction and AppState
<> MyOtherMiddleware().lift(...)
Gives the Input Action and Action Source to be formatted as a string.
Default:
actionTransform: @escaping (InputActionType, ActionSource) -> String = {
"\n🕹 \($0)\n🎪 \($1.file.split(separator: "/").last ?? ""):\($1.line) \($1.function)"
}
Gives the action and action source string, formatted from previous parameter, to be logged or saved into a file
Default:
actionPrinter: @escaping (String) -> Void = { os_log(.debug, log: .default, "%{PUBLIC}@", $0) }
Gives the previous state, and the state after the reducers have changed it, so a diff string can be created.
Difference
struct contains helpers to compare multiline strings, and dumpToString
free function is a helper to stringify anything.
Alternatively you could stringify using JSONEncoder or any other tool. Be careful with performance, or provide an alternative queue
to avoid locking the main queue with heavy log task.
Returning nil
means that nothing has changed.
The default logger will give a "git diff" output, containing + and - for changed lines, including 2 lines of context before and after the change.
Default:
stateDiffTransform: @escaping (StateType?, StateType) -> String? = {
let stateBefore = dumpToString($0)
let stateAfter = dumpToString($1)
return Difference.diff(old: stateBefore, new: stateAfter, linesOfContext: 2, prefixLines: "🏛 ")
}
Gives the state diff string, formatted from previous parameter, to be logged or saved into a file.
Receiving nil
means that the state hasn't changed with this action.
Default:
stateDiffPrinter: @escaping (String?) -> Void = { state in
if let state = state {
os_log(.debug, log: .default, "%{PUBLIC}@", state)
} else {
os_log(.debug, log: .default, "%{PUBLIC}@", "🏛 No state mutation")
}
}
The queue to run the string transformation and printer. Use an alternative, low priority, serial queue to avoid locking the UI with logging operations.
Default:
queue: DispatchQueue = .main