Skip to content

Commit 1c1f6bb

Browse files
committed
initial commit
0 parents  commit 1c1f6bb

File tree

5 files changed

+187
-0
lines changed

5 files changed

+187
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.project

README.md

Whitespace-only changes.

install/manifest.cfc

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<cfcomponent extends="farcry.core.webtop.install.manifest" name="manifest">
2+
3+
<cfset this.name = "Raygun Logger" />
4+
<cfset this.description = "<strong>Raygun Logger</strong> logs errors to the <a href='http://raygun.io'>Raygun.IO</a> service" />
5+
<cfset this.lRequiredPlugins = "" />
6+
<cfset addSupportedCore(majorVersion="6", minorVersion="1", patchVersion="0") />
7+
8+
9+
<cffunction name="getStatus" output="false" access="public" returntype="string">
10+
11+
<cfif isdefined("application.config.raygun.apiKey") and len(application.config.raygun.apiKey)>
12+
<cfreturn "good" />
13+
<cfelse>
14+
<cfreturn "bad" />
15+
</cfif>
16+
</cffunction>
17+
18+
</cfcomponent>

packages/forms/configRaygun.cfc

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<cfcomponent displayname="Raygun.IO" hint="Settings for logging errors to Raygun.IO" extends="farcry.core.packages.forms.forms" output="false" key="raygun">
2+
3+
<cfproperty name="apiKey" type="string" default=""
4+
ftSeq="1" ftFieldSet="API" ftLabel="API Key" />
5+
6+
7+
</cfcomponent>

packages/lib/error.cfc

