Преглед изворни кода

add fatal exception reporting

split out capture exception code into separate method
Brian Gough пре 10 година
родитељ
комит
e04e6332e8
1 измењених фајлова са 45 додато и 29 уклоњено
  1. 45 29
      libraries/logger/logging-manager.coffee

+ 45 - 29
libraries/logger/logging-manager.coffee

@@ -6,43 +6,59 @@ module.exports = Logger =
 			name: name
 			name: name
 			serializers: bunyan.stdSerializers
 			serializers: bunyan.stdSerializers
 		return @
 		return @
-	
+
 	initializeErrorReporting: (sentry_dsn, options) ->
 	initializeErrorReporting: (sentry_dsn, options) ->
 		raven = require "raven"
 		raven = require "raven"
 		@raven = new raven.Client(sentry_dsn, options)
 		@raven = new raven.Client(sentry_dsn, options)
-	
+
+	captureException: (attributes, message, level) ->
+		error = attributes.err or attributes.error or message
+		req = attributes.req
+		if error?
+			tags = {}
+			extra = {}
+			# capture attributes and use *_id objects as tags
+			for key, value of attributes
+				tags[key] = value if key.match(/_id/) and typeof value == 'string'
+				extra[key] = value
+			# capture req object if available
+			if req?
+				extra.req =
+					method: req.method
+					url: req.originalUrl
+					query: req.query
+					headers: req.headers
+					ip: req.ip
+			# recreate error objects that have been converted to a normal object
+			if !(error instanceof Error) and typeof error is "object"
+				newError = new Error(error.message)
+				for own key, value of error
+					newError[key] = value
+				error = newError
+			# send the error to sentry
+			@raven.captureException(error, {tags: tags, extra: extra, level: level})
+
 	info : ()->
 	info : ()->
 		@logger.info.apply(@logger, arguments)
 		@logger.info.apply(@logger, arguments)
 	log : ()->
 	log : ()->
 		@logger.info.apply(@logger, arguments)
 		@logger.info.apply(@logger, arguments)
-	error: (attributes, args...)->
-		@logger.error(attributes, args...)
-		if @raven?
-			error = attributes.err or attributes.error
-			req = attributes.req
-			if error?
-				tags = {}
-				extra = {}
-				for key, value of attributes
-					tags[key] = value if key.match(/_id/) and typeof value == 'string'
-					extra[key] = value
-				if req?
-					extra.req =
-						method: req.method
-						url: req.originalUrl
-						query: req.query
-						headers: req.headers
-						ip: req.ip
-				# recreate error objects that have been converted to a normal object
-				if !(error instanceof Error) and typeof error is "object"
-					newError = new Error(error.message)
-					for own key, value of error
-						newError[key] = value
-					error = newError
-				@raven.captureError(error, {tags: tags, extra: extra})
-	err: ()->
-		@logger.error.apply(@logger, arguments)
+	error: (attributes, message, args...)->
+		@logger.error(attributes, message, args...)
+		@captureException(attributes, message, "error") if @raven?
+	err: () ->
+		@error.apply(this, arguments)
 	warn: ()->
 	warn: ()->
 		@logger.warn.apply(@logger, arguments)
 		@logger.warn.apply(@logger, arguments)
+	fatal: (attributes, message, callback) ->
+		@logger.fatal(attributes, message)
+		if @raven?
+			cb = (e) -> # call the callback once after 'logged' or 'error' event
+				callback()
+				cb = () ->
+			@captureException(attributes, message, "fatal")
+			@raven.once 'logged', cb
+			@raven.once 'error', cb
+		else
+			callback()
 
 
 Logger.initialize("default-sharelatex")
 Logger.initialize("default-sharelatex")