"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}}]);