How can I log each request/response using Alamofire?
There's a sweet little pod for this: https://github.com/konkab/AlamofireNetworkActivityLogger
Add this to your podfile:
pod 'AlamofireNetworkActivityLogger', '~> 2.0'
In your AppDelegate:
import AlamofireNetworkActivityLogger
Then in your didFinishLaunchingWithOptions
, add this:
NetworkActivityLogger.shared.level = .debugNetworkActivityLogger.shared.startLogging()
EDIT:I've actually encountered crashes with this in production. To be on the safe side, use "build flags" to only use this in debug, something like this:
#if DEBUG NetworkActivityLogger.shared.level = .debug NetworkActivityLogger.shared.startLogging()#endif
Something like this might be what you were looking for:
extension Request { public func debugLog() -> Self { #if DEBUG debugPrint(self) #endif return self }}
Usage:
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) .debugLog() .response {…}
If you want to print all responses, you could write your own response method, similar to the responseObject() method at the top of this tutorial:
http://www.raywenderlich.com/87595/intermediate-alamofire-tutorial
[Update: added below per the request from @trauzti.]
Here's how one might do the responseObject() approach in order to print output on every request.
Caveat lector: I haven't personally tested this code, and would probably make different choices in production. This simply shows how the Wenderlich tutorial code can include debug logging. Also note: since the tutorial is pre-Swift 2.0, I've used the old println() instead of print().
@objc public protocol ResponseObjectSerializable { init(response: NSHTTPURLResponse, representation: AnyObject)}extension Alamofire.Request { public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, NSError?) -> Void) -> Self { let serializer: Serializer = { (request, response, data) in #if DEBUG println("Request: \(request.URL)") #endif let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments) let (JSON: AnyObject?, serializationError) = JSONSerializer(request, response, data) if response != nil && JSON != nil { #if DEBUG println("Response:") debugPrint(JSON) #endif return (T(response: response!, representation: JSON!), nil) } else { #if DEBUG println("Failed Serialization:") debugPrint(serializationError) #endif return (nil, serializationError) } } return response(serializer: serializer, completionHandler: { (request, response, object, error) in completionHandler(request, response, object as? T, error) }) }}
Since Alamofire 5, the easiest way is to define an EventMonitor
subclass:
final class AlamofireLogger: EventMonitor { func requestDidResume(_ request: Request) { let body = request.request.flatMap { $0.httpBody.map { String(decoding: $0, as: UTF8.self) } } ?? "None" let message = """ ⚡️ Request Started: \(request) ⚡️ Body Data: \(body) """ NSLog(message) } func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value>) { NSLog("⚡️ Response Received: \(response.debugDescription)") }}
Then use it on your session:
let session = Session(eventMonitors: [ AlamofireLogger() ])
This sample code was adapted from https://github.com/Alamofire/Alamofire/issues/2867#issuecomment-509662892