blob: 20e835631c2622698b32a2fad2dfaa5cda81d68b [file] [log] [blame]
"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[1204],{95788:(e,t,n)=>{n.d(t,{Iu:()=>c,yg:()=>y});var r=n(11504);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var g=r.createContext({}),l=function(e){var t=r.useContext(g),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=l(e.components);return r.createElement(g.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,g=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=l(n),u=o,y=p["".concat(g,".").concat(u)]||p[u]||d[u]||i;return n?r.createElement(y,a(a({ref:t},c),{},{components:n})):r.createElement(y,a({ref:t},c))}));function y(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=u;var s={};for(var g in t)hasOwnProperty.call(t,g)&&(s[g]=t[g]);s.originalType=e,s[p]="string"==typeof e?e:o,a[1]=s;for(var l=2;l<i;l++)a[l]=n[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},99384:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=n(45072),o=(n(11504),n(95788));const i={title:"Event Logging",hide_title:!0,sidebar_position:7,version:1},a=void 0,s={unversionedId:"installation/event-logging",id:"installation/event-logging",title:"Event Logging",description:"Logging",source:"@site/docs/installation/event-logging.mdx",sourceDirName:"installation",slug:"/installation/event-logging",permalink:"/docs/installation/event-logging",draft:!1,editUrl:"https://github.com/apache/superset/edit/master/docs/docs/installation/event-logging.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Event Logging",hide_title:!0,sidebar_position:7,version:1},sidebar:"tutorialSidebar",previous:{title:"Caching",permalink:"/docs/installation/cache"},next:{title:"Upgrading Superset",permalink:"/docs/installation/upgrading-superset"}},g={},l=[{value:"Logging",id:"logging",level:2},{value:"Event Logging",id:"event-logging",level:3},{value:"StatsD Logging",id:"statsd-logging",level:3}],c={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.yg)(p,(0,r.c)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h2",{id:"logging"},"Logging"),(0,o.yg)("h3",{id:"event-logging"},"Event Logging"),(0,o.yg)("p",null,"Superset by default logs special action events in its internal database (DBEventLogger). These logs can be accessed\non the UI by navigating to ",(0,o.yg)("strong",{parentName:"p"},"Security > Action Log"),". You can freely customize these logs by\nimplementing your own event log class.\n",(0,o.yg)("strong",{parentName:"p"},"When custom log class is enabled DBEventLogger is disabled and logs stop being populated in UI logs view."),"\nTo achieve both, custom log class should extend built-in DBEventLogger log class."),(0,o.yg)("p",null,"Here's an example of a simple JSON-to-stdout class:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-python"}," def log(self, user_id, action, *args, **kwargs):\n records = kwargs.get('records', list())\n dashboard_id = kwargs.get('dashboard_id')\n slice_id = kwargs.get('slice_id')\n duration_ms = kwargs.get('duration_ms')\n referrer = kwargs.get('referrer')\n\n for record in records:\n log = dict(\n action=action,\n json=record,\n dashboard_id=dashboard_id,\n slice_id=slice_id,\n duration_ms=duration_ms,\n referrer=referrer,\n user_id=user_id\n )\n print(json.dumps(log))\n")),(0,o.yg)("p",null,"End by updating your config to pass in an instance of the logger you want to use:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"EVENT_LOGGER = JSONStdOutEventLogger()\n")),(0,o.yg)("h3",{id:"statsd-logging"},"StatsD Logging"),(0,o.yg)("p",null,"Superset can be instrumented to log events to StatsD if desired. Most endpoints hit are logged as\nwell as key events like query start and end in SQL Lab."),(0,o.yg)("p",null,"To setup StatsD logging, it\u2019s a matter of configuring the logger in your ",(0,o.yg)("inlineCode",{parentName:"p"},"superset_config.py"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-python"},"from superset.stats_logger import StatsdStatsLogger\nSTATS_LOGGER = StatsdStatsLogger(host='localhost', port=8125, prefix='superset')\n")),(0,o.yg)("p",null,"Note that it\u2019s also possible to implement your own logger by deriving\n",(0,o.yg)("inlineCode",{parentName:"p"},"superset.stats_logger.BaseStatsLogger"),"."))}d.isMDXComponent=!0}}]);