How can I log each request/response using Alamofire? How can I log each request/response using Alamofire? ios ios

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