raven.js๋ฅผ ๋น๋๊ธฐ์์ผ๋ก ๋ก๋ํ ์ ์์ง๋ง ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋๋๋ ๋์ ์ค๋ฅ๋ฅผ ์บก์ฒํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. (Google Analytics๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ก๋๋ ๋๊น์ง ์ด๋ฒคํธ๋ฅผ ๋ณ์์ ์ ์ฅํ์ฌ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๊ณผ ์ ์ฌ).
์ฌ๊ธฐ ๋ด๊ฐ ์ง๊ธ๊น์ง ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์์ต๋๋ค: https://gist.github.com/karolisdzeja/8010574
๊ทธ๋ฌ๋ ๊ทธ๋ ๊ฒ ํ๋ฉด Raven์ด ์ผ๋ฐ์ ์ผ๋ก ์ ๊ณตํ๋ ์ผ๋ถ ์ ๋ณด์ ์ธ๋ถ ์ ๋ณด๊ฐ ์์ค๋ฉ๋๋ค. ์ด์ ์ ์ฌํ๊ฒ ์ ์ฒด ์ค๋ฅ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
+1
+1
+1
+1
์ด์ ๋ํด ์ธ๊ธํ ๋ชจ๋ ์ฌ๋ - @karolisdzeja์ ์๋ฃจ์ ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
๊ถ๊ทน์ ์ผ๋ก Raven.js ์์ค๊ฐ ํ์ด์ง์ ์์ ๋ ์๋ํด์ผ ํ๋ ๊ธฐ๋ฅ์ Raven.js ์์ค์ ์ด๋ป๊ฒ ์ถ๊ฐํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ํญ์ ๊ถ๊ทน์ ์ผ๋ก ๋ง์ถคํ ์๋ฃจ์ ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๊ปํด์ผ ๋ฌธ์์ "๋ฐฉ๋ฒ"์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
@benvinegar ์๋ฃจ์ ์ ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง ์ด๊ฒ์ด ๊ณต์์ ์ผ๋ก ์ง์๋๊ณ ๋ฌธ์ํ๋๋ค๋ฉด ๋ ์ข์ ๊ฒ์ ๋๋ค. ๋ฌด์์ ์์ ์ ํ๊ฐํ๋ ๊ฒ๋ณด๋ค Sentry ํ์ ์ ๋ขฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ง์กฑํฉ๋๋ค.
์ค์ ๋ก ํจ์ฌ ๋ ๋์ ์๋ฃจ์ ์ Twitter์ JS SDK ์ฝ๋์ ๊ฐ์ ๊ฒ์ ๋๋ค. https://dev.twitter.com/web/javascript/loading
ํ์ด์ง ๋ก๋ ์ ํจ์ ๋๊ธฐ์ด์ ์ค์ ํ ๋ค์ ์ธ๋ถ js๊ฐ ๋ก๋๋ ๋ ์ฌ์ฉ๋์ด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๊ต์ฒดํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ API ํธ์ถ์ด ํ๋ก์์ ๋ํ .ready() ํธ์ถ๊ณผ ๊ฐ์ ๊ฒ์ ํต๊ณผํ๋์ง ํ์ธํ์ญ์์ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ํจ์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ํ๋ก์ํ ํ์ ์์ด captureMessage๊ฐ ์๋๋ผ js๊ฐ ๋ก๋๋๊ธฐ ์ ์ ๋ชจ๋ ํธ์ถ์ ๋๊ธฐ์ด์ ๋ฃ์ ์ ์์ต๋๋ค.
raven.js๋ฅผ ๋น๋๊ธฐ/์ง์ฐ์ผ๋ก ๋ก๋ํ ์ ์๊ธฐ๋ฅผ ์ํ๋ฉฐ ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
์์ ์ ๋ค๋ฅธ ๋ฌธ์ : window.onerror๋ฅผ ๋ฐฉํดํ๊ณ ํฌํจ๋์ง ์์ ๋ช ๊ฐ์ง ์ ์ญ ๋ณ์๋ฅผ ๋์ ํฉ๋๋ค.
๋ํ raven.js๊ฐ ๋ก๋๋ ๋ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ traceKitWindowOnError ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์์ ์์ ์ ์ฝ๊ฐ ๋ค์ ์์ ํ์ต๋๋ค. https://gist.github.com/oroce/ec3786ba7eff59963842220c3ffc56b4
๋์ ๋ณ์๊ฐ ์์ต๋๋ค. window.onerror
ํธ๋ค๋ฌ๋ฅผ ์ ์งํ์ง๋ง ์์ ๋กญ๊ฒ window.addEventListener('error', fn)
.
ํ์ฌ ๊ฐ์ฅ ํฐ ๋์์ traceKitWindowOnError
๋ฅผ Raven์์ ๋ด๋ณด๋ธ ํจ์๋ก ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ํธ์ถ๋๋ ํจ์์ด๊ธฐ ๋๋ฌธ์: https://github.com/getsentry/raven-js/blob/master/dist/raven.js#L2074
๋๋ ์ฐ๋ฆฌ์๊ฒ ์ ์ ํ ์คํ ์ถ์ ์ด ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฐ๋ฆฌ๋ ์ง๊ธ ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ ๋์ ๊ฒ์ ๊ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ๋จ์ ์ด ์์ต๋๋ค.
window.onerror
์ ์์กดํจ์ผ๋ก์จ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ ์ถ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.install()
๊ฐ ๊ณ์ธก์ ์๋/์บ์นํ๋ ์ด์ ์
๋๋ค.๋ฐ๋ผ์ ์ ์ฌ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ์ ๋ฎ์ ํ์ง์ ์ค๋ฅ ๋ณด๊ณ ์์ ๊ตํํ๊ณ ์์ต๋๋ค. ๋น๋๊ธฐ ์คํ์ด ์ค์ํ ๊ฒฝ์ฐ Raven์ ๊ณ ์ ํ ์ฝ๋์ ํจ๊ป ๋ฒ๋ค๋ก ์ ๊ณตํ์ฌ ํจ๊ป ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@benvinegar ๋น์ ์ด ์์ ํ ์ณ์์ต๋๋ค. ๊ณต๊ฐ๋์ง ์์ ์ ํ๋ฆฌ์ผ์ด์ (์ผ๋ช Google์ ํ์ด์ง์ ๋๋ฌํ์ง ์์)์์๋ ๊ณ ์ ์ ์ธ(์ฐจ๋จ) ๊น๋ง๊ท ๋ฐฉ์์ ์์ ํ ๋ฌธ์ ๊ฐ ์์ง๋ง Google ํ์ด์ง ์ธ์ฌ์ดํธ ํฌ์ธํธ๊ฐ ์ค์ํ ๊ณต๊ฐ ์ฌ์ดํธ๊ฐ ์๋ ์ฆ์ ์ต์ ํํด์ผ ํฉ๋๋ค. ์ 3์ ์ฝ๋๋ฅผ ๋ก๋ํ๋ ๋ฐฉ๋ฒ(์ด๊ฒ์ ux, ์๋ ๋ฐ ๋ ๋์ ๊ฒ์ ๊ฒฐ๊ณผ ์์น๋ฅผ ์ํด ์ง๋ถํ ์ฉ์๊ฐ ์๋ ๊ฐ๊ฒฉ์ ๋๋ค).
๋ํ raven์ ๋ฒ๋ค๋ก ๋ฌถ๋ ๊ฒ์ด ํด๊ฒฐ์ฑ ์ด์ง๋ง factor-bundle ๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๋ค์ ์ฌ๋ฌ ๊ฐ๋ก ๋ถํ ํ๊ฑฐ๋ ๋ ๋น ๋ฅธ ์๋๋ฅผ ์ป๊ธฐ ์ํด ์ฌ๋ฌ ๋ฒ๋ค์ ํฌํจํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ ์ ์ ์๋ ์ต์ ํ๋ก ํ๋ก ํธ์๋ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ์ฆ์, ์์ ์๋ฃจ์ ์ด ๋ ๋์ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ง๋ง ์ ์์ ์ํด ์ด๋ ค ์์ต๋๋ค.
๊ทธ๋ค์ ๋ชจ๋ ์ฅ๋จ์ ์ด ์์ผ๋ฏ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์ ๋ต์ ๋ฌธ์ํํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ด๋ฏ๋ก ํน์ ์น ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ๋ต์ ์ ์ฉํ ๊ฒ์
๋๋ค.
๋น๋๊ธฐ ์ ๋ต์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ๋ง ๋ก๋ํ๋ ๋์ onload
์ด๋ฒคํธ ์ดํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ์ฌ onload
์ด๋ฒคํธ ๋ ๋๋ง์ ์ฐจ๋จํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.
/**
* Setup Js error lazy tracking
* - Pros: doesn't block rendering, onload event
* - Cons: lower quality error reports for lazy errors
*
* <strong i="9">@author</strong> vinhlh
*
* <strong i="10">@param</strong> {object} window
* <strong i="11">@param</strong> {object} labJs
* <strong i="12">@param</strong> {string} ravenCdn
* <strong i="13">@param</strong> {string} sentryDsn
*/
(function(window, labJs, ravenCdn, sentryDsn) {
var errors = [];
var oldOnError = window.onerror;
window.onerror = function() {
errors.push(arguments);
oldOnError && oldOnError.apply(this, arguments);
};
window.addEventListener('load', function() {
labJs
.script(ravenCdn)
.wait(function() {
window.onerror = oldOnError;
Raven.config(sentryDsn).install();
errors.forEach(function(args) {
window.onerror.apply(this, args);
});
});
});
})(window, $LAB, 'raven-js-3.8.1/dist/raven.js', 'https://[email protected]/9');
์์ ์ ๊ณต๋ ๊ฒ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์ค๋ํซ์ ๋ฌธ์ํํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ฌ๊ธฐ์๋ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
๋ค๋ฅธ ์๊ฒฌ ํ๋๋ง ๋. ์ด๋ฌํ ์ ์ถฉ์์ ์์ฉ ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์ ๋ Raven.js์์ ํ์๋ ๊ฒ์ผ๋ก (์๋ชป) ๋ฏฟ์ด์ง๋ ์ ์ถฉ์ค๋ ์ค๋ฅ์ ๋ํ ์ฌ์ฉ์์ ๋ง์ ์ง์ ํฐ์ผ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ๋๋ค์๊ฒ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ๋ฉด "์คํ ์ถ์ ์ด ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?"๋ผ๊ณ ๋ฌป๋ ์ฌ๋๋ค์ด ์ ์ ๋ ๋ง์์ง๊ณ ์ด ๋ฐฉ์์ด ์ถฉ์ค๋๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ถ๋ง ์ฌํญ์ด ์๊ธธ๊น๋ด ๋๋ ต์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ธฐ๊บผ์ด ๋ฐ์๋ค์ด์ง๋ง ์ผํค๊ธฐ ํ๋ ์์ฝ์ ๋๋ค. ๐
@benvinegar ๋๋ ๋น์ ์ด ์ด๋์์ ์๋์ง ์์ ํ ์์์ต๋๋ค. ๋๋ ๋ด๊ฐ ๋ฌด์์ํ๊ณ ์๋์ง ์๊ณ ์์ผ๋ฏ๋ก ์คํ ์ถ์ ์ด ์์ด์ผ ํ ๋ ์คํ
@oroce โ ์, ์ด๊ฒ์ ์ด ์ค๋ ๋์ ์๋ ์ฌ๋๋ค๊ณผ 100% ๊ด๋ จ์ด ์์ง๋ง ์ฃผ์ ์ฌํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ์ง ์๊ณ ์ด ์ ๋ต์ ์ถ๊ตฌํ ์ ์๋ ์ฌ๋๋ค(์: ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ)์ ๋๋ค.
Install
๋ฌธ์์ ์ค๋ํซ์ ์ถ๊ฐํ ๊ณํ๊ณผ ํจ๊ป ์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ๊ณต๊ฐํ๊ณ ์ฌ๊ธฐ์ ๊ธฐ์ ๋ง์ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ์ฐธ์ฌํด ์ฃผ์ ์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ค์์ Raven ๋ฉ์๋์ ๋ํ ํธ์ถ์ ํฌ๋ช ํ๊ฒ ๋๊ธฐ์ด์ ๋ฃ๋ ๋ฐ ์ฌ์ฉํ๋ ์ค๋ํซ์ ๋๋ค. https://gist.github.com/Kl0tl/ed0a9e74462a2294f4c8842f5389d8ea.
๋ชจ์๋ ํ์คํ ๊ฐ์ ๋ ์ ์์ง๋ง ๋ ๋ง์ ๊ธฐ๋ฅ์ ๋ณต์ ํ ํ์๊ฐ ์์ต๋๋ค. Object.defineProperty
๋ Raven
๊ฐ ์ฐฝ์ ์ฐ๊ฒฐ๋ ์งํ ํํฌ๋ฅผ ํ์ฉํ์ง๋ง ์คํฌ๋ฆฝํธ ๋ก๋ ์ด๋ฒคํธ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ณต์์ ์ธ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
์ฌ๋ฌ๋ถ, Raygun์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ์์ ๋ฌธ์ ๊ฐ ์๋์ง ๊ถ๊ธํ์ญ๋๊น?
์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ ์ฒ๋ฆฌํ๋ ๊ฒ ๊ฐ์ฃ ? ํ๋ฆด ์๋ ์์ง๋ง :)
@Kl0tl ์์ฃผ ์ข์์, ๊ฐ์ฌํฉ๋๋ค
์ด๊ฒ์ ๋์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์์ง stage3์ ์์ง๋ง webpack์์ ์ง์ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋จ์ํ ์ฝ์์ ๋๊ธฐ์ด๋ก ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ ์ฐจ๋ฉด ๋ชจ๋ ์ฝ๋ฐฑ์ด ์์๋๋ก ์คํ๋ฉ๋๋ค.
const RavenPromise = import('raven-js'); // async load raven bundle
// initial setup
RavenPromise.then(Raven => {
Raven.config('url-to-sentry', options).install();
}):
// exported log function
export const logMessage = (level, logger, text) => {
RavenPromise.then(Raven => {
Raven.captureMessage(text, {level, logger});
});
};
@zanona ์ ๋ง์ฐฌ๊ฐ์ง๋ก Raygun ๋๋ Google Analytics ์ ๊ฐ์ ๊ฐ๋จํ ์ถ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๋ค์์ analytics.js ์ ์์ ๋๋ค.
<script async src="https://www.google-analytics.com/analytics.js"></script>
<script>
window.ga = window.ga || function () {
(ga.q = ga.q || []).push(arguments)
}
ga.l = +new Date
ga('create', 'UA-XXXXX-Y', 'auto')
ga('send', 'pageview')
</script>
@benvinegar Raven.js ์์ ์ด์ ๊ฐ์ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น? ์๋ง ๋ฏธ๋์๋?
@kireerik ๊ทธ๊ฒ์ ํ์คํ ๊ตฌํ๋
@kamilogorek ํ๋ฅญํ๊ฒ ๋ค๋ฆฝ๋๋ค (ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ฃจ์ ์ผ๋ก ๋ง์์ ๋ค์ง ์์ต๋๋ค). ๊ด์ฐฎ์์!
๊ด์ฌ ์๋ ์ฌ๋์ ์ํด ravenjs๋ฅผ ๋น๋๊ธฐ์์ผ๋ก ๋ก๋ํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์ ์ ์ ์ํ์ต๋๋ค.
https://gist.github.com/MaxMilton/e2338b02b7381fc7bef2ccd96f434201
@oroce ์ ์ฝ๋ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง ์ฃผ์ ์ฐจ์ด์ ์ ๋ ๋์ ์ฑ๋ฅ์ ์ํด ๋ฌธ์ ํค๋์ ์ผ๋ฐ <script async src'='...">
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์
๋๋ค(๋ธ๋ผ์ฐ์ ๋ ๋ฆฌ์์ค ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ ์ผ์ฐ ์์ฝํ ์ ์์). IIFE ๋ฐ ๊ธฐํ ์ฝ๊ฐ์ ์กฐ์ .
@MaxMilton ๋ฉ์ง๋ค์ ! ๋๋ ๋น์ ์ ๊ธฐ๋ฐ์ผ๋ก ๋๋ง์ ๋ง์ ๋ง๋ค์์ต๋๋ค.
<script async src="https://cdn.ravenjs.com/3.22.1/raven.min.js" crossorigin="anonymous" id="raven"></script>
<script>
(function (sentryDataSourceName) {
var raven = document.getElementById('raven')
, isNotLoaded = true
, errors = []
raven.onreadystatechange = raven.onload = function () {
if (isNotLoaded) {
Raven.config(sentryDataSourceName).install()
isNotLoaded = !isNotLoaded
errors.forEach(function (error) {
Raven.captureException(error[4] || new Error(error[0]), {
extra: {
file: error[1]
, line: error[2]
, col: error[3]
}
})
})
}
}
window.onerror = function (message, source, lineNumber, colmnNumber, error) {
if (isNotLoaded)
errors.push([message, source, lineNumber, colmnNumber, error])
}
})('https://<key>@sentry.io/<project>')
</script>
์ง๋ฌธ์ด ์์ต๋๋ค.
script
ํ๊ทธ์ crossorigin
์์ฑ์ ์ ์ํด์ผ ํฉ๋๊น?์ด๋ป๊ฒ ์๊ฐํด? ์ด์ ๋ํ ์ ์(@kamilogorek)์ ์๊ฒฌ์ ๋ฌด์์ ๋๊น?
@kireerik ์คํฌ๋ฆฝํธ์ crossorigin="anonymous"
๋ฅผ ๋ฃ์ผ๋ฉด window.onerror
์ด๋ฒคํธ๋ก ์ค๋ฅ(ํด๋น ์ธ๋ถ ์คํฌ๋ฆฝํธ์์)๋ฅผ ์์ ํ ์บก์ฒํ ์ ์์ต๋๋ค. ๋ํ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ ์์ฒญ๊ณผ ํจ๊ป ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ด๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ฌ ๋ฆฌ์์ค์์ ์ํ๋ ๊ฒ์
๋๋ค. MDN ์ฐธ์กฐ 1 , MDN ์ฐธ์กฐ 2 .
์ค๋ฅ๋ฅผ ์ ๋ฌํ๋ฉด _๋๋ถ๋ถ_ ์๋ํฉ๋๋ค. ์ค๋๋ ๋ธ๋ผ์ฐ์ (์: Firefox ๋ฒ์ 31 ์ด์ )์ ์ฃผ์ ์ฌํญ์ columnNo ๋๋ Error Object ์์ฑ์ window.onerror
์ด๋ฒคํธ์ ์ ๋ฌํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ๋ง ์ข์ ํธํ์ฑ์ ์ํ๋ค๋ฉด ์ถ๊ฐ ์์
์ ์ํํด์ผ ํฉ๋๋ค. MDN ์ฐธ์กฐ .
ํธ์ง: ๋ณด๋์ค ํ: crossorigin
๊ฐ ์์ด ์
๋ ฅํ๋ฉด crossorigin="anonymous"
์ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ ๋ ์ด์ ์์ง ๋ฅผ ํจ์ฌ ๋ ์์ฐ ์ค๋น๊ฐ ๋ ๊ฒ์ผ๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค.
๋ชจ๋ ๊ฒ์ ์ดํดํ๋ ค๋ฉด ์์ง๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ๋น ๋ฅธ ๋ณต์ฌ+๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ์ ํธํ๋ ๊ฒฝ์ฐ ์ถ์๋ ๋ฒ์ ์ด ์์ต๋๋ค.
<!-- Sentry JS error tracking -->
<script async src="https://cdn.ravenjs.com/3.22.0/raven.min.js" crossorigin id="raven"></script>
<script>
(function(b,e,c,d){b.onerror=function(a,b,d,f,g){c||e.push([a,b,d,f,g])};b.onunhandledrejection=function(a){c||e.push([a.reason.reason||a.reason.message,a.type,JSON.stringify(a.reason)])};d.onreadystatechange=d.onload=function(){c||(c=!0,
Raven.config("___PUBLIC_DSN___").install(),
b.onunhandledrejection=function(a){Raven.captureException(Error(a.reason.reason||a.reason.message),{extra:{type:a.type,reason:JSON.stringify(a.reason)}})},e.forEach(function(a){Raven.captureException(a[4]||Error(a[0]),{extra:{file:a[1],line:a[2],col:a[3]}})}))}})(window,[],!1,document.getElementById("raven"));
</script>
<link rel="preconnect" href="https://sentry.io">
___PUBLIC_DSN___
๋ฅผ DSN์ผ๋ก ๋ฐ๊พธ๊ณ ๋ซ๋ </head>
ํ๊ทธ ๊ทผ์ฒ์ ๋จธ๋ฆฌ ๋ถ๋ถ์ ๋ถ์ฌ๋ฃ์ต๋๋ค. ๋๋ <head>
๋ฐ <body>
ํ๊ทธ๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ํ์คํฐ๋ผ๋ฉด ์ค์ํ/์ฑ ๋ฆฌ์์ค(์: CSS) ๋ค์ ๋งจ ์์ ๋ถ์ฌ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ์ด ์ฝ๋ ๋ค์์ ๋ก๋๋ ์คํฌ๋ฆฝํธ์์ ์ค๋ฅ๋ฅผ ์บก์ฒํ ์ ์๋๋ก ๋ค๋ฅธ JavaScript ๋ณด๋ค ๋จผ์ ์์ด์ผ ํฉ๋๋ค.
๋ด ๋น ๋ฅธ ํ ์คํธ์์๋ ๋ฌธ์ ๊ฐ ์์์ผ๋ฏ๋ก ๊ธฐ๋ณธ ๋๊ธฐ ๋ฒ์ ๋ณด๋ค ์ด๊ฒ์ ์ฌ์ฉํ์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค.
๋๊ตฌ๋ ์ง ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ๋ํ ์์ด๋์ด๊ฐ ์์ผ๋ฉด ๋ฃ๊ณ ์ถ์ต๋๋ค.
์์ : ์ด ๋๊ธ์ ์ฌ๋ฌ ๋ฒ ์์ ํด์ ์ฃ์กํฉ๋๋ค. ์ง๊ธ์ ์์ ์ ์ธ ์์ค์ ๋๋ค. ์ด ์ํ๋ก ๊ฐ์ ธ ์ค๋ ๊ฒ์ด ์ฌ๋ฏธ์์์ต๋๋ค! : ์ค๋ง์ผ :
์ผํธ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ก๋๋๋ฉด ์ค๋ฅ ๋ณด๊ณ ํ์ง์ด ๋ก๋ํ๋ ๊ฒ๊ณผ ์ ํํ ๋์ผํฉ๋๋ค. (๊ทธ๋ ๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ทธ๋ฅ ํ์ธ)
๋ํ ์ถ๊ฐํ๊ณ ์ถ์ ๋ฌธ์์์ lib๊ฐ ๋ก๋๋ ๋๊น์ง Raven์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ต์ ์ ์ฝ๋ฐฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ์ปจํ ์คํธ ๋ฑ์ ์ค์ ํ ์ ์์ต๋๊น?
@dalyr95์ ๋์ํฉ๋๋ค. ์ฝ๋ฐฑ ํจ์๊ฐ ์ ์ฉํ ๊ฒ์ ๋๋ค. ์๋ง๋ ์ปค์คํ ๋ ์ด๋ธ ๋ก๋ ์ด๋ฒคํธ์ผ ๊ฒ์ ๋๋ค.
@dalyr95์ ๋น์ทํ ์์ฒญ์ด ์์ต๋๋ค. ํ์ฌ setUserContext()
๋ฅผ ํธ์ถํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ๊ฐ์ฒด์์ ์ฝ๋ฐฑ์ ์ ๋ฌํ ์ ์๋ ๊ฒ๋งํผ ๊นจ๋ํ์ง ์์ ๋ก๋ ์ค๋ํซ์ ์์ ํ๋ ๊ฒ์
๋๋ค.
์๋ ํ์ธ์, ๋ฌธ์ ๋ฅผ ์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ฐ๋ฆฌ๋ SDK์ ๋ค์ ์ฃผ์ ๋ฆด๋ฆฌ์ค์ ๋ํ ์์
์ ์งํ ์ค์
๋๋ค.
๊ทธ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ํ์ฌ ๋ฒ์ (์ฃผ์ ๋๋ ๋ณด์ ๋ฒ๊ทธ ์ ์ธ)์ ๋ํ ์์
์ ๋ณด๋ฅํด์ผ ํ์ต๋๋ค.
๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๋ชจ๋ ๋ณด๊ณ ๋ฅผ ๋ฐ์ ์ ์๋๋ก ๋
ธ๋ ฅํ ๊ฒ์ด๋ฏ๋ก ์กฐ๊ธ๋ง ๊ธฐ๋ค๋ ค ์ฃผ์ญ์์ค.
์ดํดํด ์ค์ ๊ณ ๋ง์,
๊ฑด๋ฐฐ!
๋ด ์๋ฃจ์
์ .install()
ํธ์ถ ์งํ์ 'undefined'!=k.setup&&k.setup();
์ถ๊ฐํ ๋ค์ ๊ฒ์๋ฌผ ์ด๊ธฐํ ์ฝ๋๋ก setup
๋ผ๋ ํจ์๋ฅผ SENTRY_SDK
ํ์ต๋๋ค.
๋น๋๊ธฐ ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ Raven.config
๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ์ฌ ์ฌ์ฉ์ ์ปจํ
์คํธ ๋ฐ ๊ธฐํ ์ ๋ณด๋ฅผ ์ค์ ํ ์ ์์์ต๋๋ค.
<script>
Raven.config("https://<mydsn>@sentry.io/<projectid>",
{"release":"0.3.1",
"environment":"dev",
"user": {"id":"7b031fa0-32ff-46fe-b94b-e6bc201c3c5f",
"organisation-id":"b1a50c41-b85e-4c50-9cec-c55ff36cf6d1"}}).install();
</script>
์ด์ ๋ํ ๋ชจ๋ ๊ฒ์ด ์ด๋ฏธ ์กด์ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌธ์ํํ๋ ๊ฒ์ด ๋ ์ข์ ์ ์์ต๋๋ค.
@danielcompton ์ ๋ฐฑ์๋ API๋ฅผ ํตํด์๋ง ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์์ Raven ๋ฉ์๋์ ๋ํ ํธ์ถ์ ํฌ๋ช ํ๊ฒ ๋๊ธฐ์ด์ ๋ฃ๋ ๋ฐ ์ฌ์ฉํ๋ ์ค๋ํซ์ ๋๋ค. https://gist.github.com/Kl0tl/ed0a9e74462a2294f4c8842f5389d8ea.
๋ชจ์๋ ํ์คํ ๊ฐ์ ๋ ์ ์์ง๋ง ๋ ๋ง์ ๊ธฐ๋ฅ์ ๋ณต์ ํ ํ์๊ฐ ์์ต๋๋ค.
Object.defineProperty
๋Raven
๊ฐ ์ฐฝ์ ์ฐ๊ฒฐ๋ ์งํ ํํฌ๋ฅผ ํ์ฉํ์ง๋ง ์คํฌ๋ฆฝํธ ๋ก๋ ์ด๋ฒคํธ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ณต์์ ์ธ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.