 
      - parameter echoToStdErr: If `true`, ASL will also echo log messages to
      the calling process's `stderr` output stream.
+
+     - parameter addTraceAttributes: If `true`, additional program trace
+     attributes will be included in each message logged to ASL. This will
+     include the filesystem path of the source code file, the source code
+     line of the call site, and the stack frame representing the caller.
+     You probably don't want this included in production code.
      */
-    public init(formatter: LogFormatter, echoToStdErr: Bool = true)
+    public init(formatter: LogFormatter, echoToStdErr: Bool = true, addTraceAttributes: Bool = false)
     {
         self.client = ASLClient(facility: "com.gilt.CleanroomLogger", useRawStdErr: echoToStdErr)
         self.formatters = [formatter]
         self.logLevelTranslator = { _ in return .warning }
+        self.addTraceAttributes = addTraceAttributes
     }
 
     /**


     - parameter echoToStdErr: If `true`, ASL will also echo log messages to
     the calling process's `stderr` output stream.
     */
    public init(logLevelTranslator translator: LogLevelTranslator, formatters: [LogFormatter], echoToStdErr: Bool = true)
    {
        self.client = ASLClient(facility: "com.gilt.CleanroomLogger", useRawStdErr: echoToStdErr)
        self.formatters = formatters
        self.logLevelTranslator = translator
    }

    /**

    */
    public func recordFormattedMessage(message: String, forLogEntry entry: LogEntry, currentQueue: dispatch_queue_t, synchronousMode: Bool)
    {
        autoreleasepool {

            let msgObj = ASLMessageObject(priorityLevel: logLevelTranslator(entry.severity), message: message)

            msgObj["CleanroomLogger.severity"] = String(entry.severity.rawValue)
            msgObj["CleanroomLogger.threadID"] = String(entry.callingThreadID)

            if addTraceAttributes {
                msgObj["CleanroomLogger.sourceFilePath"] = entry.callingFilePath
                msgObj["CleanroomLogger.sourceFileLine"] = String(entry.callingFileLine)
                msgObj["CleanroomLogger.callingStackFrame"] = entry.callingStackFrame
            }

            client.log(msgObj, logSynchronously: synchronousMode, currentQueue: currentQueue)
        }
    }
}
