"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[8561],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=n(67294);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 l=r.createContext({}),g=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=g(e.components);return r.createElement(l.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,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=g(n),u=o,m=p["".concat(l,".").concat(u)]||p[u]||d[u]||i;return n?r.createElement(m,a(a({ref:t},c),{},{components:n})):r.createElement(m,a({ref:t},c))}));function m(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 l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:o,a[1]=s;for(var g=2;g<i;g++)a[g]=n[g];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},22869:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>g});var r=n(83117),o=(n(67294),n(3905));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/tree/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"}},l={},g=[{value:"Logging",id:"logging",level:2},{value:"Event Logging",id:"event-logging",level:3},{value:"StatsD Logging",id:"statsd-logging",level:3}],c={toc:g},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"logging"},"Logging"),(0,o.kt)("h3",{id:"event-logging"},"Event Logging"),(0,o.kt)("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.kt)("strong",{parentName:"p"},"Security > Action Log"),". You can freely customize these logs by\nimplementing your own event log class.\n",(0,o.kt)("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.kt)("p",null,"Here's an example of a simple JSON-to-stdout class:"),(0,o.kt)("pre",null,(0,o.kt)("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.kt)("p",null,"End by updating your config to pass in an instance of the logger you want to use:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"EVENT_LOGGER = JSONStdOutEventLogger()\n")),(0,o.kt)("h3",{id:"statsd-logging"},"StatsD Logging"),(0,o.kt)("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.kt)("p",null,"To setup StatsD logging, it\u2019s a matter of configuring the logger in your ",(0,o.kt)("inlineCode",{parentName:"p"},"superset_config.py"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python"},"from superset.stats_logger import StatsdStatsLogger\nSTATS_LOGGER = StatsdStatsLogger(host='localhost', port=8125, prefix='superset')\n")),(0,o.kt)("p",null,"Note that it\u2019s also possible to implement your own logger by deriving\n",(0,o.kt)("inlineCode",{parentName:"p"},"superset.stats_logger.BaseStatsLogger"),"."))}d.isMDXComponent=!0}}]);