+161
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
<cfcomponent extends="farcry.core.packages.lib.error" output="false">
2+
3+
4+
<cffunction name="collectRequestInfo" access="public" returntype="struct" output="false" hint="Returns a struct containing information that should be included in every error report">
5+
<cfset var stResult = super.collectRequestInfo() />
6+
<cfset var headers = GetHttpRequestData().headers />
7+
<cfset var key = "" />
8+
9+
<cfif structkeyexists(headers,"X-User-Agent")>
10+
<cfset stResult["browser"] = headers["X-User-Agent"] />
11+
</cfif>
12+
<cfif structkeyexists(headers,"X-Forwarded-For")>
13+
<cfset stResult["remoteaddress"] = trim(listfirst(headers["X-Forwarded-For"])) />
14+
</cfif>
15+
16+
<cfloop collection="#arguments#" item="key">
17+
<cfset stResult[key] = arguments[key] />
18+
</cfloop>
19+
20+
<cfreturn stResult />
21+
</cffunction>
22+
23+
<cffunction name="logToRaygun" access="public" output="false" returntype="void" hint="Logs data to the couchdb">
24+
<cfargument name="type" type="string" required="true" hint="Log type" />
25+
<cfargument name="data" type="struct" requried="true" hint="A normalized error struct as produced by the core error library" />
26+
27+
<cfset var cfhttp = structnew() />
28+
<cfset var stMessage = structnew() />
29+
<cfset var i = 0 />
30+
<cfset var stSub = "" />
31+
<cfset var system = "" />
32+
<cfset var props = "" />
33+
<cfset var mf = "" />
34+
<cfset var osbean = "" />
35+
<cfset var oFile = "" />
36+
<cfset var aRoots = "" />
37+
<cfset var runtime = "" />
38+
39+
<cfif isdefined("application.config.raygun.apiKey") and len(application.config.raygun.apiKey)>
40+
<cfset system = createObject("java", "java.lang.System") />
41+
<cfset props = system.getProperties() />
42+
<cfset mf = createObject("java", "java.lang.management.ManagementFactory") />
43+
<cfset osbean = mf.getOperatingSystemMXBean() />
44+
<cfset oFile = createObject("java", "java.io.File") />
45+
<cfset aRoots = oFile.listRoots() />
46+
<cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>
47+
48+
<cfset stMessage["occurredOn"] = dateformat(arguments.data.datetime,"yyyy-mm-dd") & "T" & timeformat(arguments.data.datetime,"HH:mm:ss") & "Z" />
49+
<cfset stMessage["details"] = structnew() />
50+
<cfset stMessage["details"]["machineName"] = arguments.data.machinename />
51+
<cfset stMessage["details"]["version"] = JavaCast("null","") />
52+
<cfset stMessage["details"]["client"] = structnew() />
53+
<cfset stMessage["details"]["client"]["name"] = JavaCast("null","") />
54+
<cfset stMessage["details"]["client"]["version"] = JavaCast("null","") />
55+
<cfset stMessage["details"]["client"]["clientUrl"] = JavaCast("null","") />
56+
<cfset stMessage["details"]["error"] = structnew() />
57+
<cfset stMessage["details"]["error"]["innerError"] = JavaCast("null","") />
58+
<cfset stMessage["details"]["error"]["data"] = structnew() />
59+
<cfif structKeyExists(arguments.data, "type") and len(arguments.data.type)>
60+
<cfset stMessage["details"]["error"]["data"]["type"] = arguments.data.type />
61+
</cfif>
62+
<cfif structKeyExists(arguments.data, "errorcode") and len(arguments.data.errorcode)>
63+
<cfset stMessage["details"]["error"]["data"]["errorcode"] = arguments.data.errorcode />
64+
</cfif>
65+
<cfif structKeyExists(arguments.data, "detail") and len(arguments.data.detail)>
66+
<cfset stMessage["details"]["error"]["data"]["detail"] = arguments.data.detail />
67+
</cfif>
68+
<cfif structKeyExists(arguments.data, "extended_info") and len(arguments.data.extended_info)>
69+
<cfset stMessage["details"]["error"]["data"]["extended_info"] = arguments.data.extended_info />
70+
</cfif>
71+
<cfif structKeyExists(arguments.data, "queryError") and len(arguments.data.queryError)>
72+
<cfset stMessage["details"]["error"]["data"]["queryError"] = arguments.data.queryError />
73+
</cfif>
74+
<cfif structKeyExists(arguments.data, "sql") and len(arguments.data.sql)>
75+
<cfset stMessage["details"]["error"]["data"]["sql"] = arguments.data.sql />
76+
</cfif>
77+
<cfif structKeyExists(arguments.data, "where") and len(arguments.data.where)>
78+
<cfset stMessage["details"]["error"]["data"]["where"] = arguments.data.where />
79+
</cfif>
80+
<cfset stMessage["details"]["error"]["className"] = JavaCast("null","") />
81+
<cfset stMessage["details"]["error"]["message"] = arguments.data.message />
82+
<cfset stMessage["details"]["error"]["stackTrace"] = arraynew(1) />
83+
<cfloop from="1" to="#arraylen(arguments.data.stack)#" index="i">
84+
<cfset stSub = structnew() />
85+
<cfset stSub["lineNumber"] = arguments.data.stack[i].line />
86+
<cfset stSub["className"] = JavaCast("null","") />
87+
<cfset stSub["fileName"] = arguments.data.stack[i].template />
88+
<cfset arrayappend(stMessage["details"]["error"]["stackTrace"],stSub) />
89+
</cfloop>
90+
<cfset stMessage["details"]["environment"] = structnew() />
91+
<cfset stMessage["details"]["environment"]["processorCount"] = osbean.getAvailableProcessors() />
92+
<cfset stMessage["details"]["environment"]["osVersion"] = props["os.name"] & "|" & props["os.version"] />
93+
<cfset stMessage["details"]["environment"]["windowBoundsWidth"] = JavaCast("null","") />
94+
<cfset stMessage["details"]["environment"]["windowBoundsHeight"] = JavaCast("null","") />
95+
<cfset stMessage["details"]["environment"]["resolutionScale"] = JavaCast("null","") />
96+
<cfset stMessage["details"]["environment"]["currentOrientation"] = JavaCast("null","") />
97+
<cfset stMessage["details"]["environment"]["cpu"] = osbean.getProcessCpuTime() />
98+
<cfset stMessage["details"]["environment"]["packageVersion"] = props["java.vm.vendor"] & "|" & props["java.runtime.version"] & "|" & props["java.vm.name"] />
99+
<cfset stMessage["details"]["environment"]["architecture"] = props["os.arch"] />
100+
<cfset stMessage["details"]["environment"]["totalPhysicalMemory"] = osbean.getTotalPhysicalMemorySize() />
101+
<cfset stMessage["details"]["environment"]["availablePhysicalMemory"] = osbean.getFreePhysicalMemorySize() />
102+
<cfset stMessage["details"]["environment"]["totalVirtualMemory"] = JavaCast("null","") />
103+
<cfset stMessage["details"]["environment"]["availableVirtualMemory"] = JavaCast("null","") />
104+
<cfset stMessage["details"]["environment"]["diskSpaceFree"] = arraynew(1) />
105+
<cfloop from="1" to="#arraylen(aRoots)#" index="i">
106+
<cfset arrayappend(stMessage["details"]["environment"]["diskSpaceFree"],aRoots[i].getFreeSpace()) />
107+
</cfloop>
108+
<cfset stMessage["details"]["environment"]["deviceName"] = JavaCast("null","") />
109+
<cfset stMessage["details"]["environment"]["locale"] = JavaCast("null","") />
110+
<cfset stMessage["details"]["tags"] = JavaCast("null","") />
111+
<cfset stMessage["details"]["userCustomData"] = structnew() />
112+
<cfset stMessage["details"]["userCustomData"]["instanceName"] = arguments.data.instanceName />
113+
<cfset stMessage["details"]["userCustomData"]["browser"] = arguments.data.browser />
114+
<cfif isdefined("application.plugins")>
115+
<cfset stMessage["details"]["userCustomData"]["plugins"] = application.plugins />
116+
</cfif>
117+
<cfif isdefined("application.fcstats.updateapp")>
118+
<cfset stMessage["details"]["userCustomData"]["appStart"] = dateformat(application.fcstats.updateapp.when[application.fcstats.updateapp.recordcount],"yyyy-mm-dd") & "T" & timeformat(application.fcstats.updateapp.when[application.fcstats.updateapp.recordcount],"HH:mm:ss") & "Z" />
119+
</cfif>
120+
<cfset stMessage["details"]["request"] = structnew() />
121+
<cfset stMessage["details"]["request"]["hostName"] = arguments.data.host />
122+
<cfset stMessage["details"]["request"]["url"] = arguments.data.scriptname />
123+
<cfset stMessage["details"]["request"]["httpMethod"] = CGI.REQUEST_METHOD />
124+
<cfset stMessage["details"]["request"]["ipAddress"] = arguments.data.remoteaddress />
125+
<cfset stMessage["details"]["request"]["queryString"] = arguments.data.querystring />
126+
<cfset stMessage["details"]["request"]["form"] = FORM />
127+
<cfset stMessage["details"]["request"]["headers"] = getHttpRequestData().headers />
128+
<cfset stMessage["details"]["request"]["data"] = CGI />
129+
<cfset stMessage["details"]["request"]["raw"] = JavaCast("null","") />
130+
131+
<cfhttp url="https://api.raygun.io/entries" method="post" charset="utf-8" timeout="0">
132+
<cfhttpparam type="header" name="Content-Type" value="application/json"/>
133+
<cfhttpparam type="header" name="X-ApiKey" value="#application.config.raygun.apiKey#"/>
134+
<cfhttpparam type="body" value="#serializeJSON(stMessage)#" />
135+
</cfhttp>
136+
</cfif>
137+
</cffunction>
138+
139+
140+
<cffunction name="logData" access="public" output="false" returntype="void" hint="Logs error to application and exception log files">
141+
<cfargument name="log" type="struct" required="true" />
142+
<cfargument name="bApplication" type="boolean" required="false" default="true" />
143+
<cfargument name="bException" type="boolean" required="false" default="true" />
144+
<cfargument name="bCouch" type="boolean" required="false" default="true" />
145+
146+
<cfset var errorJSON = "" />
147+
<cfset var logtype = "error" />
148+
149+
<cfif structkeyexists(arguments.log,"logtype")>
150+
<cfset logtype = arguments.log.logtype />
151+
<cfset structdelete(arguments.log,"logtype") />
152+
</cfif>
153+
154+
<cfif logtype eq "error">
155+
<cfset logToRaygun(logtype,arguments.log) />
156+
</cfif>
157+
158+
<cfset super.logData(argumentCollection=arguments) />
159+
</cffunction>
160+
161+
</cfcomponent>

0 commit comments

Comments
 (0)