CINXE.COM
Best Logging Practices for Safeguarding Sensitive Data | Better Stack Community
<!DOCTYPE html> <html lang='en' prefix='og: https://ogp.me/ns#'> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'> <title>Best Logging Practices for Safeguarding Sensitive Data | Better Stack Community</title> <meta content='width=device-width,initial-scale=1' name='viewport'> <link href='https://cdnjs.betterstack.com' rel='preconnect'> <link href='https://cdnjs.betterstack.com' rel='dns-prefetch'> <link href='https://www.googletagmanager.com' rel='preconnect'> <link href='https://www.googletagmanager.com' rel='dns-prefetch'> <link href='https://plausible.io' rel='preconnect'> <link href='https://plausible.io' rel='dns-prefetch'> <link href='https://forms.hsforms.com' rel='preconnect'> <link href='https://forms.hsforms.com' rel='dns-prefetch'> <link href='https://js.hsforms.net' rel='preconnect'> <link href='https://js.hsforms.net' rel='dns-prefetch'> <link href='https://connect.facebook.net' rel='preconnect'> <link href='https://connect.facebook.net' rel='dns-prefetch'> <link href='https://static.ads-twitter.com' rel='preconnect'> <link href='https://static.ads-twitter.com' rel='dns-prefetch'> <link href='https://bat.bing.com' rel='preconnect'> <link href='https://bat.bing.com' rel='dns-prefetch'> <link href='https://snap.licdn.com' rel='preconnect'> <link href='https://snap.licdn.com' rel='dns-prefetch'> <link href='https://googleads.g.doubleclick.net' rel='preconnect'> <link href='https://googleads.g.doubleclick.net' rel='dns-prefetch'> <link href='https://analytics.twitter.com' rel='preconnect'> <link href='https://analytics.twitter.com' rel='dns-prefetch'> <link href='/assets/favicon-ad4a170f31b6075c4d7ea5e23ce36677b3412bdd2fabc48d1b688bc535c8821c.png' rel='shortcut icon'> <meta content='In this guide, you will learn several best practices for keeping sensitive data out of your logs' name='description'> <meta content='website' property='og:type'> <meta content='Best Logging Practices for Safeguarding Sensitive Data | Better Stack Community' property='og:title'> <meta content='In this guide, you will learn several best practices for keeping sensitive data out of your logs' property='og:description'> <meta content='https://betterstack.com/og-image/sensitive-data.png' property='og:image'> <meta content='summary_large_image' property='twitter:card'> <meta content='betterstackhq' property='twitter:site'> <meta content='Best Logging Practices for Safeguarding Sensitive Data | Better Stack Community' property='twitter:title'> <meta content='In this guide, you will learn several best practices for keeping sensitive data out of your logs' property='twitter:description'> <meta content='https://betterstack.com/og-image/sensitive-data.png' property='twitter:image'> <meta content='no-cache' name='turbo-cache-control'> <link href='https://betterstack.com/community/guides/logging/sensitive-data/' rel='canonical'> <meta content='https://betterstack.com/community/guides/logging/sensitive-data/' property='og:url'> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="Fni0h3bZhpJSMRwu5cA8kMJdjak5eE5ADcAUikGILq-JTEIPBiHVdXMe2aB04OIrg514dHXMKDprm2riWg_ouw" /> <meta name="csp-nonce" content="c9a332ba8a39e9c75b60608445faf2e8" /> <link href='https://cdnjs.betterstack.com/@vueform/multiselect@2.5.7/themes/default.css' rel='stylesheet'> <link href='https://cdnjs.betterstack.com/floating-vue@2.0.0-beta.24/dist/style.css' rel='stylesheet'> <link href='https://cdnjs.betterstack.com/@docsearch/css@3.5.2/dist/style.css' rel='stylesheet'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Regular.woff2' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Regular.woff' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Medium.woff2' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Medium.woff' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-SemiBold.woff2' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-SemiBold.woff' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Bold.woff2' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Bold.woff' rel='preload'> <style> @font-face { font-family: "Roobert"; font-style: normal; font-weight: 400; font-display: swap; src: url("/static/fonts/Roobert/Roobert-Regular.woff2") format("woff2"), url("/static/fonts/Roobert/Roobert-Regular.woff") format("woff"); } @font-face { font-family: "Roobert"; font-style: normal; font-weight: 500; font-display: swap; src: url("/static/fonts/Roobert/Roobert-Medium.woff2") format("woff2"), url("/static/fonts/Roobert/Roobert-Medium.woff") format("woff"); } @font-face { font-family: "Roobert"; font-style: normal; font-weight: 600; font-display: swap; src: url("/static/fonts/Roobert/Roobert-SemiBold.woff2") format("woff2"), url("/static/fonts/Roobert/Roobert-SemiBold.woff") format("woff"); } @font-face { font-family: "Roobert"; font-style: normal; font-weight: 700; font-display: swap; src: url("/static/fonts/Roobert/Roobert-Bold.woff2") format("woff2"), url("/static/fonts/Roobert/Roobert-Bold.woff") format("woff"); } </style> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowText-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowText-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowText-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowDisplay-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowDisplay-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <style> @font-face { font-family: 'Helvetica Now Text'; src: local('Helvetica Now Text Regular'), local('HelveticaNowText-Regular'), url('/static/fonts/Helvetica/HelveticaNowText-Regular.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: 'Helvetica Now Text'; src: local('Helvetica Now Text Medium'), local('HelveticaNowText-Medium'), url('/static/fonts/Helvetica/HelveticaNowText-Medium.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: 'Helvetica Now Text'; src: local('Helvetica Now Text Bold'), local('HelveticaNowText-Bold'), url('/static/fonts/Helvetica/HelveticaNowText-Bold.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; } @font-face { font-family: 'Helvetica Now Display'; src: local('Helvetica Now Display Medium'), local('HelveticaNowDisplay-Medium'), url('/static/fonts/Helvetica/HelveticaNowDisplay-Medium.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: 'Helvetica Now Display'; src: local('Helvetica Now Display Bold'), local('HelveticaNowDisplay-Bold'), url('/static/fonts/Helvetica/HelveticaNowDisplay-Bold.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; } </style> <script defer='' src='https://www.googletagmanager.com/gtag/js?id=G-9FLKD0MQYY'></script> <script defer='' nonce='c9a332ba8a39e9c75b60608445faf2e8'> window.dataLayer = window.dataLayer || []; function gtag(){window.dataLayer.push(arguments);} gtag('js', new Date()); gtag('set', 'linker', { 'domains': ["betterstack.com","betteruptime.com","uptime.betterstack.com","logtail.com","telemetry.betterstack.com"] }); gtag('config', 'G-9FLKD0MQYY', { linker: { domains: ["betterstack.com","betteruptime.com","uptime.betterstack.com","logtail.com","telemetry.betterstack.com"] }}); gtag('config', 'AW-10805602682', { linker: { domains: ["betterstack.com","betteruptime.com","uptime.betterstack.com","logtail.com","telemetry.betterstack.com"] }}); </script> <script defer='' nonce='c9a332ba8a39e9c75b60608445faf2e8'> !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '1062799887416376'); </script> <script defer='' nonce='c9a332ba8a39e9c75b60608445faf2e8'> !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments); },s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='https://static.ads-twitter.com/uwt.js', a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script'); twq('config','o7hjd'); </script> <script data-domain='betterstack.com' defer='' src='https://plausible.io/js/plausible.js'></script> <script defer='' nonce='c9a332ba8a39e9c75b60608445faf2e8'> !function(e,t,n,a,o){var c,r,d;e[o]=e[o]||[],c=function(){var t={ti:"17516957"};t.q=e[o],e[o]=new UET(t),e[o].push("pageLoad")}, (r=t.createElement(n)).src="//bat.bing.com/bat.js",r.async=1,r.onload=r.onreadystatechange=function(){var e=this.readyState;e&&"loaded"!==e&&"complete"!==e|| (c(),r.onload=r.onreadystatechange=null)},m=t.querySelector("[nonce]"),m&&r.setAttribute("nonce",m.nonce||m.getAttribute("nonce")),(d=t.getElementsByTagName(n) [0]).parentNode.insertBefore(r,d)}(window,document,"script",0,"uetq"); </script> <script defer='' nonce='c9a332ba8a39e9c75b60608445faf2e8'> _linkedin_partner_id = "3533474"; window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || []; window._linkedin_data_partner_ids.push(_linkedin_partner_id); (function(l) {if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])}; window.lintrk.q=[]}var s = document.getElementsByTagName("script")[0]; var b = document.createElement("script");b.type = "text/javascript";b.async = true; b.nonce = "c9a332ba8a39e9c75b60608445faf2e8"; b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; s.parentNode.insertBefore(b, s);})(window.lintrk); </script> <script defer='' nonce='c9a332ba8a39e9c75b60608445faf2e8'> !function(w,d){if(!w.rdt){var p=w.rdt=function(){p.sendEvent?p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};p.callQueue=[];var t=d.createElement("script");t.src="https://www.redditstatic.com/ads/pixel.js",t.async=!0;var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)}}(window,document); rdt('init', 't2_bywzx23t', {"optOut":false,"useDecimalCurrencyValues":true}); rdt('track', 'PageVisit'); </script> <script defer='' nonce='c9a332ba8a39e9c75b60608445faf2e8'> document.addEventListener('turbo:load', function(event) { if (typeof gtag === 'function') { gtag('set', 'page_path', location.pathname); fbq('track', 'PageView'); twq('track','PageView'); uetq.push('event', 'page_view', { 'page_path': location.pathname }); rdt('track', 'PageVisit'); return gtag('event', 'page_view'); } }); // remove noscript elements which break DOMParser document.addEventListener('turbo:before-render', function (event) { event.detail.newBody.querySelectorAll('noscript').forEach((e) => e.remove()); }); </script> <script type="importmap" data-turbo-track="reload" nonce="c9a332ba8a39e9c75b60608445faf2e8">{ "imports": { "admin_controllers/article_form_controller": "/assets/admin_controllers/article_form_controller-093d791912986e6d67b7a2fcd5295875dd92901ff6ce65d2c7a244ff95cbaf9d.js", "admin_controllers": "/assets/admin_controllers/index-251bd0d37d81d4101c7746067926201b8ccb0a3fcb4ced1e27a144e7f27e1964.js", "api/NaturalLanguageParserApi": "/assets/api/NaturalLanguageParserApi-85e7f98db0cb7fc89adeed477ecc3f68b1fa7ff41237591b77ec5e9b7c5714f0.js", "application_controllers/account_settings_controller": "/assets/application_controllers/account_settings_controller-0c78fc0dde7cb83830c6a6e0cd69488dacbbb2165ba18fce9831accd172a22ce.js", "application_controllers/command_controller": "/assets/application_controllers/command_controller-033b711b2e0fe9561562f0f7fc741976a65edd54294a5b074bd416954e15af99.js", "application_controllers/command_palette_controller": "/assets/application_controllers/command_palette_controller-63c7905f99026161d164192e26e7bbc822673d236189d07573a0faecae9fcca1.js", "application_controllers/command_palette_hierarchy_controller": "/assets/application_controllers/command_palette_hierarchy_controller-03324b50b668dbc97fa3d4cfaff34614d2016dd4bd6ca7e6188663af1e23b282.js", "application_controllers/dropdown_controller": "/assets/application_controllers/dropdown_controller-52e7f44fe04d4fd1035d23198a9a61730bf5f56373eb3119f1395308d14f1fbe.js", "application_controllers/front_chat_controller": "/assets/application_controllers/front_chat_controller-f743662f29f7afe23a682e2351074dce796cdcf3103169e268dbcc9e9a5e5fe4.js", "application_controllers/hotkeys_controller": "/assets/application_controllers/hotkeys_controller-2c32447898227cf3b026adcb96a6477228ee6dd66de62902226ae75e768764b5.js", "application_controllers": "/assets/application_controllers/index-aa644584c697bee855575cba40aec5cf05a967074d1fc12f678362f238447604.js", "application_controllers/input_self_select_controller": "/assets/application_controllers/input_self_select_controller-587ca3c4027f85377bf8d801166f68c26ff22a37c0efd6f5fd16fab4aa377631.js", "application_controllers/marketing_banner_controller": "/assets/application_controllers/marketing_banner_controller-ad11b32b6cc2cef94caf518358a6a61653f0276a130078720ab96569480f696a.js", "application_controllers/marketing_banner_form_controller": "/assets/application_controllers/marketing_banner_form_controller-bc9c74d362d3cfbcf515e7775015dbf660b424f3e7cc23f3326767f338bd1d44.js", "application_controllers/menu_controller": "/assets/application_controllers/menu_controller-1242dee1a020ff79d024cc107b27fe751d9bab822201808bbae462f96f5e04d1.js", "application_controllers/nav_toggle_controller": "/assets/application_controllers/nav_toggle_controller-a5303aa9c92cf2089a725ef839eec0eb899179be7bad2bf937e71a0da318937d.js", "application_controllers/notification_toast_controller": "/assets/application_controllers/notification_toast_controller-4a7916ac3cb0201a02f4a2035f135dbce18fe0c68c29db6b55772e1278fc3f85.js", "application_controllers/notification_toasts_controller": "/assets/application_controllers/notification_toasts_controller-cc673788aa19747ae5b1cad480442d3bacc4e72b485f486e1f21a1f47c599d22.js", "application_controllers/payment/calculator_controller": "/assets/application_controllers/payment/calculator_controller-bc992e3fcd9906bc2478a5403899565dc768c659116f59cc74514ad873eaea70.js", "application_controllers/payment/change_plan_controller": "/assets/application_controllers/payment/change_plan_controller-6e868397ee1bc2e35e99187d69834227c09c2d507098607a30496f8e83bca3a6.js", "application_controllers/payment/enter_card_controller": "/assets/application_controllers/payment/enter_card_controller-30bce23b5644449065e1e5ad5930b819923b625dc861683a25ad243ea80394da.js", "application_controllers/payment/plan_controller": "/assets/application_controllers/payment/plan_controller-2ec7d360f0588646c6a58cc9a9a699f408f8134d18e6c1d922effe55e13ca570.js", "application_controllers/payment/refund_controller": "/assets/application_controllers/payment/refund_controller-f0e76d028f19f14a902b7ee94c74e88cf03e97c41d9e4d767bf7ff1fab9bfbea.js", "application_controllers/plan_product_controller": "/assets/application_controllers/plan_product_controller-fd3609dcf56b5849a034dde2558bf83a0021412185845b83299aa1e18051240b.js", "application_controllers/plan_product_variable_controller": "/assets/application_controllers/plan_product_variable_controller-4ce92a01c700b623202a39711276a6c832dbec7e3d228a3f5b32ad6eb64b9d0a.js", "application_controllers/prefilled_demo_modal_controller": "/assets/application_controllers/prefilled_demo_modal_controller-b903f7bba8a860dd64a1242a732ee55951f2ca90393f43e4c73d46fea1ecee53.js", "application_controllers/push_notifications_controller": "/assets/application_controllers/push_notifications_controller-2e004a7d669fdc2fef6802fefde8d63b22521a447d2876ac5b886b8bbfe7abb2.js", "application_controllers/roles/permission_toggle_controller": "/assets/application_controllers/roles/permission_toggle_controller-239116552b060934f75fb7dc5456c23929b0123d4f15b66de7c4e2d01c79f434.js", "application_controllers/search/base_controller": "/assets/application_controllers/search/base_controller-70ebd53d1732fed0f93af77b0a5641d2756c359bfcce5aea6fa19319aedc4abb.js", "application_controllers/single_sign_on/generic_controller": "/assets/application_controllers/single_sign_on/generic_controller-8a38c9acced8bc901e4389e11632c56533bd287d7660db4727eb3ee2da02a24e.js", "application_controllers/single_sign_on/okta_controller": "/assets/application_controllers/single_sign_on/okta_controller-301c6f5ef5ba086f7fe432ff24e4ac3c031c06102b7a0da6ba94d1453f0bacb8.js", "application_controllers/transition_controller": "/assets/application_controllers/transition_controller-c6a61c0df4f842c56ee6f48e8c615d5c5828536643c801b0cdca2e2fd6086ed3.js", "articles/tabs": "/assets/articles/tabs-111303381549055f8295ac48a24c41debb4a2d570160fc669b83e56e16b6dcd3.js", "articles_controllers/body_controller": "/assets/articles_controllers/body_controller-e46956b8ad9bdb57ef53871c70b0152582b9f9c2c516eb6fc0960194252d0c45.js", "articles_controllers/clipboard_controller": "/assets/articles_controllers/clipboard_controller-c3fe3cf960ab3975ae45ae7534d18a183cd0b7aa0cb52c8cc3c6a9486e3e5f5c.js", "articles_controllers/code_controller": "/assets/articles_controllers/code_controller-ba91cc6d90f367aabd0aea8d58fe3457a029e81dba595656792ba46d233345f0.js", "articles_controllers": "/assets/articles_controllers/index-111d288d1c02d07a6e35f2e5a183c1684ebc430f926dc285e2ac90577f0cc90a.js", "articles_controllers/lightbox_controller": "/assets/articles_controllers/lightbox_controller-47f223cbbc128ac82d59fe796e6b00ccd3d42cff086ab52631cfaf0c34b24a0c.js", "articles_controllers/search_controller": "/assets/articles_controllers/search_controller-0d3a342441e0713b1930414fb0e7c1716dead6fb5ce47f9c35dfccb2ea554069.js", "articles_controllers/toc_controller": "/assets/articles_controllers/toc_controller-c9ec659d078e715f8447e6bb4ea289b29b6c4e68dc17a97e168cf6e15b7a1386.js", "articles_controllers/toggle_controller": "/assets/articles_controllers/toggle_controller-e7d2aef0234491a5b059688097a6f1d6d9557abc7fe579f2063ead389c57800b.js", "betterstack_v2/carousel": "/assets/betterstack_v2/carousel-05024cefdac5d83dea490e1df67ba50fedb91d6a3e537540e2bb2c1b92e00694.js", "betterstack_v2/collapse": "/assets/betterstack_v2/collapse-1cdfd31392c35357359391ba794e3ef0f13a72bcb9c5b8270316b2e0d4f8d11e.js", "betterstack_v2/gallery": "/assets/betterstack_v2/gallery-4c68f91383c831f5389efe2679042b625754e0ac00bf09c02f36bc2ce3cb683a.js", "betterstack_v2/menu": "/assets/betterstack_v2/menu-b1ec6baad54fa8b78965f501426b1d58ec12eb070d399ff582cae7078cfd260f.js", "betterstack_v2/search": "/assets/betterstack_v2/search-09cfb8e126e955ecaeaf2e90deb83fd79a6cda9ee26433f97a0e577e7f7c3a33.js", "betterstack_v2/slide": "/assets/betterstack_v2/slide-c6d35378bfed6bea175bc7493e0d5a18b4700f2bd773959c4d869dd645a79adf.js", "betterstack_v2/toggle": "/assets/betterstack_v2/toggle-65841dc64993ca0e98881ed758b2f7533eaded5a4b8b405b47d55d8dbe9fca45.js", "channels": "/assets/channels/index-0c17d2125cae6f89a5c8d36d4e8d48d7e46b72e792349605b94a92822223fedf.js", "common/aos": "/assets/common/aos-2b4aafcba2495ae196d810350e01a2acc682c5aedec5bd77cbfe0d520dc2957f.js", "common/billing": "/assets/common/billing-0cdad1fe2d53869866453e3acf1fad0bc996c0bee73eabdf216172cb84f78468.js", "common/copy": "/assets/common/copy-0a1dad74b3201175c8b20b23d840f49ea78d3e8109602788431b95d09a218c4d.js", "common/data-disable-with-spinner": "/assets/common/data-disable-with-spinner-c136ea5779d65691524fb4e83a37bd3339094233087f672b7338c58cd77493bf.js", "common/drag-n-drop": "/assets/common/drag-n-drop-ec4c29d70a9bf14961617ae1aa3e723519650724c12bf4c406f8be026ae8d4da.js", "common/lazy": "/assets/common/lazy-3eb764101958480a12b2c50eb92af3adde35463ada26d277a0982026c785195f.js", "common/links": "/assets/common/links-09ddbfd3c3bb198b2b6cc37b95c788d284719599f065ca503cd6de55331c8e29.js", "common/modals": "/assets/common/modals-d6289315eb7bfe84680ec1d1f59d05419c173e09fa01528edb2bb6d7ef4e93e2.js", "common/posthog": "/assets/common/posthog-8b1f452704e4760f10ee4ffdac9f26024a09304f9f6e77dd4984bc0eed6a28ec.js", "common/railsSetup": "/assets/common/railsSetup-cfed4802124d3231b1c6441c95ff599b7444e257b726f77735da40bf9ce77b0b.js", "common/recaptchaSubmit": "/assets/common/recaptchaSubmit-00b44082803b95854afff50a43affb332ddebb2a0b83a68a26109aca6b46aab9.js", "common/side-menu-scroll": "/assets/common/side-menu-scroll-116ba69456d0ee789bbce8270028d1a58c82f1b3a6e9d99b44362611ddd833d2.js", "common/stripe": "/assets/common/stripe-c48b171f14b441cfc470fd2804188e400502a953dc500a81d1f0f4c93e1728d5.js", "common_controllers/auth_controller": "/assets/common_controllers/auth_controller-2ddea9a34a33af3c43af3bfe03115096e458ef609eee2456817031f375b55f48.js", "common_controllers/carousel_controller": "/assets/common_controllers/carousel_controller-a7d37f67debce15a3533d3827e50aab4128acd45bca67e63df420ab0db11915d.js", "common_controllers/collapse_controller": "/assets/common_controllers/collapse_controller-3dcbee04b1fc36d249c8c9276f073e999824690035244732f7fad43f4bfc4a84.js", "common_controllers/dev_bar_controller": "/assets/common_controllers/dev_bar_controller-887fb16bd45969b56a36edd42d408a732b6a1b4e76373251fabb68e80839e461.js", "common_controllers": "/assets/common_controllers/index-58bf1184d6faabc80d3f76de9c58175eedd057ad900d7d2680bc46a21dcc04a5.js", "common_controllers/modal_opener_controller": "/assets/common_controllers/modal_opener_controller-76dc29e7081350175d5acdd51e81b5e7afbd56f8f59bc43634ab79f106085ebe.js", "common_controllers/onboarding/features_controller": "/assets/common_controllers/onboarding/features_controller-58f75dd4c42bf73a8409dc211caa29fea5bf4a063c4fcaed64acc7ff02ee314f.js", "common_controllers/onboarding/payment_controller": "/assets/common_controllers/onboarding/payment_controller-a85dd0eb01447e48f22d8c344fd7ac5cea12dbb48f3181a5d6c263c0845c90d2.js", "common_controllers/onboarding/plan_controller": "/assets/common_controllers/onboarding/plan_controller-8b9dea50d1829d05f98c51ffa5f5262af554e2ccc4cc20fa128f21733fb4c7c4.js", "common_controllers/onboarding/telemetry_bundles_controller": "/assets/common_controllers/onboarding/telemetry_bundles_controller-a5251c236c4c6791370c0ac9421646c0a2b13745fc185682589a3b7c7dd92b6f.js", "common_controllers/onboarding/test_call_controller": "/assets/common_controllers/onboarding/test_call_controller-a09824d3d123e665bac0e1ca71970f826a3adee506a57f7295e95ac33df5100e.js", "common_controllers/pricing_controller": "/assets/common_controllers/pricing_controller-969fc984b6aca9d334d635a0c3c7111b74902fc639e74144aeb327704de83c89.js", "common_controllers/recaptcha_controller": "/assets/common_controllers/recaptcha_controller-2f82655e7318b3437aaee278e2523503bf200b01ed0c44c52aead72842128b61.js", "common_controllers/side_nav_controller": "/assets/common_controllers/side_nav_controller-f1670d9245c9eea0c10cabf3eebebc767f2014dff8ef3c4ceb4937ff1cbe06e0.js", "common_controllers/signup_controller": "/assets/common_controllers/signup_controller-b364ca84cf5a3f6d726e5d2daaa7c69d675d6eaced1a6c39e30ce5a09c6530ac.js", "common_controllers/status_page_layout_controller": "/assets/common_controllers/status_page_layout_controller-5be87013e73028cf0c53abbf4e9e2a8bbe1de3e0771be144d1e98a4a528bec5f.js", "common_controllers/timezone_controller": "/assets/common_controllers/timezone_controller-20295f334d67021c59bedd4825c9451b7ad43a7c60d6e725f945da602a0f42ea.js", "components/DatePicker": "/assets/components/DatePicker-436e54a842303f7aa138ce40f4aadd818d868002b208a8deb6d4035eea97fae3.js", "components/Modal": "/assets/components/Modal-766a80275c4b760bc5b7f328e36d077a52dc0ca79f64ce89f621fc3714a5015a.js", "components/NativeSelect": "/assets/components/NativeSelect-f3126370c0f01f32db87fc66d24be93959ecbcbf6eed7e2a790407c8bd07975d.js", "components/SideNavigation": "/assets/components/SideNavigation-af526abe8db98cc22cf7675518f35a4273ce5403df799d2990f67b8c85e2fc88.js", "components/ThemeSwitcher": "/assets/components/ThemeSwitcher-6c10857ff3cb51d1a2cb1b5e67dcb0237862e2e2660775d538c9a2aa696b27ff.js", "components/Toasts": "/assets/components/Toasts-9447093534129b4505773265eb726c5d74e8e461ad4171701de749ce1270e0a5.js", "components/UserMenu": "/assets/components/UserMenu-a929287b16464b4f65cca5c0561c868cbd2b892ff328346639ad0bc3a57d3613.js", "components/WithSpinner": "/assets/components/WithSpinner-9551c08ac773d33332213e2910656ba3d169a292b542433c4010e658544e3d6d.js", "components/admin/ArticleLink": "/assets/components/admin/ArticleLink-6548e3ec0ab7c7d7f20d10be9008e4c2a9478c8c94a29b51d20de8ef160fc8d8.js", "components/admin/ArticlesSelect": "/assets/components/admin/ArticlesSelect-3037dc73bb5c65ad133ded2306231f402d6fbfcfc9340ea792ccb6f957d7eb1c.js", "components/billing/BillableBadge": "/assets/components/billing/BillableBadge-324fcfb6af55f6bcf1307da02550c99214742543b6ec604e5da2315514c18a63.js", "components/billing/ChangePlans": "/assets/components/billing/ChangePlans-6e7f795c5c9f9c8752a7c0f1f7662daeaf56d716ab5692177fa1b56b24ac4cab.js", "components/billing/FeatureCountSlider": "/assets/components/billing/FeatureCountSlider-0ae3feb80b9b35d26f66beab8b2a1eea0e6ffc3f6f5bdd70f36daf14e339f9d4.js", "components/billing/PaymentMethodsSelect": "/assets/components/billing/PaymentMethodsSelect-302a8e448eaf713fb47d636139b3d5d16253e05a0f683d3bb6608318e8d2aafc.js", "components/billing/ProductVariables": "/assets/components/billing/ProductVariables-55783b5fdfc4e11926b3f24a7cb71c3ca371d9bb8a8b70928ff7ddad9f251450.js", "components/billing/ResponderSeatsSelector": "/assets/components/billing/ResponderSeatsSelector-817ba186dfed0791532a95c046649ef4acf8ed17e562673f114e7963aa860c36.js", "components/billing/UpcomingPlan": "/assets/components/billing/UpcomingPlan-6d193369bd135f182d4d44a7d4a7b50c9da5f4418ac07870e4b87c6024ab9282.js", "components/charts/BarChart": "/assets/components/charts/BarChart-bc4ce8200eddd395f14d2a1702e44c72210d4b734288daee4ffee2c623e65c92.js", "components/charts/theme": "/assets/components/charts/theme-91f17631e1543059e1bd76591747cc904857d5a6b3c92cd2d5fd4f97aef047de.js", "components/charts/utils/formatTooltip": "/assets/components/charts/utils/formatTooltip-31c7869ec007a414ad48ff05015b6b051216e66292847eaa2e585f407a674347.js", "components/docs/Code": "/assets/components/docs/Code-79511ae7d67e91832582328b130a1e5101633742564841d729d5420590a37453.js", "components/docs/CodeTab": "/assets/components/docs/CodeTab-744ff814f71bcbb737fa0e56d63d7e6f2c9cb70d8220b3a376e963d69ace3acc.js", "components/docs/TokenLoader": "/assets/components/docs/TokenLoader-fb07b2b2fdae0c20e0d89549f581a8adfeb53b7378021b6fa7f621023804474c.js", "components/docs/TokenNotice": "/assets/components/docs/TokenNotice-917f947c52668c272e9446aca305c2a2648c636652e4f83ac33ccde822e049fd.js", "components/docs/TokenPicker": "/assets/components/docs/TokenPicker-54e7327cdc8a42ef204b76063bfe6ede07517b8e96f69e8e36ad75e3c7a86904.js", "components/forms/AuditLogsToggle": "/assets/components/forms/AuditLogsToggle-218441a865c39560f29feea542bdea35638a757811eaaedfbff99d32b5d70198.js", "components/forms/BasicForm": "/assets/components/forms/BasicForm-61c5576c0c29b259abdf208fd812c3a0d6851e864d9aee87671c9bd865c185fe.js", "components/forms/Collapse": "/assets/components/forms/Collapse-81b332eae8af2cf0786548067b2f25e0ce8307c073e43a04b7b41d390cae5bbb.js", "components/forms/CopyOnClick": "/assets/components/forms/CopyOnClick-bb61fb00b51260d3aaf3651ca3cebb58d144fc5e0a52a09d952a47543d29d616.js", "components/forms/DotsDropdown": "/assets/components/forms/DotsDropdown-9f004c65e18a56f941167f550d24a28ba5c2e4e750be16633c65fe7e9b606423.js", "components/forms/Dropdown": "/assets/components/forms/Dropdown-f34b6de45049e8444220aa92199d58221552c245d498e7f6672a288c90ae2904.js", "components/forms/GatedToggle": "/assets/components/forms/GatedToggle-eac499fb5b20c94e1ad4611dfbb4f041e49710067a1473e6f8dd6556f864de11.js", "components/forms/HeadersJson": "/assets/components/forms/HeadersJson-3b4042d0035e077ea32f2cbb1e3e731664e7d6f89d7a6d0088a5bbc3b8a808dc.js", "components/forms/HighlightedTextarea": "/assets/components/forms/HighlightedTextarea-deb48b71df7a329d622f3b94590573bd3ff3d8c9b9f670d4f16163e17649ec18.js", "components/forms/HolidayModeForm": "/assets/components/forms/HolidayModeForm-69a117484e82dd5fcadda2177cd7b78876a2bc787f43ffd04fa012342eb5f638.js", "components/forms/IncidentSilencingForm": "/assets/components/forms/IncidentSilencingForm-730d2e9e0f4b14c3207ccf7eff428865018256abb5328d80fe9aed9df8f2bad3.js", "components/forms/LogoField": "/assets/components/forms/LogoField-ba2e7c78192d56d093ca4785f0891fc33dac0af8e01ba9744ae6694cb9fdf6a0.js", "components/forms/ModalTemplate": "/assets/components/forms/ModalTemplate-5b81c90cc376daae97f10af81ff234ef71ce1d4e94d7581e4d371dbbd4bb6202.js", "components/forms/MultiplyingInput": "/assets/components/forms/MultiplyingInput-56cdc061458582b995fb7dd7e0a74da4a7dc3a1c43ba8ebfd68721333616cff1.js", "components/forms/Select": "/assets/components/forms/Select-432a60a8168bd7622134d1a1ab7e4160c7b24aa2d28f21c02c27b904b546ca19.js", "components/forms/SelectWithSearch": "/assets/components/forms/SelectWithSearch-ed9e092ca47f10b9600a879d4f657ce2aa88fb1fee2b8254b5febe75f7264b40.js", "components/forms/SessionsForm": "/assets/components/forms/SessionsForm-c803dab2561e01cb48eda8bd0d3a8899349a19d65425aa99aeb1ec07f8782085.js", "components/forms/Slider": "/assets/components/forms/Slider-90f7010ecac763bf7233f35543741d8c859f11bf9be10b9e201ad333a078f25f.js", "components/forms/Spinner": "/assets/components/forms/Spinner-75db6d9f6d60b5eff5865ea90f129f6375b97e4c1127a6d9fd88942cc5d92259.js", "components/forms/TimezoneSelect": "/assets/components/forms/TimezoneSelect-a76a65022a969771e1ed22474ac69b7d0807a01c125b7e6c8786f418fe714d5c.js", "components/forms/Toggle": "/assets/components/forms/Toggle-3671691165989f989c10f5c4437322cb9bdcff290995748ef3e376cc5c107242.js", "components/forms/Tooltip": "/assets/components/forms/Tooltip-dcc2db1d673193afb8a7ad151c095309960a79c7f83f1c3d0f7b3a8651131bdd.js", "components": "/assets/components/index-64b4e9c85048a4acebe0d5ba7381340b40cee2b2ab4926fe765f31d6c866fb35.js", "components/notifications/Dropdown": "/assets/components/notifications/Dropdown-7d7ecf89e5cd8dcf47d1b26a1a5fff1a7b5360c271cc751032b79bf49756812c.js", "components/notifications/Item": "/assets/components/notifications/Item-343b52de1b1ee25e42e187660d689010f529cd54446505ae7e95a3ea0cf84f3d.js", "components/onboarding/PhonePrefixSelect": "/assets/components/onboarding/PhonePrefixSelect-0063c7eaba8bd54369451470c3b47d573b2a07d11b3c72df344808eab3097f83.js", "components/sessions/EmailPrompt": "/assets/components/sessions/EmailPrompt-03e0f0a98e73f7100ba92693a6a0864b341963182ddd9cbea095deb34fb787e1.js", "components/shared/DatePickerRangeSelector": "/assets/components/shared/DatePickerRangeSelector-08034d92ea3c4ea836b49f0c28975dec8571bcc6518f431e81301df06a3a256e.js", "components/shared/DateRangeSelector": "/assets/components/shared/DateRangeSelector-ac430d44c7317119204fcb38d35ea55c98d4e85d589a19b9ca2b30f3bcecb680.js", "components/stores/DocsStore": "/assets/components/stores/DocsStore-1c7507c869081858851f726d209e719b1a4d0c6c297930d41da5a472b7aa564d.js", "components/stores/FollowerStore": "/assets/components/stores/FollowerStore-5b78631dc93e290b65508617b7a63640ac5333377d1e20e95c085f9d86b9387b.js", "components/stores/MainStore": "/assets/components/stores/MainStore-fedba35ede04c4bce2be7c47969d6490d863ee416be80673288cf0e54a6f708a.js", "components/stores/ToastStore": "/assets/components/stores/ToastStore-b345053ac094eb51397158d55b71fc6d093a32087b8005bd9b0743967da3de48.js", "components/stores/UsageStore": "/assets/components/stores/UsageStore-78313fd41a5780117d579b9d5c86593e07ae981a87a8c015c417d36fa3274f79.js", "components/stores/index": "/assets/components/stores/index-790f621e33d661fa7aaaaadb06ba15928ffd964ceebe34b753720e997c7f3034.js", "components/usage/Chart": "/assets/components/usage/Chart-1fc66e48818350d300b70366d9aaca429b09689f6a9549399c1db930c690c5d9.js", "components/usage/DateRangeSelector": "/assets/components/usage/DateRangeSelector-8a093aedd6ccb36ad67886b307727d0cfb5311655e9aef5b421db4ccd22bb378.js", "components/usage/DimensionTab": "/assets/components/usage/DimensionTab-67e4ca9896636c3a88d508919ffaad7692b43b7d283f617ac6d83484bbf94390.js", "components/usage/ProductLink": "/assets/components/usage/ProductLink-6a5c70201ae98b5bf510d38c930e0b336ea0161a355e47d7d2fac57f0ac3c310.js", "components/usage/ResolutionSelector": "/assets/components/usage/ResolutionSelector-29e54e93195b8b9ef6753706f40ce43c1137c034c91a5259c244279f8a48a187.js", "components/usage/Table": "/assets/components/usage/Table-ee861fb508aca3d8cdf56c3aa10b24a1f736711c86167020238cf02ab6d4b646.js", "composables/useCollapseHeight": "/assets/composables/useCollapseHeight-17aee4ad47813c68e489fbc5ada535c42e74858948cbf17b8e70654cda85c0cf.js", "composables/useCommand": "/assets/composables/useCommand-d60c11f032654ef93461e8a4f4595edd0360ec0f6a0133d543feddcddd51ee8f.js", "composables/useHotkey": "/assets/composables/useHotkey-8e49d44a9a27667af72bc8cdb64df15b234137457afbd29278f8cf86de89cbe0.js", "composables/useTheme": "/assets/composables/useTheme-4aadc05e800ed3f5402a2eb253a109cbcae04dd915decf9f80852a0b10218db9.js", "entrypoints/admin_articles": "/assets/entrypoints/admin_articles-33e05ea74198c1755e1dac82e75f35077da3140092d5b7e1dfe453e02da93242.js", "entrypoints/application": "/assets/entrypoints/application-f0b5c4dad0df513cb8e55b3acdd8a0f2ba8c435bdb004d47a84e33ed96d081f4.js", "entrypoints/articles": "/assets/entrypoints/articles-228b5e6202a0dc83e8b7700983cf58b7cc84b06398dd3c854d3437809c6abb3d.js", "entrypoints/auth": "/assets/entrypoints/auth-b4745d7dbd024e9dc2c5617b2baf7c19205d5ef748d38418eeacd382a574240e.js", "entrypoints/betterstack_v2": "/assets/entrypoints/betterstack_v2-f0c8f8db93692df43bc1d4b430e854d39e123457a2b985ec1d8da9abc290ea82.js", "entrypoints/front": "/assets/entrypoints/front-300178d82dbd1adeb592bbd9f8b2d6421df8e5ae963041d808a67fa28e37ad79.js", "entrypoints/logtail": "/assets/entrypoints/logtail-86206ffccef010b24d771ebce8a91addc7d4391907d8dce3aea1a696dc31a15c.js", "entrypoints/mobile": "/assets/entrypoints/mobile-22d02a6569bac82bff507b79aad8172155ec4c9631ded334c8a9ba9a27ff0321.js", "entrypoints/onboarding": "/assets/entrypoints/onboarding-61bd5234ef3e2513b0a93ae8a2d127aba7450ed26f91d14aaf056f67e2e05415.js", "entrypoints/playwright": "/assets/entrypoints/playwright-2bca3f78b1face6d4bc3c50726d00fcb2823ebc7b9d64ace23b1729e6879dac4.js", "entrypoints/uptime": "/assets/entrypoints/uptime-d57f0cee58d22bac0679c1e7e06ed8afdaeb911306265cd118fe56e38a307f09.js", "front/router": "/assets/front/router-15f34318361051c9844c70c974ab777afc4e6402411fcbd694e757a877cbec40.js", "logtail_controllers": "/assets/logtail_controllers/index-1595afa1409ee5bf0188e35ef178b9ed9ec5a58fe15b68da82703e39dc78e194.js", "logtail_controllers/plans_controller": "/assets/logtail_controllers/plans_controller-e216365c38db8814403c45b7f26dab79fa9995d42f75df5fdbdc22db943b429e.js", "mobile_controllers/ButtonBridgeComponent": "/assets/mobile_controllers/ButtonBridgeComponent-30626673e61f0e3c26c3d8b6002b7fa66012d9e1b445cb4d02074bdd077861e2.js", "mobile_controllers/EventBridgeComponent": "/assets/mobile_controllers/EventBridgeComponent-313b96e5de16ed230efe1370792c3815796df581467629a23e85a78842f25cab.js", "mobile_controllers": "/assets/mobile_controllers/index-18b25ed766e85c735e5a0f22e4aede8bab9e362b6975609f0f26dac171c0063a.js", "mobile_controllers/otp_entry_controller": "/assets/mobile_controllers/otp_entry_controller-b3220a52d53f3907aebe6d65788e5dcbecd109e69a12880c9aaf3bb1d467b131.js", "routes": "/assets/routes-b42f319df6ba94e9e83bbc7cdf63e9cbcebb66b51d696ccbef7b636cb3b5228a.js", "shared/channels/appearance_subscription": "/assets/shared/channels/appearance_subscription-91167fdabc87648c3d424e872db9c0f3d009423fe043fdfce071f5319ef1b50e.js", "shared/channels/consumer": "/assets/shared/channels/consumer-54d75b5b4059931e8792cb76161d6ec1d2da116317920038eef3567eab056919.js", "shared/channels/create_follower_subscription": "/assets/shared/channels/create_follower_subscription-73d61d46010b368240046908b53bb2b1ae047b2a69313a2e1ca4b2e998d84066.js", "shared/channels/followee_subscription": "/assets/shared/channels/followee_subscription-fddf3cb73d8e828fced66aef456dec5d9b4a076fbea3a9b9af0caf58a52da8a1.js", "shared/collaboration/Appearances": "/assets/shared/collaboration/Appearances-36a2551e217b7db1563b745bdef25aea353036bd3748f5e274ba093b13bca260.js", "shared/collaboration/GhostCursors": "/assets/shared/collaboration/GhostCursors-d1819bfc45e3af8bfd0ee66639eb9b2d638e649808228941a76099a878180c3e.js", "shared/collaboration/follower/Controls": "/assets/shared/collaboration/follower/Controls-7174c73834b0413b127d83513ce202ac5e088bbf5957fc9a8d53a483f8fe4403.js", "shared/collaboration/follower/DirectFollower": "/assets/shared/collaboration/follower/DirectFollower-b02f601917eaec374b07937ab49c11357c34cf8e2b0ebc6915c84b83d17a3e44.js", "shared/collaboration/follower/Error": "/assets/shared/collaboration/follower/Error-c60522f4be41a4f7adf14b78b983ff6ca81253de314a1ef756d1161ae45fda92.js", "shared/collaboration/follower/Follower": "/assets/shared/collaboration/follower/Follower-5bbd7f6a41eeb931c5a521c8218c74a1397bbcd19816de35c729d14f7bfa2895.js", "shared/collaboration/follower/FollowerGhostCursors": "/assets/shared/collaboration/follower/FollowerGhostCursors-09b7222dde8cf5701d0faa8e311c2b5f37306732470b0be77a669fb4dead5d4d.js", "shared/collaboration/follower/LoadingScreen": "/assets/shared/collaboration/follower/LoadingScreen-b82a0ba91ca92c1183aa0aa8dc5051e93597fdd78dcc5f3878dd895b11e7f811.js", "shared/collaboration/follower/ProxyFollower": "/assets/shared/collaboration/follower/ProxyFollower-371025b83b92fb933005e7071692af402665f136f0180b5a4aec9b2911317708.js", "shared/collaboration/utils": "/assets/shared/collaboration/utils-67288c5f49092d9f154fd39c22fc4872f246af59e155f64a212d807ba40e129d.js", "shared/command_palette/CommandIndexWorker": "/assets/shared/command_palette/CommandIndexWorker-73e6e06432c6c072acbad94b5f191c7c016e735354d526b44998f2ecda4ac654.js", "shared/command_palette/CommandPalette": "/assets/shared/command_palette/CommandPalette-45d56d89e1abc0c01e621bad55f0f57e8934989ebe6cba2158919febb00a2a72.js", "shared/command_palette/CommandsManager": "/assets/shared/command_palette/CommandsManager-2f4f67654c9291f9bba5a7060071e783c852ddae39ccb180825bd1992b1bb219.js", "shared/command_palette/HotkeyManager": "/assets/shared/command_palette/HotkeyManager-cd94c551611c0f03e112789955a6ec415dce5060970b723ec7f00ee3d6f8e8e2.js", "shared/hubspot_demo_form": "/assets/shared/hubspot_demo_form-6812046f945724db91d38fc0b7a5b68ac6557fd3dcccdb2cf171bdfa1ed16bd4.js", "shared/utils/DelayedBuffer": "/assets/shared/utils/DelayedBuffer-c668422bf7cd1f0c74b85a84b43d4cd6c8ef9aaff720b9b567f9696e1cc70860.js", "shared/utils/interop": "/assets/shared/utils/interop-9f5c1743e3cd5f0de6006fa2749e139cdd0475e08002581d4fe2eaaa69bb50f7.js", "shared/utils/is-mac": "/assets/shared/utils/is-mac-93b71cfbb5b2734018e4113b6b1d7fa3532ea1f8d206e0bd20f31c0548c446f5.js", "shared/utils/script-loader": "/assets/shared/utils/script-loader-92764982164c12f674e90cd2f95a691992d89fa92621c0508f34450d80714f66.js", "uptime_controllers": "/assets/uptime_controllers/index-aec018857a67541da9db4f59349cfe9a7ca3ff1923e40b8d21d8999711a4fbbe.js", "uptime_controllers/plans_controller": "/assets/uptime_controllers/plans_controller-385a4b447247383d60bded305bfcaaaeabc0bccbb521b118028627f0152d619b.js", "utils/RangeTimestamp": "/assets/utils/RangeTimestamp-d19d11ed00082000ed6e4ba5df4e1240d27a3e654c61962d09a05a1da8670c0c.js", "utils/RelativeTimestamp": "/assets/utils/RelativeTimestamp-9855b55b1a0069362546519a1f9196ee9e16bee020bb4212099e1eedad14ee03.js", "utils/authToken": "/assets/utils/authToken-c7a1cd63fcf0ad9de31981d3f453c8076d16ca1255b6046017ed2272f3641a71.js", "utils/cardBrands": "/assets/utils/cardBrands-ea5db81e7561737ed83b636a4b6febb5db7cf6057e3dda81eba750d94eacbf01.js", "utils/chartTooltipPosition": "/assets/utils/chartTooltipPosition-527b42ecc40c85cf2336bdf7c11bdc0767d1258b5ef803df7aaeda87a78b6f4d.js", "utils/date": "/assets/utils/date-d3fcf0323a2830e49539b258684b7a73164cb6852b92d4101ce3112d5dde00ed.js", "utils/externalRoutes": "/assets/utils/externalRoutes-8202a3c23971ea5777421ceb02d30d91068394c8dc0a3050359e8df537009f7f.js", "utils/fetchJson": "/assets/utils/fetchJson-85e0da5d35050a520878375b5fba9b8c528671d2dfa2ff52cf48567bbb6a3156.js", "utils/formatters": "/assets/utils/formatters-ed707477386ff3c1040838ed28f6b17bbef0360968f058c9fac62a1a45355af9.js", "utils/highlight": "/assets/utils/highlight-458c91c22b204a7cee20df25793dc516179b84951bfe420948bf3097ac913b61.js", "utils/hotkeyLabel": "/assets/utils/hotkeyLabel-c7dc521969055b65497a498c7b57b828980e5431fdfc9632d05548d8c3b3adda.js", "utils/importmap": "/assets/utils/importmap-3fb68c776ce85b3790bb9b5753ab4e0ab2ceb0abdcc8014953cdfec2c5645cea.js", "utils/isTouchDevice": "/assets/utils/isTouchDevice-eedba28010f2ea6c3bf74f5717049a1580d0a4d78727a3cd79bdb93abd35cd56.js", "utils/miniBindVueApp": "/assets/utils/miniBindVueApp-db826ead93378a6b0fb33e4206bf12fa42895b140f7331a988030771c8370175.js", "utils/naturalLanguageTimeParser": "/assets/utils/naturalLanguageTimeParser-584f895f2ec4c4df8aa78843d8548c50c2f6df0200fed52197b79217ea8ee588.js", "utils/permissions": "/assets/utils/permissions-4327b486a3b260c0fdab95dbd2c4c4c901ff02028cb9fdd3f4476b238b40e596.js", "utils/platforms": "/assets/utils/platforms-dfbf6f3cc0a3ba42522e6d46da025f610a68024f9db9984b419f523b8ff5ad88.js", "utils/queryParams": "/assets/utils/queryParams-313f382500c03f6ae5609c10871ff0836ff1eb43cf6a68fa1addcc455fa27799.js", "utils/rebindComponents": "/assets/utils/rebindComponents-f30d606edfa41b43cad6c2a6d4656a1df83a3c73cf2fb6f8479e18203426f87d.js", "utils/timeago": "/assets/utils/timeago-2b7286c271bbc61d1258a0f65dc709e3288edd5c37e9e17f4058325a59b2517b.js", "utils/timestampToDayjs": "/assets/utils/timestampToDayjs-2b2c7c6e6b3b998b5cf23a9d9424d253ba071689d163abe9aae21df65c8a8424.js", "utils/timezone": "/assets/utils/timezone-b1171452a6a2b4d7f1a322a671886690f1647a264fb488f1e477edce29d7dd01.js", "utils/timezoneList": "/assets/utils/timezoneList-e24ecbd5932e311e8e63f2eddc66165fd12c6c0f5c99e10a0c821945d092398c.js", "vendor/aos@2.3.4": "/assets/vendor/aos@2.3.4-685eb7c655b107524a998227037e3774b68de3aae7d7d9c4778ad93f28da0134.js", "vendor/cuid@2.1.8": "/assets/vendor/cuid@2.1.8-04b3f7922ef09493e6de1674985aa9e6db1ef22b5b459ff55dfebfc7fb223403.js", "vendor/domurl@2.3.4": "/assets/vendor/domurl@2.3.4-db15c581b8052eb19b45e8d67676e0029de117dd052d52fb9b4dff92cb3c80cd.js", "vendor/floating-vue@5.2.0": "/assets/vendor/floating-vue@5.2.0-e493e91064e9956ff82c5c23defd763087421f0c97b889cf33239d802a5e8fa8.js", "vendor/frontapp-ui-bridge@2.0.0-beta1": "/assets/vendor/frontapp-ui-bridge@2.0.0-beta1-d3b766ae248a8ed4ac11ebfd6f6ac7a31294dde9cb3d9f047192921b6c1ca1c4.js", "vendor/mime-match@1.0.2": "/assets/vendor/mime-match@1.0.2-4d959bda662997b61e998d18ad41c2ae215771ae130d85a5f05ced0541000c37.js", "vendor/namespace-emitter@2.0.1": "/assets/vendor/namespace-emitter@2.0.1-b396e60bd4150b092d9eb238c73ef723dd54dfdc6c7bbe40e903efbd9659903d.js", "vendor/primevue@4.0.7": "/assets/vendor/primevue@4.0.7-292f4d15f9e736212277eaa302e66b4c72e27d267baa75f557b19221f20d4d57.js", "vendor/sentry-vue@8.13.0": "/assets/vendor/sentry-vue@8.13.0-167743aecd5b6cc9aa2899beec92879d0753ed6df2b78e8ea834dc25bbc8b375.js", "vendor/stimulus@2.0.0": "/assets/vendor/stimulus@2.0.0-5b5f813e2414d6e786a903c4ba38ba495cafe9705d1172a88e85eedf8f4bf25a.js", "vendor/transloadit-prettier-bytes@0.0.9": "/assets/vendor/transloadit-prettier-bytes@0.0.9-7d84b56abd9a347840cc75802bff997f4d80aa98226989b3b531586ca83de8de.js", "vendor/wildcard@1.1.2": "/assets/vendor/wildcard@1.1.2-5fe9351108ff44f2fe5e044f79bc7858778c58ba61c8cb6b5fd60e6bf5684bb1.js", "@betterstack/shared/channels/appearance_subscription": "/assets/shared/channels/appearance_subscription-91167fdabc87648c3d424e872db9c0f3d009423fe043fdfce071f5319ef1b50e.js", "@betterstack/shared/channels/consumer": "/assets/shared/channels/consumer-54d75b5b4059931e8792cb76161d6ec1d2da116317920038eef3567eab056919.js", "@betterstack/shared/channels/create_follower_subscription": "/assets/shared/channels/create_follower_subscription-73d61d46010b368240046908b53bb2b1ae047b2a69313a2e1ca4b2e998d84066.js", "@betterstack/shared/channels/followee_subscription": "/assets/shared/channels/followee_subscription-fddf3cb73d8e828fced66aef456dec5d9b4a076fbea3a9b9af0caf58a52da8a1.js", "@betterstack/shared/collaboration/Appearances": "/assets/shared/collaboration/Appearances-36a2551e217b7db1563b745bdef25aea353036bd3748f5e274ba093b13bca260.js", "@betterstack/shared/collaboration/GhostCursors": "/assets/shared/collaboration/GhostCursors-d1819bfc45e3af8bfd0ee66639eb9b2d638e649808228941a76099a878180c3e.js", "@betterstack/shared/collaboration/follower/Controls": "/assets/shared/collaboration/follower/Controls-7174c73834b0413b127d83513ce202ac5e088bbf5957fc9a8d53a483f8fe4403.js", "@betterstack/shared/collaboration/follower/DirectFollower": "/assets/shared/collaboration/follower/DirectFollower-b02f601917eaec374b07937ab49c11357c34cf8e2b0ebc6915c84b83d17a3e44.js", "@betterstack/shared/collaboration/follower/Error": "/assets/shared/collaboration/follower/Error-c60522f4be41a4f7adf14b78b983ff6ca81253de314a1ef756d1161ae45fda92.js", "@betterstack/shared/collaboration/follower/Follower": "/assets/shared/collaboration/follower/Follower-5bbd7f6a41eeb931c5a521c8218c74a1397bbcd19816de35c729d14f7bfa2895.js", "@betterstack/shared/collaboration/follower/FollowerGhostCursors": "/assets/shared/collaboration/follower/FollowerGhostCursors-09b7222dde8cf5701d0faa8e311c2b5f37306732470b0be77a669fb4dead5d4d.js", "@betterstack/shared/collaboration/follower/LoadingScreen": "/assets/shared/collaboration/follower/LoadingScreen-b82a0ba91ca92c1183aa0aa8dc5051e93597fdd78dcc5f3878dd895b11e7f811.js", "@betterstack/shared/collaboration/follower/ProxyFollower": "/assets/shared/collaboration/follower/ProxyFollower-371025b83b92fb933005e7071692af402665f136f0180b5a4aec9b2911317708.js", "@betterstack/shared/collaboration/utils": "/assets/shared/collaboration/utils-67288c5f49092d9f154fd39c22fc4872f246af59e155f64a212d807ba40e129d.js", "@betterstack/shared/command_palette/CommandIndexWorker": "/assets/shared/command_palette/CommandIndexWorker-73e6e06432c6c072acbad94b5f191c7c016e735354d526b44998f2ecda4ac654.js", "@betterstack/shared/command_palette/CommandPalette": "/assets/shared/command_palette/CommandPalette-45d56d89e1abc0c01e621bad55f0f57e8934989ebe6cba2158919febb00a2a72.js", "@betterstack/shared/command_palette/CommandsManager": "/assets/shared/command_palette/CommandsManager-2f4f67654c9291f9bba5a7060071e783c852ddae39ccb180825bd1992b1bb219.js", "@betterstack/shared/command_palette/HotkeyManager": "/assets/shared/command_palette/HotkeyManager-cd94c551611c0f03e112789955a6ec415dce5060970b723ec7f00ee3d6f8e8e2.js", "@betterstack/shared/hubspot_demo_form": "/assets/shared/hubspot_demo_form-6812046f945724db91d38fc0b7a5b68ac6557fd3dcccdb2cf171bdfa1ed16bd4.js", "@betterstack/shared/utils/DelayedBuffer": "/assets/shared/utils/DelayedBuffer-c668422bf7cd1f0c74b85a84b43d4cd6c8ef9aaff720b9b567f9696e1cc70860.js", "@betterstack/shared/utils/interop": "/assets/shared/utils/interop-9f5c1743e3cd5f0de6006fa2749e139cdd0475e08002581d4fe2eaaa69bb50f7.js", "@betterstack/shared/utils/is-mac": "/assets/shared/utils/is-mac-93b71cfbb5b2734018e4113b6b1d7fa3532ea1f8d206e0bd20f31c0548c446f5.js", "@betterstack/shared/utils/script-loader": "/assets/shared/utils/script-loader-92764982164c12f674e90cd2f95a691992d89fa92621c0508f34450d80714f66.js", "vue": "https://cdnjs.betterstack.com/vue@3.4.31/dist/vue.esm-browser.prod.js", "@vue/devtools-api": "https://cdnjs.betterstack.com/@vue/devtools-api@6.6.3/lib/esm/index.js", "vue-demi": "https://cdnjs.betterstack.com/vue-demi@0.14.8/lib/index.mjs", "pinia": "https://cdnjs.betterstack.com/pinia@2.1.7/dist/pinia.esm-browser.js", "vue-turbolinks": "https://cdnjs.betterstack.com/vue-turbolinks@2.2.2/index.js", "@sentry/vue": "/assets/vendor/sentry-vue@8.13.0-167743aecd5b6cc9aa2899beec92879d0753ed6df2b78e8ea834dc25bbc8b375.js", "@headlessui/vue": "https://cdnjs.betterstack.com/@headlessui/vue@1.7.4/dist/headlessui.esm.js", "primevue": "/assets/vendor/primevue@4.0.7-292f4d15f9e736212277eaa302e66b4c72e27d267baa75f557b19221f20d4d57.js", "vueform-multiselect": "https://cdnjs.betterstack.com/@vueform/multiselect@2.6.10/dist/multiselect.js", "vueform-slider": "https://cdnjs.betterstack.com/@vueform/slider@2.1.10/dist/slider.js", "@hotwired/turbo-rails": "https://cdnjs.betterstack.com/@hotwired/turbo-rails@8.0.4/app/assets/javascripts/turbo.js", "@hotwired/hotwire-native-bridge": "https://cdnjs.betterstack.com/@hotwired/hotwire-native-bridge@1.0.0/dist/hotwire-native-bridge.js", "@rails/actioncable": "https://cdnjs.betterstack.com/@rails/actioncable@7.0.4/app/assets/javascripts/actioncable.esm.js", "@rails/activestorage": "https://cdnjs.betterstack.com/@rails/activestorage@6.0.0/app/assets/javascripts/activestorage.js", "js-cookie": "https://cdnjs.betterstack.com/js-cookie@3.0.1/dist/js.cookie.min.mjs", "lazysizes": "https://cdnjs.betterstack.com/lazysizes@5.3.2/lazysizes.min.js", "posthog-js": "https://cdnjs.betterstack.com/posthog-js@1.64.0/dist/es.js", "el-transition": "https://cdnjs.betterstack.com/el-transition@0.0.7/index.js", "dayjs": "https://cdnjs.betterstack.com/dayjs@1.11.7/esm/index.js", "dayjs/": "https://cdnjs.betterstack.com/dayjs@1.11.7/esm/", "dayjs/plugin/quarterOfYear.js": "https://cdnjs.betterstack.com/dayjs@1.11.7/esm/plugin/quarterOfYear/index.js", "dayjs/plugin/timezone.js": "https://cdnjs.betterstack.com/dayjs@1.11.7/esm/plugin/timezone/index.js", "dayjs/plugin/utc.js": "https://cdnjs.betterstack.com/dayjs@1.11.7/esm/plugin/utc/index.js", "underscore/": "https://cdnjs.betterstack.com/underscore@1.13.6/modules/", "nanoevents": "https://cdnjs.betterstack.com/nanoevents@7.0.1/index.js", "decimal": "https://cdnjs.betterstack.com/decimal.js@10.4.3/decimal.mjs", "lodash/": "https://cdnjs.betterstack.com/lodash-es@4.17.21/", "lodash.throttle": "https://cdnjs.betterstack.com/lodash-es@4.17.21/throttle", "aos": "/assets/vendor/aos@2.3.4-685eb7c655b107524a998227037e3774b68de3aae7d7d9c4778ad93f28da0134.js", "stimulus": "/assets/vendor/stimulus@2.0.0-5b5f813e2414d6e786a903c4ba38ba495cafe9705d1172a88e85eedf8f4bf25a.js", "@hotwired/stimulus": "/assets/vendor/stimulus@2.0.0-5b5f813e2414d6e786a903c4ba38ba495cafe9705d1172a88e85eedf8f4bf25a.js", "domurl": "/assets/vendor/domurl@2.3.4-db15c581b8052eb19b45e8d67676e0029de117dd052d52fb9b4dff92cb3c80cd.js", "@floating-ui/dom": "https://cdnjs.betterstack.com/@floating-ui/dom@1.4.4/dist/floating-ui.dom.browser.min.mjs", "@floating-ui/core": "https://cdnjs.betterstack.com/@floating-ui/core@1.3.1/dist/floating-ui.core.browser.min.mjs", "floating-vue": "/assets/vendor/floating-vue@5.2.0-e493e91064e9956ff82c5c23defd763087421f0c97b889cf33239d802a5e8fa8.js", "echarts": "https://cdnjs.betterstack.com/echarts@5.4.0/dist/echarts.esm.min.js", "echarts/core": "https://cdnjs.betterstack.com/echarts@5.4.0/dist/echarts.esm.min.js", "vue-echarts": "https://cdnjs.betterstack.com/vue-echarts@6.6.1/dist/index.esm.min.js", "resize-detector": "https://cdnjs.betterstack.com/resize-detector@0.3.0/esm/index.js", "@uppy/aws-s3": "https://cdnjs.betterstack.com/@uppy/aws-s3@3.2.0/lib/index.js", "@uppy/aws-s3-multipart": "https://cdnjs.betterstack.com/@uppy/aws-s3-multipart@3.4.0/lib/index.js", "@uppy/core": "https://cdnjs.betterstack.com/@uppy/core@3.2.1/lib/index.js", "@uppy/core/": "https://cdnjs.betterstack.com/@uppy/core@3.2.1/", "@uppy/companion-client": "https://cdnjs.betterstack.com/@uppy/companion-client@3.1.3/lib/index.js", "@uppy/utils/": "https://cdnjs.betterstack.com/@uppy/utils@5.4.0/", "@uppy/store-default": "https://cdnjs.betterstack.com/@uppy/store-default@3.0.3/lib/index.js", "mime-match": "/assets/vendor/mime-match@1.0.2-4d959bda662997b61e998d18ad41c2ae215771ae130d85a5f05ced0541000c37.js", "namespace-emitter": "/assets/vendor/namespace-emitter@2.0.1-b396e60bd4150b092d9eb238c73ef723dd54dfdc6c7bbe40e903efbd9659903d.js", "nanoid/non-secure": "https://cdnjs.betterstack.com/nanoid@4.0.1/non-secure/index.js", "preact": "https://cdnjs.betterstack.com/preact@10.11.0/dist/preact.module.js", "@transloadit/prettier-bytes": "/assets/vendor/transloadit-prettier-bytes@0.0.9-7d84b56abd9a347840cc75802bff997f4d80aa98226989b3b531586ca83de8de.js", "wildcard": "/assets/vendor/wildcard@1.1.2-5fe9351108ff44f2fe5e044f79bc7858778c58ba61c8cb6b5fd60e6bf5684bb1.js", "@frontapp/plugin-sdk": "https://cdnjs.betterstack.com/@frontapp/plugin-sdk@1.0.1/dist/index.es.js", "@frontapp/ui-bridge": "/assets/vendor/frontapp-ui-bridge@2.0.0-beta1-d3b766ae248a8ed4ac11ebfd6f6ac7a31294dde9cb3d9f047192921b6c1ca1c4.js", "cuid": "/assets/vendor/cuid@2.1.8-04b3f7922ef09493e6de1674985aa9e6db1ef22b5b459ff55dfebfc7fb223403.js", "rxjs": "https://cdnjs.betterstack.com/rxjs@^7.4.0/dist/esm/index.js", "rxjs/": "https://cdnjs.betterstack.com/rxjs@^7.4.0/dist/esm/", "tslib": "https://cdnjs.betterstack.com/tslib@2.3.1/tslib.es6.js", "virtua": "https://cdnjs.betterstack.com/virtua@0.39.0/lib/vue/index.mjs", "flexsearch": "https://cdnjs.betterstack.com/flexsearch@0.7.43/dist/flexsearch.light.module.min.js" } }</script> <link rel="modulepreload" href="https://cdnjs.betterstack.com/vue@3.4.31/dist/vue.esm-browser.prod.js" nonce="c9a332ba8a39e9c75b60608445faf2e8"> <link rel="modulepreload" href="https://cdnjs.betterstack.com/@vue/devtools-api@6.6.3/lib/esm/index.js" nonce="c9a332ba8a39e9c75b60608445faf2e8"> <link rel="modulepreload" href="https://cdnjs.betterstack.com/vue-demi@0.14.8/lib/index.mjs" nonce="c9a332ba8a39e9c75b60608445faf2e8"> <link rel="modulepreload" href="https://cdnjs.betterstack.com/pinia@2.1.7/dist/pinia.esm-browser.js" nonce="c9a332ba8a39e9c75b60608445faf2e8"> <link rel="modulepreload" href="https://cdnjs.betterstack.com/vue-turbolinks@2.2.2/index.js" nonce="c9a332ba8a39e9c75b60608445faf2e8"> <script type="esms-options" nonce="c9a332ba8a39e9c75b60608445faf2e8">{"nonce":"c9a332ba8a39e9c75b60608445faf2e8"}</script> <script src="/assets/es-module-shims.min-d89e73202ec09dede55fb74115af9c5f9f2bb965433de1c2446e1faa6dac2470.js" defer="defer" data-turbo-track="reload" nonce="c9a332ba8a39e9c75b60608445faf2e8"></script> <script type="module" nonce="c9a332ba8a39e9c75b60608445faf2e8"> //<![CDATA[ import * as Sentry from '@sentry/vue' Sentry.init({ dsn: "https://5d12720845819aced5e1d8d5ed797725@o1399417.ingest.sentry.io/4507566687649792", // integrations: [Sentry.browserProfilingIntegration(), Sentry.browserTracingIntegration()], ignoreErrors: ["ignore:service_returned_401", "No error message"], environment: "production", release: window.cfg.app_version, // tracesSampleRate: 0.1, // profilesSampleRate: 0.1, denyUrls: [/chat-assets\.frontapp\.com/i], app: [], }); Sentry.setUser({ email: "" }); window.Sentry = Sentry; //]]> </script> <script type="module" nonce="c9a332ba8a39e9c75b60608445faf2e8">import "entrypoints/articles"</script> <script type="application/javascript" nonce="c9a332ba8a39e9c75b60608445faf2e8"> //<![CDATA[ if (!HTMLScriptElement?.supports?.('importmap')) { alert('Your browser is not supported. Please upgrade to a newer version of Chrome, Firefox, Safari or other modern browser.') } //]]> </script> <script type="module" nonce="c9a332ba8a39e9c75b60608445faf2e8">import "channels"</script> <link rel="stylesheet" href="/assets/articles-baef9cc2d3cd7cbcabe2dc4cde5d3e2ee98b055c4a90a30411be3d0488785088.css" media="all" data-turbo-track="reload" /> <style> @supports (-webkit-hyphens:none) { .book, .book:hover { filter: unset; } } </style> <script type="application/ld+json" nonce="c9a332ba8a39e9c75b60608445faf2e8"> //<![CDATA[ [ { "@context": "https://schema.org", "@type": "Article", "headline": "Best Logging Practices for Safeguarding Sensitive Data", "author": "Eric Hu", "image": "/og-image/sensitive-data.png", "genre": "", "keywords": "", "publisher": { "@type": "Organization", "name": "Better Stack", "logo": { "@type": "ImageObject", "url": "https://betterstack.com/assets/logo-e81f7f79f9298e052fa7d3111a4311cd18f731f3fdf99859cb63e70002365bb3.png" } }, "url": "https://betterstack.com/community/guides/logging/sensitive-data/", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://google.com/article" }, "datePublished": "2023-06-29T10:02:38Z", "dateCreated": "2023-06-29T10:02:38Z", "dateModified": "2024-01-09T16:20:37Z", "description": "In this guide, you will learn several best practices for keeping sensitive data out of your logs" } ] //]]> </script><link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Regular.woff2' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Regular.woff' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Medium.woff2' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Medium.woff' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-SemiBold.woff2' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-SemiBold.woff' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Bold.woff2' rel='preload'> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Roobert/Roobert-Bold.woff' rel='preload'> <style> @font-face { font-family: "Roobert"; font-style: normal; font-weight: 400; font-display: swap; src: url("/static/fonts/Roobert/Roobert-Regular.woff2") format("woff2"), url("/static/fonts/Roobert/Roobert-Regular.woff") format("woff"); } @font-face { font-family: "Roobert"; font-style: normal; font-weight: 500; font-display: swap; src: url("/static/fonts/Roobert/Roobert-Medium.woff2") format("woff2"), url("/static/fonts/Roobert/Roobert-Medium.woff") format("woff"); } @font-face { font-family: "Roobert"; font-style: normal; font-weight: 600; font-display: swap; src: url("/static/fonts/Roobert/Roobert-SemiBold.woff2") format("woff2"), url("/static/fonts/Roobert/Roobert-SemiBold.woff") format("woff"); } @font-face { font-family: "Roobert"; font-style: normal; font-weight: 700; font-display: swap; src: url("/static/fonts/Roobert/Roobert-Bold.woff2") format("woff2"), url("/static/fonts/Roobert/Roobert-Bold.woff") format("woff"); } </style> <link as='font' crossorigin='anonymous' href='https://betterstack.com/static/fonts/Inter/Inter-latin.woff2' rel='preload'> <style> @font-face { font-family: 'Inter'; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/static/fonts/Inter/Inter-latin.woff2") format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } </style> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowText-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowText-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowText-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowDisplay-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="preload" href="/static/fonts/Helvetica/HelveticaNowDisplay-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <style> @font-face { font-family: 'Helvetica Now Text'; src: local('Helvetica Now Text Regular'), local('HelveticaNowText-Regular'), url('/static/fonts/Helvetica/HelveticaNowText-Regular.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: 'Helvetica Now Text'; src: local('Helvetica Now Text Medium'), local('HelveticaNowText-Medium'), url('/static/fonts/Helvetica/HelveticaNowText-Medium.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: 'Helvetica Now Text'; src: local('Helvetica Now Text Bold'), local('HelveticaNowText-Bold'), url('/static/fonts/Helvetica/HelveticaNowText-Bold.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; } @font-face { font-family: 'Helvetica Now Display'; src: local('Helvetica Now Display Medium'), local('HelveticaNowDisplay-Medium'), url('/static/fonts/Helvetica/HelveticaNowDisplay-Medium.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: 'Helvetica Now Display'; src: local('Helvetica Now Display Bold'), local('HelveticaNowDisplay-Bold'), url('/static/fonts/Helvetica/HelveticaNowDisplay-Bold.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; } </style> <meta content='Guides' name='meta-docsearch-hierarchy1'> <meta content='Logging' name='meta-docsearch-hierarchy2'> <meta content='Best Practices' name='meta-docsearch-hierarchy3'> <meta content='Best Logging Practices for Safeguarding Sensitive Data' name='meta-docsearch-hierarchy4'> <meta content='Keeping Sensitive Data From Logs' name='meta-docsearch-name'> <meta content='Best Logging Practices for Safeguarding Sensitive Data' name='meta-docsearch-title'> <meta content='In this guide, you will learn several best practices for keeping sensitive data out of your logs' name='meta-docsearch-description'> <meta content='In this guide, you will learn several best practices for keeping sensitive data out of your logs' name='meta-docsearch-og_description'> <meta content='Eric Hu' name='meta-docsearch-authors'> </head> <body> <script type="application/javascript" nonce="c9a332ba8a39e9c75b60608445faf2e8"> //<![CDATA[ window.cfg = {"base_host":"betterstack.com","base_url":"https://betterstack.com","better_stack_url":"https://betterstack.com","uptime_url":"https://uptime.betterstack.com","logtail_url":"https://telemetry.betterstack.com","posthog":{"api_host":"https://t.betterstack.com","api_key":"phc_Tbfg4EiRsr5iefFoth2Y1Hi3sttTeLQ5RV5TLg4hL1W","related_domains":["betteruptime.com","logtail.com"]},"permissions":{},"controller":"articles","action":"show","app":"betterstack","theme":"system","organization_id":null,"team_id":null,"environment":"production","browser_timezone":null,"signed_in":false,"team_switcher_items":[]}; //]]> </script> <div class='main articles bg-[#0B0C14]'> <header class='z-40 top-0 left-0 right-0 flex justify-center helvetica bg-[#0B0C14]/80 relative before:absolute before:-z-10 before:inset-0 before:backdrop-blur-2xl' id='navbar'> <nav class='grow flex justify-between border-b mx-5 max-w-[1110px] h-[52px] text-[13px] leading-[100%] text-[#C9D3EE] border-[#727DA1]/15'> <div class='flex items-stretch gap-3'> <a aria-label='Go to homepage' class='flex items-center py-3' href='/'> <svg width='154' height='21' class='scale-[65%] -mx-6' alt='Better Stack' style='--currentColor: currentColor;'><use href='/assets/v2/better-stack-logo-0dd586683a61184ea953948d207470eeec73c76d81d57cd8af24bf56b36a90db.svg#root' /></svg> </a> <div class='hidden md:flex items-stretch gap-4'> <button aria-controls='platform-menu' aria-haspopup='menu' class='pl-3 py-3 pr-6 -mr-3 group relative flex items-center'> <div class='transition group-hover:text-white'>Platform</div> <span class='absolute right-2 text-[#656A7B]'><svg class='group-hover:rotate-180 transition w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-down-ca9a5c77e9dbeb8f579d14aa09540c2e7fd1df2b870baf7bb2b697d8628d2237.svg#root' /></svg></span> <div class='hidden group-hover:block absolute z-40 top-full left-0 text-left' id='platform-menu' role='menu' tabindex='-1'> <div class='rounded-lg border backdrop-blur-2xl flex w-[650px] p-[6px] bg-[#181926]/80 border-[#1F2433]/75'> <div class='flex-1 md:px-2 py-3 flex flex-col gap-1 border-b md:border-b-0 md:border-r relative border-[#1F2433]/40'> <div class='absolute -top-7 bottom-full left-0 right-0'></div> <a class='-my-1 p-1 flex items-center gap-3 group/uptime ml-[6px]' href='/uptime'> <svg width='69' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/uptime-logo-fcc6a01850aa0409e3743c6b70051bfc042504854c76a833ef52512d92dccc16.svg#root' /></svg> <div class='border-l relative top-[1px] h-[12px] border-[#727DA1]/30'></div> <div class='text-sm text-neutral-200 flex items-center'> <span class='mr-1'>Better Stack</span> <svg class='transition-all relative top-[1px] h-4 w-0 group-hover/uptime:w-4 inline' alt='' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/arrow-right-c07cd271c9c8d131084c513571295decfe8bf410e675cdde2686c1adf90b494b.svg#root' /></svg> <svg class='transition-all relative top-[1px] h-4 w-4 group-hover/uptime:w-0 inline' alt='' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/chevron-right-ee58bdc22e1fb683dd9ffd95ba0c4df56d8a2a0904d7ddbe63b6e2b4ab82f090.svg#root' /></svg> </div> </a> <hr class='mt-2 border-t border-[#1F2433]/40'> <a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/uptime"><span class='mr-1 text-[#7C87F7]'><svg class='relative top-[-2px] left-[2px] brand-primary-text-100 w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/globe-alt-5353caa43f8b313373d83572e4ad34e7a563836c16aa6096a14a264330713862.svg#root' /></svg></span> <div> <div class='font-medium'>Uptime monitoring</div> <div class='mt-1 text-xs text-neutral-200'>Get 10 monitors, and a status page totally free.</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/incident-management"><span class='text-[#7C87F7]'><svg width='25' height='24' alt='' class='relative top-[-2px] scale-[90%]' style='--currentColor: currentColor;'><use href='/assets/v2/calendar-6357844552d3ab90ba30b8f0b220de1523ff3aeee8c314a7805eecc7c7393754.svg#root' /></svg></span> <div> <div class='font-medium'>Incident management & on-call</div> <div class='mt-1 text-xs text-neutral-200'>Get a call when your website goes down</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/status-page"><span class='mr-1 text-[#7C87F7]'><svg width='20' height='20' alt='' class='relative top-[-1px] left-[2px]' style='--currentColor: currentColor;'><use href='/assets/v2/page-e138419398f9cc3e22fdf0693bc55a06d3cc6daec37069e878be827b24d07521.svg#root' /></svg></span> <div> <div class='font-medium'>Status page</div> <div class='mt-1 text-xs text-neutral-200'>Communicate downtime & build trust</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/incident-silencing"><span class='mr-1 text-[#7C87F7]'><svg class='relative top-[-1px] left-[2px] brand-primary-text-100 w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/bell-alert-bae43eae97d5f8f065ac7cfc69ecfb8325b06acf5014e922db6f5ed2b0da780c.svg#root' /></svg></span> <div> <div class='font-medium'>Incident silencing</div> <div class='mt-1 text-xs text-neutral-200'>Reduce alert noise & prevent alert fatigue</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/slack-incident-management"><div class='mr-1 w-[18px] h-[18px] mt-[2px] text-brand-primary-100'><svg alt='' class='w-full h-full relative top-[-1px] left-[2px]' style='--currentColor: currentColor;'><use href='/assets/v2/slack-77d755b1a6198a50134d9500924a07b2a55cfb06d5d704776cddd5d419701977.svg#root' /></svg></div> <div> <div class='font-medium'>Slack-based incident management</div> <div class='mt-1 text-xs text-neutral-200'>Resolve incidents directly in Slack</div> </div> </a></div> <div class='flex-1 mt-2 md:mt-0 md:px-2 py-3 flex flex-col gap-1'> <a class='ml-1 -my-1 p-1 flex items-center gap-3 group/logtail' href='/telemetry'> <svg width='227' height='48' alt='' class='w-[95px] h-5' style='--currentColor: currentColor;'><use href='/assets/v2/telemetry-logo-9698cd9133dcc1454659c661f4632fb8d4453b2e62bd2f98a248c69a3767fb8a.svg#root' /></svg> <div class='border-l relative top-[1px] h-[12px] border-[#727DA1]/30'></div> <div class='text-sm text-neutral-200 flex items-center'> <span class='mr-1'>Better Stack</span> <svg class='transition-all relative top-[1px] h-4 w-0 group-hover/logtail:w-4 inline' alt='' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/arrow-right-c07cd271c9c8d131084c513571295decfe8bf410e675cdde2686c1adf90b494b.svg#root' /></svg> <svg class='transition-all relative top-[1px] h-4 w-4 group-hover/logtail:w-0 inline' alt='' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/chevron-right-ee58bdc22e1fb683dd9ffd95ba0c4df56d8a2a0904d7ddbe63b6e2b4ab82f090.svg#root' /></svg> </div> </a> <hr class='mt-2 border-t border-[#1F2433]/40'> <a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/telemetry"><span class='text-[#7C87F7]'><svg width='25' height='24' alt='' class='relative top-[-2px] scale-[90%]' style='--currentColor: currentColor;'><use href='/assets/v2/code-insert-b8f283aedd6b241eb85334d4566ca3fbe15a8fc15c4ecf8638bc97f7da00e854.svg#root' /></svg></span> <div> <div class='font-medium'>Log management</div> <div class='mt-1 text-xs text-neutral-200'>Collect insights across your stack</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/infrastructure-monitoring"><span class='mr-1 text-[#7C87F7]'><svg class='relative top-[-1px] left-[2px] brand-primary-text-100 w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/server-stack-d9821d67c85b098d180212edfdab2f04b882ab293f52834aa72d0fd2fbe06b0d.svg#root' /></svg></span> <div> <div class='font-medium'>Infrastructure monitoring</div> <div class='mt-1 text-xs text-neutral-200'>OpenTelemetry-native infrastructure monitoring</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/dashboards"><span class='text-[#7C87F7]'><svg width='25' height='24' alt='' class='relative top-[-2px] scale-[90%]' style='--currentColor: currentColor;'><use href='/assets/v2/flipchart-2cc00e4a7089a6b436dc7686bb14f3cac3ebb97a628e5824ead4ee4b38f179b3.svg#root' /></svg></span> <div> <div class='font-medium'>Observability dashboards</div> <div class='mt-1 text-xs text-neutral-200'>Analyze metrics across your services</div> </div> </a></div> </div> </div> </button> <a class='hidden lg:flex p-3 hover:text-white transition items-center' href='https://betterstack.com/docs/uptime'> <span>Documentation</span> </a> <a class='hidden lg:flex p-3 hover:text-white transition items-center' href='/pricing'> <span>Pricing</span> </a> <form action='https://betterstack.com/community' class='m-0 flex items-stretch'> <button aria-controls='community-menu' aria-haspopup='menu' class='p-3 group relative flex items-center' type='submit'> <div class='transition group-hover:text-white'>Community</div> <span class='absolute -right-1 text-[#656A7B]'><svg class='group-hover:rotate-180 transition w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-down-ca9a5c77e9dbeb8f579d14aa09540c2e7fd1df2b870baf7bb2b697d8628d2237.svg#root' /></svg></span> <div class='hidden group-hover:block absolute z-40 top-full left-0 text-left' id='community-menu' role='menu' tabindex='-1'> <div class='rounded-lg border backdrop-blur-2xl flex flex-col gap-1 w-[174px] p-[6px] bg-[#181926]/80 border-[#1F2433]/75'> <a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%] md:hidden" href="https://betterstack.com/community"><span class='text-neutral-200'><svg class='mx-[2px] w-4 h-4 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/users-26c9af687d35d046de38f868bdfb06189d53f15b4a1c1593671ce07998a8ccb0.svg#root' /></svg></span> Community home </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="https://betterstack.com/community/guides"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/guides-3c7383ba1af5330b1c7df20232fb7c2df8ca63a0fad8de36a12930eefd4d23f5.svg#root' /></svg></span> Guides </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="https://betterstack.com/community/questions"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/questions-f8bf552415b1338196322c800af25f02649065803debc56e35284dc8817f4f62.svg#root' /></svg></span> Questions </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="https://betterstack.com/community/comparisons"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/comparisons-fb6863a2e083bb6469dc4f30df33fda11ca8ddb21e20b705fee14bbd01f921e1.svg#root' /></svg></span> Comparisons </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="https://betterstack.com/community/blog"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/blog-b6395fefdf95ecf0d620f4edb28e3684d1bf00f1f7ed3450247f3822d54413e5.svg#root' /></svg></span> Blog </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" target="_blank" href="https://newsletter.betterstack.com/"><span class='text-neutral-200'><svg class=' w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/newspaper-c03849807579231cbe11aab7bb71b8810c2ad486782add5cc373e187b9fd211a.svg#root' /></svg></span> Newsletter </a> </div> </div> </button> </form> <button aria-controls='company-menu' aria-haspopup='menu' class='p-3 group relative flex items-center'> <div class='transition group-hover:text-white'>Company</div> <span class='absolute -right-1 text-[#656A7B]'><svg class='group-hover:rotate-180 transition w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-down-ca9a5c77e9dbeb8f579d14aa09540c2e7fd1df2b870baf7bb2b697d8628d2237.svg#root' /></svg></span> <div class='hidden group-hover:block absolute z-40 top-full left-0 text-left' id='company-menu' role='menu' tabindex='-1'> <div class='rounded-lg border backdrop-blur-2xl flex flex-col gap-1 w-[190px] p-[6px] bg-[#181926]/80 border-[#1F2433]/75'> <a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="/careers"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/ship-fac80f771cb6bf9b83f75566358b7f7f55096ead16224af4a5017c66d7c95d2d.svg#root' /></svg></span> Work at Better Stack </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="/careers/engineering"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/code-962cf453e652fb895c84780aeeef1b4b86dfe3746a37745c329574151171174e.svg#root' /></svg></span> Engineering </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="/security"><span class='text-neutral-200'><svg width='20' height='20' alt='' class=' w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/shield-check-3c099ada976d7267d4d10e6a1989b201b1a2bc19e24d8d856d2267b25b355423.svg#root' /></svg></span> Security </a> </div> </div> </button> <a class='hidden lg:flex p-3 hover:text-white transition items-center' href='/enterprise'> <span>Enterprise</span> </a> </div> </div> <div class='flex items-center sm:gap-2 whitespace-nowrap -mr-3 md:mr-0'> <a class="p-2 transition hover:text-white" data-turbo="false" href="/users/sign-in">Sign in</a> <a class="px-2 h-[27px] flex items-center rounded bg-button-gradient text-white font-medium" data-turbo="false" href="/users/sign-up">Sign up</a> <button aria-label='Open menu' class='p-2 group relative md:hidden text-neutral-300' id='open-menu'> <svg class=' w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/bars-3-351934c6c1a4098059288510d0dae400e4c50af0fb9ab0861217099dae52d243.svg#root' /></svg> </button> <button aria-label='Close menu' class='hidden p-2 group relative md:hidden text-neutral-300' id='close-menu'> <svg class=' w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/x-mark-79d01b614be655fe3c9476bfc5894abf50a46176906bb008c2d4837615e51312.svg#root' /></svg> </button> </div> <div class='hidden md:hidden p-5 fixed z-40 left-0 right-0 backdrop-blur-2xl top-[52px] bg-[#181926]/80 text-[#C9D3EE]' id='mobile-menu'> <div class='js-menu-section flex flex-col gap-1' data-section='root'> <button class='p-3 group relative flex items-center' data-section='platform'> Platform <span class='text-[#656A7B]'><svg class='ml-[6px] w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-right-3f07eda912c8d37d8cf5af5275dde316fd9aa22bf0aca16e515d4bb8f25196c3.svg#root' /></svg></span> </button> <a class="p-3" href="https://betterstack.com/docs/">Documentation</a> <a class="p-3" href="/pricing">Pricing</a> <button class='p-3 group relative flex items-center' data-section='community'> Community <span class='text-[#656A7B]'><svg class='ml-[6px] w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-right-3f07eda912c8d37d8cf5af5275dde316fd9aa22bf0aca16e515d4bb8f25196c3.svg#root' /></svg></span> </button> <button class='p-3 group relative flex items-center' data-section='company'> Company <span class='text-[#656A7B]'><svg class='ml-[6px] w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-right-3f07eda912c8d37d8cf5af5275dde316fd9aa22bf0aca16e515d4bb8f25196c3.svg#root' /></svg></span> </button> <a class="p-3" href="/enterprise">Enterprise</a> </div> <div class='js-menu-section hidden' data-section='platform'> <button class='mb-2 p-3 group relative flex items-center' data-section='root'> <svg class='mr-[6px] w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-left-1fa568d125ef223858e7f0d6c6c1ea990e71ddf434f875a8a2c4bbb23fc692a6.svg#root' /></svg> Back </button> <div class='flex-1 md:px-2 py-3 flex flex-col gap-1 border-b md:border-b-0 md:border-r relative border-[#1F2433]/40'> <div class='absolute -top-7 bottom-full left-0 right-0'></div> <a class='-my-1 p-1 flex items-center gap-3 group/uptime ml-[6px]' href='/uptime'> <svg width='69' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/uptime-logo-fcc6a01850aa0409e3743c6b70051bfc042504854c76a833ef52512d92dccc16.svg#root' /></svg> <div class='border-l relative top-[1px] h-[12px] border-[#727DA1]/30'></div> <div class='text-sm text-neutral-200 flex items-center'> <span class='mr-1'>Better Stack</span> <svg class='transition-all relative top-[1px] h-4 w-0 group-hover/uptime:w-4 inline' alt='' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/arrow-right-c07cd271c9c8d131084c513571295decfe8bf410e675cdde2686c1adf90b494b.svg#root' /></svg> <svg class='transition-all relative top-[1px] h-4 w-4 group-hover/uptime:w-0 inline' alt='' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/chevron-right-ee58bdc22e1fb683dd9ffd95ba0c4df56d8a2a0904d7ddbe63b6e2b4ab82f090.svg#root' /></svg> </div> </a> <hr class='mt-2 border-t border-[#1F2433]/40'> <a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/uptime"><span class='mr-1 text-[#7C87F7]'><svg class='relative top-[-2px] left-[2px] brand-primary-text-100 w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/globe-alt-5353caa43f8b313373d83572e4ad34e7a563836c16aa6096a14a264330713862.svg#root' /></svg></span> <div> <div class='font-medium'>Uptime monitoring</div> <div class='mt-1 text-xs text-neutral-200'>Get 10 monitors, and a status page totally free.</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/incident-management"><span class='text-[#7C87F7]'><svg width='25' height='24' alt='' class='relative top-[-2px] scale-[90%]' style='--currentColor: currentColor;'><use href='/assets/v2/calendar-6357844552d3ab90ba30b8f0b220de1523ff3aeee8c314a7805eecc7c7393754.svg#root' /></svg></span> <div> <div class='font-medium'>Incident management & on-call</div> <div class='mt-1 text-xs text-neutral-200'>Get a call when your website goes down</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/status-page"><span class='mr-1 text-[#7C87F7]'><svg width='20' height='20' alt='' class='relative top-[-1px] left-[2px]' style='--currentColor: currentColor;'><use href='/assets/v2/page-e138419398f9cc3e22fdf0693bc55a06d3cc6daec37069e878be827b24d07521.svg#root' /></svg></span> <div> <div class='font-medium'>Status page</div> <div class='mt-1 text-xs text-neutral-200'>Communicate downtime & build trust</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/incident-silencing"><span class='mr-1 text-[#7C87F7]'><svg class='relative top-[-1px] left-[2px] brand-primary-text-100 w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/bell-alert-bae43eae97d5f8f065ac7cfc69ecfb8325b06acf5014e922db6f5ed2b0da780c.svg#root' /></svg></span> <div> <div class='font-medium'>Incident silencing</div> <div class='mt-1 text-xs text-neutral-200'>Reduce alert noise & prevent alert fatigue</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/slack-incident-management"><div class='mr-1 w-[18px] h-[18px] mt-[2px] text-brand-primary-100'><svg alt='' class='w-full h-full relative top-[-1px] left-[2px]' style='--currentColor: currentColor;'><use href='/assets/v2/slack-77d755b1a6198a50134d9500924a07b2a55cfb06d5d704776cddd5d419701977.svg#root' /></svg></div> <div> <div class='font-medium'>Slack-based incident management</div> <div class='mt-1 text-xs text-neutral-200'>Resolve incidents directly in Slack</div> </div> </a></div> <div class='flex-1 mt-2 md:mt-0 md:px-2 py-3 flex flex-col gap-1'> <a class='ml-1 -my-1 p-1 flex items-center gap-3 group/logtail' href='/telemetry'> <svg width='227' height='48' alt='' class='w-[95px] h-5' style='--currentColor: currentColor;'><use href='/assets/v2/telemetry-logo-9698cd9133dcc1454659c661f4632fb8d4453b2e62bd2f98a248c69a3767fb8a.svg#root' /></svg> <div class='border-l relative top-[1px] h-[12px] border-[#727DA1]/30'></div> <div class='text-sm text-neutral-200 flex items-center'> <span class='mr-1'>Better Stack</span> <svg class='transition-all relative top-[1px] h-4 w-0 group-hover/logtail:w-4 inline' alt='' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/arrow-right-c07cd271c9c8d131084c513571295decfe8bf410e675cdde2686c1adf90b494b.svg#root' /></svg> <svg class='transition-all relative top-[1px] h-4 w-4 group-hover/logtail:w-0 inline' alt='' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/chevron-right-ee58bdc22e1fb683dd9ffd95ba0c4df56d8a2a0904d7ddbe63b6e2b4ab82f090.svg#root' /></svg> </div> </a> <hr class='mt-2 border-t border-[#1F2433]/40'> <a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/telemetry"><span class='text-[#7C87F7]'><svg width='25' height='24' alt='' class='relative top-[-2px] scale-[90%]' style='--currentColor: currentColor;'><use href='/assets/v2/code-insert-b8f283aedd6b241eb85334d4566ca3fbe15a8fc15c4ecf8638bc97f7da00e854.svg#root' /></svg></span> <div> <div class='font-medium'>Log management</div> <div class='mt-1 text-xs text-neutral-200'>Collect insights across your stack</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/infrastructure-monitoring"><span class='mr-1 text-[#7C87F7]'><svg class='relative top-[-1px] left-[2px] brand-primary-text-100 w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/server-stack-d9821d67c85b098d180212edfdab2f04b882ab293f52834aa72d0fd2fbe06b0d.svg#root' /></svg></span> <div> <div class='font-medium'>Infrastructure monitoring</div> <div class='mt-1 text-xs text-neutral-200'>OpenTelemetry-native infrastructure monitoring</div> </div> </a><a class="block px-2 flex gap-2 transition py-[10px] hover:bg-[#727DA1]/15 rounded leading-[145%]" href="/dashboards"><span class='text-[#7C87F7]'><svg width='25' height='24' alt='' class='relative top-[-2px] scale-[90%]' style='--currentColor: currentColor;'><use href='/assets/v2/flipchart-2cc00e4a7089a6b436dc7686bb14f3cac3ebb97a628e5824ead4ee4b38f179b3.svg#root' /></svg></span> <div> <div class='font-medium'>Observability dashboards</div> <div class='mt-1 text-xs text-neutral-200'>Analyze metrics across your services</div> </div> </a></div> </div> <div class='js-menu-section hidden flex flex-col gap-1' data-section='community'> <button class='mb-2 p-3 group relative flex items-center' data-section='root'> <svg class='mr-[6px] w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-left-1fa568d125ef223858e7f0d6c6c1ea990e71ddf434f875a8a2c4bbb23fc692a6.svg#root' /></svg> Back </button> <a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%] md:hidden" href="https://betterstack.com/community"><span class='text-neutral-200'><svg class='mx-[2px] w-4 h-4 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/users-26c9af687d35d046de38f868bdfb06189d53f15b4a1c1593671ce07998a8ccb0.svg#root' /></svg></span> Community home </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="https://betterstack.com/community/guides"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/guides-3c7383ba1af5330b1c7df20232fb7c2df8ca63a0fad8de36a12930eefd4d23f5.svg#root' /></svg></span> Guides </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="https://betterstack.com/community/questions"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/questions-f8bf552415b1338196322c800af25f02649065803debc56e35284dc8817f4f62.svg#root' /></svg></span> Questions </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="https://betterstack.com/community/comparisons"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/comparisons-fb6863a2e083bb6469dc4f30df33fda11ca8ddb21e20b705fee14bbd01f921e1.svg#root' /></svg></span> Comparisons </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="https://betterstack.com/community/blog"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/blog-b6395fefdf95ecf0d620f4edb28e3684d1bf00f1f7ed3450247f3822d54413e5.svg#root' /></svg></span> Blog </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" target="_blank" href="https://newsletter.betterstack.com/"><span class='text-neutral-200'><svg class=' w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/newspaper-c03849807579231cbe11aab7bb71b8810c2ad486782add5cc373e187b9fd211a.svg#root' /></svg></span> Newsletter </a> </div> <div class='js-menu-section hidden pb-5 flex flex-col gap-1' data-section='company'> <button class='mb-2 p-3 group relative flex items-center' data-section='root'> <svg class='mr-[6px] w-[11px] h-[11px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/chevron-left-1fa568d125ef223858e7f0d6c6c1ea990e71ddf434f875a8a2c4bbb23fc692a6.svg#root' /></svg> Back </button> <a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="/careers"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/ship-fac80f771cb6bf9b83f75566358b7f7f55096ead16224af4a5017c66d7c95d2d.svg#root' /></svg></span> Work at Better Stack </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="/careers/engineering"><span class='text-neutral-200'><svg width='20' height='20' alt='' style='--currentColor: currentColor;'><use href='/assets/v2/code-962cf453e652fb895c84780aeeef1b4b86dfe3746a37745c329574151171174e.svg#root' /></svg></span> Engineering </a><a class="block px-2 flex items-center gap-2 transition py-[6px] hover:bg-[#727DA1]/15 rounded-[6px] leading-[145%]" href="/security"><span class='text-neutral-200'><svg width='20' height='20' alt='' class=' w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/shield-check-3c099ada976d7267d4d10e6a1989b201b1a2bc19e24d8d856d2267b25b355423.svg#root' /></svg></span> Security </a> </div> </div> </nav> </header> <header class='dark sticky top-0 z-30 flex justify-center leading-none w-full backdrop-blur-2xl bg-[#0B0C14]/80 text-[13px]'> <div class='mx-2 sm:mx-5 flex grow overflow-x-scroll no-scrollbars relative max-w-[1110px]'> <nav class='grow flex items-center border-b h-[49px] border-[#727DA1]/15'> <a class='block mr-5 ml-2 p-2 hover:text-white mt-[-2px]' href='/community/?utm_content&utm_medium=guides&utm_source=community&utm_term=sensitive-data'> Community </a> <div class='grow flex items-stretch gap-5 md:justify-between'> <ul class='flex items-center gap-5 whitespace-nowrap'> <li class='flex relative dropdown-trigger hover:text-white'> <a class='w-full p-2 text-white rounded bg-[#98A4F714]' href='/community/guides/?utm_content&utm_medium=guides&utm_source=community&utm_term=sensitive-data'> Guides </a> </li> <li class='flex relative dropdown-trigger hover:text-white'> <a class='w-full p-2' href='/community/questions/?utm_content&utm_medium=guides&utm_source=community&utm_term=sensitive-data'> Questions </a> </li> <li class='flex relative dropdown-trigger hover:text-white'> <a class='w-full p-2' href='/community/comparisons/?utm_content&utm_medium=guides&utm_source=community&utm_term=sensitive-data'> Comparisons </a> </li> <li class='flex relative dropdown-trigger hover:text-white'> <a class='w-full p-2' href='/community/blog/?utm_content&utm_medium=guides&utm_source=community&utm_term=sensitive-data'> Blog </a> </li> </ul> <a class='flex items-center hover:text-white md:hidden' href='https://betterstack.com/docs/'>Docs</a> <div class='sticky md:absolute z-10 right-2 md:right-0 top-0 bottom-0 flex items-center gap-5 whitespace-nowrap'> <a class='hover:text-white hidden md:block' href='https://betterstack.com/docs/'>Documentation</a> <div id='docsearch-container'></div> <script src='https://cdnjs.betterstack.com/@docsearch/js@3.5.2/dist/umd/index.js'></script> <script nonce="c9a332ba8a39e9c75b60608445faf2e8"> //<![CDATA[ function loadDocsearch() { if (!window.docsearch) { setTimeout(loadDocsearch, 50); return; } window.docsearch({ container: '#docsearch-container', appId: '4N04E5JBP3', indexName: 'betterstack22', apiKey: '1acd2b32f9173069cd6467c9d186e21f', maxResultsPerGroup: 20, searchParameters: { hitsPerPage: 20, }, }); // This hack prevents scrolling after closing the modal in Safari. // https://github.com/algolia/docsearch/issues/1260 document.getElementsByClassName('DocSearch DocSearch-Button')[0]?.addEventListener('click', function (event) { document.querySelectorAll('.js-docsearch-anchor').forEach((element) => { element.parentNode.removeChild(element); }); const input = document.createElement('input') input.setAttribute('type', 'text') const div = document.createElement('div'); div.appendChild(input); div.classList.add('fixed', 'js-docsearch-anchor'); document.body.appendChild(div); }); // Without this CMD+K would open one modal per visited page with the search. // Docsearch does not support 'destroy', so we need to hack it. document.addEventListener('keydown', function (event) { if (event.key === 'k' && event.metaKey) { event.stopPropagation(); document.getElementsByClassName('DocSearch DocSearch-Button')[0]?.click(); } }); } loadDocsearch(); //]]> </script> </div> </div> </nav> </div> <div class='absolute pointer-events-none top-0 bottom-0 right-0 bg-gradient-to-l md:hidden w-28 from-[#0B0C14] via-[#0B0C14]'></div> </header> <div class='bg-white'><main> <div class='dark bg-primary-hero'> <div class='mx-auto pt-4 pb-8 px-7 max-w-[1130px]'> <a class='text-base text-[#C9D3EE]' href='/community/guides/logging/'> <svg class='inline mr-2 -mt-[2px] w-4 h-4 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/outline/arrow-left-ed700dfed9514ccfb810fa7a4d596df346b95f0b52f9f415dc3fd98fdde23853.svg#root' /></svg> Back to Logging guides </a> <div class='pt-10 md:pt-16 lg:pt-20'> <h1 class='font-helveticaDisplay font-bold text-center text-white overflow-hidden text-ellipsis mx-auto text-[36px] md:text-[48px] lg:text-[54px] leading-[120%] max-w-[640px]'> Best Logging Practices for Safeguarding Sensitive Data </h1> <div class='mt-4 flex justify-center text-base flex-wrap'> <a class="px-[10px] py-[2px] mr-2 mt-2 rounded-lg bg-white/[0.04] hover:bg-white/[0.05] border border-white/[0.05] text-white whitespace-nowrap" href="/tag/best-practices?utm_content&utm_medium=guides&utm_source=community&utm_term=sensitive-data">Best Practices</a> <a class="px-[10px] py-[2px] mr-2 mt-2 rounded-lg bg-white/[0.04] hover:bg-white/[0.05] border border-white/[0.05] text-white whitespace-nowrap" href="/tag/logging?utm_content&utm_medium=guides&utm_source=community&utm_term=sensitive-data">Logging</a> <a class="px-[10px] py-[2px] mr-2 mt-2 rounded-lg bg-white/[0.04] hover:bg-white/[0.05] border border-white/[0.05] text-white whitespace-nowrap" href="/tag/sensitive-data?utm_content&utm_medium=guides&utm_source=community&utm_term=sensitive-data">Sensitive Data</a> </div> <div class='mt-10 md:mt-16 mt-20 text-center'> <div class='text-white'>Eric Hu</div> <div class='mt-1 uppercase whitespace-nowrap text-xs font-medium text-neutral-300 tracking-[1.56px]'> Updated on January 9, 2024 </div> </div> </div> </div> </div> <div class='container mx-auto py-8 lg:py-16 max-w-[1130px]'> <div class='lg:flex' data-controller='toc'> <div class='grow xl:flex'> <div class='sticky hidden xl:block mr-12 shrink-0 w-[190px]' data-toc-target='toc'> <div class='text-base text-neutral-300 sticky scroll-smooth overflow-y-auto pretty-scrollbars max-h-screen top-[100px] pb-40'> <h6 class='text-neutral-800 font-bold'>Contents</h6> <div class='table-of-contents flat'> <ul> <li> <a href="#what-is-sensitive-data">What is sensitive data</a> </li> <li> <a href="#1-exclude-sensitive-data-from-your-code">1. Exclude sensitive data from your code</a> </li> <li> <a href="#2-masking-redacting-sensitive-data">2. Masking/Redacting sensitive data</a> </li> <li> <a href="#3-tokenize-sensitive-data">3. Tokenize sensitive data</a> </li> <li> <a href="#4-encrypting-data-transmission">4. Encrypting data transmission</a> </li> <li> <a href="#5-keeping-sensitive-data-out-of-urls">5. Keeping sensitive data out of URLs</a> </li> <li> <a href="#6-implementing-access-control">6. Implementing access control</a> </li> <li> <a href="#7-frequent-log-audits">7. Frequent log audits</a> </li> <li> <a href="#8-automating-alerts">8. Automating alerts</a> </li> <li> <a href="#conclusion">Conclusion</a> </li> </ul> </div> </div> </div> <div class='grow shrink-0 prose max-w-[616px]' data-controller='body' data-toc-target='content'> <p>Data breaches have become a pressing concern in our interconnected world, emphasizing the critical need to protect sensitive information. Logs act as significant repositories of sensitive data. When fall into the wrong hands, they can pose substantial security risks. These logs often contain personally identifiable information (PII), financial details, authentication credentials, and other sensitive data. Logging such information without proper safeguards, such as encryption or redaction, opens the door to data breaches, unauthorized access, identity theft, and non-compliance with legal and regulatory requirements.</p><p>This article aims to highlight the utmost importance of keeping sensitive data from logs. We'll explore a range of methods and strategies that can be implemented to safeguard information while ensuring the smooth functioning and integrity of log management systems. By adopting these measures, organizations can enhance their overall security posture and safeguard sensitive data.</p><p><div> <a class='not-prose block my-8 p-9 rounded-lg text-13 bg-logs-ad md:h-[254px] !no-underline' href='/telemetry?utm_content=upsell&utm_medium=guides&utm_source=community&utm_term=sensitive-data'> <p class='inline-block font-bold ad-title-text text-transparent text-app-display-large'> The fastest log <br> search on the planet </p> <p class='mt-2 max-w-[253px] text-[#C9D3EE]'>Better Stack lets you see inside any stack, debug any issue, and resolve any incident.</p> <button class='mt-5 inline-block px-3 py-2 bg-neutral-700 rounded font-medium text-white bg-deprecated-primary-100 border border-deprecated-primary-200 leading-none whitespace-nowrap'> Explore more </button> </a> </div> </p> <h2 id="what-is-sensitive-data">What is sensitive data</h2> <p>Before delving into different methods for excluding sensitive data from logs, let's first discuss what data types should be classified as sensitive. Its definition may vary depending on the context, but here are some common types of data that are generally considered sensitive:</p> <ul> <li><strong>Personally Identifiable Information (PII)</strong>: Information that can bes used to identify an individual, such as full name, social security number, date of birth, address, phone number, email address, or government-issued identification numbers.</li> <li><strong>Financial Information</strong>: Such as bank account numbers, credit card numbers, payment card information, financial statements, and so on.</li> <li><strong>Health and Medical Information</strong>: Information that are protected under healthcare regulations, such as patient records, medical history, health conditions, prescriptions, etc.</li> <li><strong>Authentication Credentials</strong>: Usernames, passwords, security questions/answers, or any other information used for authentication purposes.</li> <li><strong>Confidential Business Data</strong>: Trade secrets, intellectual property, proprietary algorithms, financial forecasts, marketing strategies, or any other sensitive business-related information that could harm the organization if disclosed or compromised.</li> <li><strong>Legal and Compliance Data</strong>: Legal documents, contracts, non-disclosure agreements, court records, or any information that must be protected to comply with legal and regulatory requirements.</li> <li><strong>Personal Communications</strong>: Private messages, emails, or chat logs that contain sensitive or confidential information.</li> <li><strong>Biometric Data</strong>: Fingerprints, facial recognition data, iris scans, or any other unique physical or behavioral characteristics used for identification purposes.</li> </ul> <p>You should note that data sensitivity can vary depending on the specific context of your business or organization, as well as the applicable compliance requirements. While the aforementioned types of data are generally considered sensitive, it is crucial to assess the sensitivity of data based on your unique circumstances.</p><p>You should consider the following factors before logging any data:</p> <ul> <li><p>Business Impact: Reflect on the potential consequences for your business if the logged data were to fall into unauthorized hands. Assess the risks associated with data breaches, including financial losses, reputational damage, or competitive disadvantage.</p></li> <li><p>Customer Impact: Evaluate the potential harm that could be inflicted upon your customers if their sensitive data were compromised. Consider the impact on their privacy, security, and trust in your organization.</p></li> <li><p>Compliance Obligations: Examine the relevant regulations and data compliance requirements that pertain to your industry or geographic location. Determine if logging the specific data in question would breach any legal or regulatory obligations, such as GDPR, CCPA, HIPAA, or others that may apply.</p></li> </ul> <p>Establishing robust data protection measures and adhering to relevant compliance requirements are vital for maintaining the trust of your customers and safeguarding your business. By critically evaluating the aforementioned factors, you can make informed decisions about logging sensitive data while considering the potential risks and ensuring compliance with applicable data protection regulations.</p><p>In the following sections, we will go over some common methods that you can use to avoid logging sensitive data and prevent data leaks. These methods will help you strike a balance between collecting necessary information for troubleshooting and monitoring purposes while protecting sensitive user data.</p> <h2 id="1-exclude-sensitive-data-from-your-code">1. Exclude sensitive data from your code</h2> <p>The most straightforward approach to keep sensitive data out of logs is to avoid logging them in the first place. Make sure to adopt the data minimization principle and only log the necessary information while excluding any sensitive data.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0c4ccd81-dc2c-4e2b-4755-d65303d16c00/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0c4ccd81-dc2c-4e2b-4755-d65303d16c00/md2x 2x" width=500 height=343 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0c4ccd81-dc2c-4e2b-4755-d65303d16c00/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0c4ccd81-dc2c-4e2b-4755-d65303d16c00/lg2x 2x" width=631 height=434 /> <img alt="code-review.excalidraw.png" width="631" height="434" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0c4ccd81-dc2c-4e2b-4755-d65303d16c00/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="code-review.excalidraw.png" width="631" height="434" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0c4ccd81-dc2c-4e2b-4755-d65303d16c00/orig" /> </figure> </div> </p><p>Conducting regular code reviews is crucial in identifying and rectifying potential issues related to logging sensitive data. By paying special attention to logging calls during code review, you can proactively detect and address any unintentional logging of sensitive information.</p><p>You should also make sure that the code has been thoroughly tested before pushing it to production. Through testing, you can verify that sensitive data is not being logged accidentally. In addition, test cases should be designed to explicitly check for the presence of sensitive data in log outputs, helping to prevent data leakage and ensure compliance with data protection regulations.</p><p>There are many ways you may create a test for sensitive data in logs. In general, you can't retrieve the log entry directly, but you can create a software component that saves the previous log entry, and then scans the log entry for sensitive information. Take <a rel="" target="" class="" href="/community/guides/logging/java/logback/">Logback</a> as an example, you can create a custom appender:</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small">TestAppender.java</span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded java' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-java'><code>package com.example; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; public class TestAppender extends ListAppender<ILoggingEvent> { public void reset() { this.list.clear(); } public boolean contains(String string) { return this.list.stream() .anyMatch(event → event.toString().contains(string)); } } </code></pre> </div> </div> <p>This <code class="prettyprint">TestAppender</code> extents to the <code class="prettyprint">ListAppender</code>, which captures log events in memory, and provides a convenient way to access and inspect log events programmatically. The <code class="prettyprint">TestAppender</code> also includes a <code class="prettyprint">contains()</code> method, which checks for the presence of a string in the log record.</p><p>Next, create a new class that generates different log records:</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small">LogGenerator.java</span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded java' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-java'><code>package com.example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogGenerator { private static Logger LOGGER = LoggerFactory.getLogger(LogGenerator.class); public void generateLogs(String msg) { LOGGER.trace(msg); LOGGER.debug(msg); LOGGER.info(msg); LOGGER.warn(msg); LOGGER.error(msg); } } </code></pre> </div> </div> <p>And finally, create the test case:</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small">AppTest.java</span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded java' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-java'><code>package com.example; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; /** * Unit test for simple App. */ public class AppTest { private TestAppender testAppender; private static final String MSG = "Order shipped. Destination: xxxxxxxxxx"; @Before public void setup() { Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); testAppender = new TestAppender(); testAppender.setContext((LoggerContext) LoggerFactory.getILoggerFactory()); logger.setLevel(Level.DEBUG); logger.addAppender(testAppender); testAppender.start(); } @Test public void test() { LogGenerator worker = new LogGenerator(); worker.generateLogs(MSG); assertFalse(testAppender.contains("Destination")); // assertTrue(testAppender.contains("Destination")); } } </code></pre> </div> </div> <p>The <code class="prettyprint">setup()</code> method runs before the tests are created, in order to prepare the logger. The <code class="prettyprint">test()</code> method use the <code class="prettyprint">contains()</code> method to test if the word <code class="prettyprint">Destination</code> is present in the log record. The user's addresses are usually considered sensitive.</p><p>Execute the test with the following command, and it should tell you the test is not successful, since we have the word <code class="prettyprint">Destination</code> in the log.</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded command' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-command'><code>mvn test </code></pre> </div> </div> <div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"><svg alt='' height='20' width='20' class='m-0 -mt-1 inline fill-neutral-200' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/document-text-1d6fae2c063acba111755197aff163c1cdb90458bd11a8f4900ef9a62c23eddf.svg#root' /></svg> Output</span></div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded text' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-text'><code class="!whitespace-pre-wrap">[INFO] Scanning for projects... [INFO] [INFO] ----------------------< com.example:logback-demo >---------------------- [INFO] Building logback-demo 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] . . . [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running com.example.AppTest . . . [ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.139 s <<< FAILURE! - in com.example.AppTest [ERROR] test(com.example.AppTest) Time elapsed: 0.12 s <<< FAILURE! java.lang.AssertionError at com.example.AppTest.test(AppTest.java:36) [INFO] [INFO] Results: [INFO] [ERROR] Failures: [ERROR] AppTest.test:36 [INFO] [ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0 . . . </code></pre> </div> </div> <p>Remove the destination from the test log message and try again, and it should return a success.</p> <h2 id="2-masking-redacting-sensitive-data">2. Masking/Redacting sensitive data</h2> <p>If you must log sensitive data for reference, consider masking or redacting them. Both masking and redacting are methods used to conceal sensitive data in text messages, although they differ in their approach.</p><p>Redacting involves the complete hiding or removal of sensitive information. By redacting data, it is permanently eliminated, preventing unauthorized access and ensuring the utmost protection of sensitive information. On the other hand, masking replaces sensitive data with placeholders while retaining some level of usability or readability for specific purposes or authorized individuals.</p><p>Let's start by talking about log redaction. As we've discussed before, redaction will completely remove sensitive information. For example, the following log entry contains the user password, which should not be included.</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded text' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-text'><code>{"message": "A user just logged in.", "username": "jack", "password": "pswd123"} </code></pre> </div> </div> <p>To prevent the password from leaking, you could redact the information.</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded text' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-text'><code>{"message": "A user just logged in.", "username": "jack", "password": "[REDACTED]"} </code></pre> </div> </div> <p>And now it is safe to log the message.</p><p>Many logging frameworks, such as <a rel="" target="" class="" href="/community/guides/logging/how-to-install-setup-and-use-pino-to-log-node-js-applications/">Pino</a>, offer built-in features that allow you to redact information, while others require a bit more coding. They can be implemented differently based on your specific requirements.</p><p>As an example, when <a rel="" target="" class="" href="/community/guides/logging/how-to-start-logging-with-python/">logging in Python</a>, you could create a custom log filter to redact sensitive data.</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded python' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-python'><code>class RedactFilter(logging.Filter): def __init__(self, keys_to_redact): super().__init__() self.keys_to_redact = keys_to_redact def filter(self, record): if hasattr(record, "msg"): try: log_data = record.msg for key in self.keys_to_redact: if key in log_data: log_data[key] = "REDACTED" record.msg = log_data except json.JSONDecodeError: pass return True </code></pre> </div> </div> <p>Make sure you add this filter to your logger before the log statements:</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded python' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-python'><code>import logging import json from pythonjsonlogger import jsonlogger logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) formatter = jsonlogger.JsonFormatter() stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) <div class='code-highlight top'># Define sensitive keys to redact</div> <div class='code-highlight'>keys_to_redact = ["password"]</div> <div class='code-highlight'></div> <div class='code-highlight'>redact_filter = RedactFilter(keys_to_redact)</div> <div class='code-highlight bottom'>logger.addFilter(redact_filter)</div> log_data = { 'message': 'A user just logged in.', 'email': 'jack@gmail.com', 'password': 'pswd123', } logger.info(log_data) </code></pre> </div> </div> <div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"><svg alt='' height='20' width='20' class='m-0 -mt-1 inline fill-neutral-200' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/document-text-1d6fae2c063acba111755197aff163c1cdb90458bd11a8f4900ef9a62c23eddf.svg#root' /></svg> Output</span></div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded text' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-text'><code class="!whitespace-pre-wrap">{"message": "A user just logged in.", "email": "jack@gmail.com", "password": "REDACTED"} </code></pre> </div> </div> <p>You should note that sensitive information, such as passwords, credit card numbers, and so on, should not be included in the logs and should be removed in the code review process. This example is only for demonstration purposes.</p><p>When selecting a logging framework, it is preferable to opt for frameworks that include built-in log redaction features. In certain cases, you may find third-party packages like <a rel="" target="_blank" class="" href="https://pypi.org/project/logredactor/">logredactor<span class="whitespace-nowrap"><svg class='relative -top-[1px] ml-1 w-4 h-4 inline' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/icons/heroicons_v2/mini/arrow-top-right-on-square-d4a4b2dfe559997065a0de05c441ef56d661be449bf96d9ce30eb4e0af2516cf.svg#root' /></svg></span></a>, which enables log redaction functionality. However, this package is not widely-used, so please exercise caution when implementing it.</p><p>Sometimes, it may be necessary to use data masking techniques instead of complete redaction, allowing for partial concealment of sensitive information. For example, leaving the user's email address in the log is not a safe practice, as it is the user's personal information. Instead, you could mask part of the email and leave only the end for reference.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/520e794b-a8a3-4f55-5d2d-b75745871800/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/520e794b-a8a3-4f55-5d2d-b75745871800/md2x 2x" width=450 height=257 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/520e794b-a8a3-4f55-5d2d-b75745871800/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/520e794b-a8a3-4f55-5d2d-b75745871800/lg2x 2x" width=450 height=257 /> <img alt="log-masking.excalidraw.png" width="450" height="257" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/520e794b-a8a3-4f55-5d2d-b75745871800/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="log-masking.excalidraw.png" width="450" height="257" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/520e794b-a8a3-4f55-5d2d-b75745871800/orig" /> </figure> </div> </p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded python' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-python'><code>class MaskFilter(logging.Filter): def __init__(self, keys_to_mask): super().__init__() self.keys_to_mask = keys_to_mask def filter(self, record): if hasattr(record, "msg"): try: log_data = record.msg for key in self.keys_to_mask: if key in log_data: log_data[key] = mask_value(log_data[key]) record.msg = log_data except json.JSONDecodeError: pass return True def mask_value(value): return re.sub(r"^([^@]+)", "******", str(value)) </code></pre> </div> </div> <p>This example uses regular expression (<code class="prettyprint">^([^@]+)</code>) to match any characters before <code class="prettyprint">@</code>, which will be replaced with <code class="prettyprint">******</code>.</p><p>Add this filter to your logger, and it will give you the following output:</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"><svg alt='' height='20' width='20' class='m-0 -mt-1 inline fill-neutral-200' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/document-text-1d6fae2c063acba111755197aff163c1cdb90458bd11a8f4900ef9a62c23eddf.svg#root' /></svg> Output</span></div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded text' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-text'><code class="!whitespace-pre-wrap">{"message": "A user just logged in.", "email": "******@gmail.com", "password": "REDACTED"} </code></pre> </div> </div> <h2 id="3-tokenize-sensitive-data">3. Tokenize sensitive data</h2> <p>Tokenization is another effective technique for concealing sensitive information in logs. Unlike masking, which removes sensitive data completely, tokenization generates random representations (tokens) of the original data. These tokens are then logged instead of the actual sensitive information. Using tokens, the logs can maintain the necessary context and structure while ensuring the confidentiality of sensitive data. This approach enhances security by allowing you to work with log data without exposing sensitive information.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f1850747-c582-47be-2a86-e9e48ce54300/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f1850747-c582-47be-2a86-e9e48ce54300/md2x 2x" width=500 height=93 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f1850747-c582-47be-2a86-e9e48ce54300/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f1850747-c582-47be-2a86-e9e48ce54300/lg2x 2x" width=650 height=121 /> <img alt="tokenization.excalidraw.png" width="1482" height="278" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f1850747-c582-47be-2a86-e9e48ce54300/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="tokenization.excalidraw.png" width="1482" height="278" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f1850747-c582-47be-2a86-e9e48ce54300/orig" /> </figure> </div> </p><p>There are many ways you could implement tokenization. For instance, you can create a helper method to generate a random token:</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded javascript' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-javascript'><code>function generateToken() { const tokenLength = 10; const characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; let token = ""; for (let i = 0; i < tokenLength; i++) { const randomIndex = Math.floor(Math.random() * characters.length); token += characters.charAt(randomIndex); } return token; } </code></pre> </div> </div> <p>This example generates a random fixed-length token. You need to replace the raw data with this token before the information is logged. The exact method of implementation depends on the logging framework you are using. Take Pino, a popular JSON logger for Node.js, as an example. You could create a custom serializer to process the message before it is logged.</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded javascript' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-javascript'><code>const logger = pino({ serializers: { logData: (data) => { const tokenizedData = { ...data }; const fieldsToTokenize = ["credit_card"]; // Specify what fields to tokenize for (const field of fieldsToTokenize) { if (data[field]) { tokenizedData[field] = generateToken(); // Replace field value with a token saveToken(token, data[field]); // Save the token/data pair in a data vault } } return tokenizedData; }, }, }); function generateToken() { . . . } function saveToken(token, data) { . . . } </code></pre> </div> </div> <p>When logging with this logger, the <code class="prettyprint">credit_card</code> field will be replaced with a token.</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded javascript' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-javascript'><code>const logData = { message: "A payment has been made.", credit_card: "1234-5678-9876-5432", }; logger.info({ logData }); </code></pre> </div> </div> <div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"><svg alt='' height='20' width='20' class='m-0 -mt-1 inline fill-neutral-200' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/document-text-1d6fae2c063acba111755197aff163c1cdb90458bd11a8f4900ef9a62c23eddf.svg#root' /></svg> Output</span></div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded text' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-text'><code class="!whitespace-pre-wrap">{"level":30,"time":1685725299857,"pid":58486,"hostname":"Erics-MacBook-Pro.local","logData":{"message":"A payment has been made.","credit_card":"fHdCE6poQH"}} </code></pre> </div> </div> <p>It is essential to understand that the provided solution is not the sole approach, and the implementation can vary based on the specific needs of your application. For instance, you can develop a middleware associated with the logger or a helper method that handles the tokenization of sensitive data before logging it. The critical aspect is ensuring that the sensitive information is appropriately tokenized before being logged, regardless of the chosen implementation approach. Ultimately, the focus should be on achieving the desired outcome of safeguarding sensitive data within the logging process.</p><p>The tokenization technique is usually accompanied by the isolation of the sensitive data, meaning instead of including sensitive data in the log messages themselves, you can store such data separately and reference it using tokens in the log messages.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/122625fe-001f-4a01-9ec1-9db0704f7b00/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/122625fe-001f-4a01-9ec1-9db0704f7b00/md2x 2x" width=500 height=238 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/122625fe-001f-4a01-9ec1-9db0704f7b00/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/122625fe-001f-4a01-9ec1-9db0704f7b00/lg2x 2x" width=650 height=310 /> <img alt="isolating-data.excalidraw.png" width="1283" height="613" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/122625fe-001f-4a01-9ec1-9db0704f7b00/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="isolating-data.excalidraw.png" width="1283" height="613" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/122625fe-001f-4a01-9ec1-9db0704f7b00/orig" /> </figure> </div> </p><p>Notice that in the previous example, a <code class="prettyprint">saveToken()</code> function is created to save the token/data pair into a data vault. The exact implementation of this function depends on the technology you are using, but the idea is to create a secure data vault where sensitive information is stored, and then generate a random but unique token to reference each piece of sensitive information. You must ensure that appropriate access controls and encryption mechanisms are in place to protect the data vault.</p><p>Next, you use tokens to replace the raw data when crafting the log message, as we've discussed. You should also maintain a lookup table that links the token to the original data. And again, you must ensure this lookup table is only accessible to authorized individuals.</p><p>And lastly, when it becomes necessary to access the sensitive data, retrieve it securely from the data vault using the corresponding token. This ensures that sensitive information remains protected while still allowing authorized individuals to access it as required.</p> <h2 id="4-encrypting-data-transmission">4. Encrypting data transmission</h2> <p>Log transmission represents a potential vulnerability for data security. When employing a logging architecture where logs are transferred to a central log management platform, there is a risk of interception during transmission. To minimize this risk, it is crucial to use encrypted transmission.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/ab7c131f-00e7-47f3-fab9-ac4a493c4700/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/ab7c131f-00e7-47f3-fab9-ac4a493c4700/md2x 2x" width=500 height=125 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/ab7c131f-00e7-47f3-fab9-ac4a493c4700/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/ab7c131f-00e7-47f3-fab9-ac4a493c4700/lg2x 2x" width=650 height=163 /> <img alt="encrypting-data-transition.excalidraw.png" width="848" height="213" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/ab7c131f-00e7-47f3-fab9-ac4a493c4700/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="encrypting-data-transition.excalidraw.png" width="848" height="213" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/ab7c131f-00e7-47f3-fab9-ac4a493c4700/orig" /> </figure> </div> </p><p>Encrypting log transmission helps protect the confidentiality and integrity of the data. By implementing encryption protocols, you can ensure that logs are securely transmitted from source to destination. This minimizes the possibility of unauthorized access or tampering during transit. Some common methods to enhance transmission security include:</p> <ul> <li><strong>Utilize TLS/SSL protocols</strong> to establish secure connections between systems. These protocols encrypt the data during transit, ensuring confidentiality and preventing unauthorized access.</li> <li><strong>Implement strong authentication mechanisms</strong> to ensure that only authorized parties can access the encrypted data. Properly manage and safeguard the encryption keys used in the encryption and decryption processes. This includes secure storage, key rotation, and strict access controls to prevent unauthorized key usage.</li> <li><strong>Create data integrity verification mechanisms</strong> to verify the integrity of log data during transmission. Implement techniques such as digital signatures or hash functions to ensure that log files remain intact and unaltered during transfer.</li> </ul> <p>By these safety measures during data transmission, you can ensure the confidentiality and integrity of sensitive information, preventing it from being exposed. It forms a crucial part of a comprehensive data security strategy, complementing other security measures and minimizing the risk of unauthorized access or data breaches.</p><p><div> <a class='not-prose block my-8 p-9 rounded-lg text-13 bg-logs-ad md:h-[254px] !no-underline' href='/telemetry?utm_content=upsell&utm_medium=guides&utm_source=community&utm_term=sensitive-data'> <p class='inline-block font-bold ad-title-text text-transparent text-app-display-large'> The fastest log <br> search on the planet </p> <p class='mt-2 max-w-[253px] text-[#C9D3EE]'>Better Stack lets you see inside any stack, debug any issue, and resolve any incident.</p> <button class='mt-5 inline-block px-3 py-2 bg-neutral-700 rounded font-medium text-white bg-deprecated-primary-100 border border-deprecated-primary-200 leading-none whitespace-nowrap'> Explore more </button> </a> </div> </p> <h2 id="5-keeping-sensitive-data-out-of-urls">5. Keeping sensitive data out of URLs</h2> <p>When considering data security, URLs is easily overlooked, yet they can pose a risk in data leaks. It is common practice for web applications to log URLs during request handling, potentially including sensitive information. For example, if the URL has the pattern:</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded text' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-text'><code>http://www.example.com/<id>/<address> </code></pre> </div> </div> <p>When logging this URL, you will risk exposing the user's address. To minimize the risk, you could employ one of the masking, redacting, or tokenizing techniques we discussed previously to process this URL before logging it.</p><p>In addition, another effective approach is to leverage the <code class="prettyprint">POST</code> method instead of <code class="prettyprint">GET</code> for transmitting sensitive information. Unlike the <code class="prettyprint">GET</code> method, which appends the data to the URL, the <code class="prettyprint">POST</code> method allows you to send the data within the body of the request. This enables you to apply additional security measures such as encrypting the data using the HTTPS protocol. By using the <code class="prettyprint">POST</code> method, you can minimize the likelihood of sensitive information being logged by various software components, as the data remains encapsulated within the request body and is not exposed in the URL.</p> <h2 id="6-implementing-access-control">6. Implementing access control</h2> <p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/abddc1a9-5686-42f5-bfd0-a4fc3cb94a00/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/abddc1a9-5686-42f5-bfd0-a4fc3cb94a00/md2x 2x" width=500 height=301 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/abddc1a9-5686-42f5-bfd0-a4fc3cb94a00/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/abddc1a9-5686-42f5-bfd0-a4fc3cb94a00/lg2x 2x" width=650 height=392 /> <img alt="access-control.excalidraw.png" width="696" height="420" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/abddc1a9-5686-42f5-bfd0-a4fc3cb94a00/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="access-control.excalidraw.png" width="696" height="420" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/abddc1a9-5686-42f5-bfd0-a4fc3cb94a00/orig" /> </figure> </div> </p><p>Implementing robust access control measures is crucial for restricting access to sensitive information in logs. One practical approach is establishing a role-based access control system, assigning roles and permissions to users based on their responsibilities. Additionally, it is essential to enforce strong password policies and consider implementing multi-factor authentication to enhance the security of user accounts.</p><p>You could store all sensitive data in a dedicated data storage that incorporates robust access control mechanisms. This ensures that only administrators or authorized users with proper credentials can access the sensitive information, while unauthorized individuals are denied access. Additionally, implementing an alerting system is crucial to promptly identify and respond to any unauthorized login attempts, such as those involving incorrect passwords or unrecognized accounts.</p><p>By implementing these access control measures and prioritizing the security of your infrastructure, you can effectively restrict access to sensitive information, strengthen user authentication and safeguard the confidentiality and integrity of your logs.</p> <h2 id="7-frequent-log-audits">7. Frequent log audits</h2> <p>Ensuring regular review and auditing of logs is essential to identify and eliminate any accidental or unintended logging of sensitive data. This practice helps maintain compliance with privacy regulations and ensures the integrity of logs by keeping them free from sensitive information.</p><p>As the volume of logs generated by enterprise-level applications can be overwhelming, manual review of each log entry becomes impractical. In such scenarios, employing a log management tool such as <a rel="" target="" class="" href="https://betterstack.com/logs">Better Stack</a> is highly recommended.</p><p>Better Stack is a cloud-based platform designed to simplify log management processes. It offers features like easy search, filtering, and log data analysis, enabling efficient navigation through logs, rapid retrieval of relevant information, and setting alerts and notifications for critical events. By leveraging a log management tool, you can effectively handle large log volumes, streamline log analysis, and proactively monitor your application's logs.</p><p>By incorporating regular log reviews and utilizing a robust log management tool, you can ensure compliance, maintain the integrity of logs, and efficiently manage log data to align with best practices and industry standards.</p> <h2 id="8-automating-alerts">8. Automating alerts</h2> <p>To enhance sensitive data detection and alerting, you can implement an automated alerting service that scans existing logs for any instances of sensitive information. This service will notify your team whenever sensitive data is detected, complementing the log auditing process we discussed earlier. However, it is important to note that this method should not completely replace log audits.</p><p>The common information that should be included in the alert include timestamp, name of the host, line number, user information, and so on. By incorporating automated alerts with these crucial details, you can proactively identify and address any instances of sensitive data appearing in logs, facilitating quick response and remediation to mitigate potential risks. It complements the log audits by providing real-time notifications for immediate action.</p><p>Setting up such a system manually might be too much trouble, and instead, you could rely on a log management platform such as <a rel="" target="" class="" href="https://betterstack.com/logs">Better Stack</a>, which allows you to centralize all of your logs in the cloud for easier processing, analyzing, monitoring and alerting. It will significantly simplify log management, enhance operational efficiency, and ensure seamless log handling across your entire infrastructure.</p><p>To set up an alert for sensitive data on Better Stack, simply go to the <strong>Live tail</strong> tab and type in a search query. For example:</p><div class='relative mb-5 bg-neutral-40 border border-neutral-50 rounded-md text-[15px] shadow' data-controller='clipboard'> <div class='px-4 py-[6px] bg-white flex items-center rounded-t-md'> <div class='text-[15px] font-medium inline align-middle grow'><span class="text-app-small"> </span></div> <div class="copy-button hidden sm:flex sm:items-center" data-clipboard-target='confirmation'> <button class='text-sm p-1' data-action='click->clipboard#copy'> <svg alt='copy code to clipboard' height='18' width='18' class='m-0' style='--currentColor: currentColor;'><use href='https://betterstack.com/assets/articles/clipboard-d6c07cf2face9fc42a34bcb0088c7164f06f39c14281e7e510185191e9a8188a.svg#root' /></svg> </button> <span class='copy-confirmation text-sm p-0'>Copied!</span> </div> </div> <div class='code-wrapper overflow-x-auto p-2 rounded text' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-text'><code>message.email!=null AND message.email!:"******" OR message.password!=null message.password!=REDACTED </code></pre> </div> </div> <p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f722fa87-e65a-45df-fe42-06dc69029600/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f722fa87-e65a-45df-fe42-06dc69029600/md2x 2x" width=500 height=339 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f722fa87-e65a-45df-fe42-06dc69029600/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f722fa87-e65a-45df-fe42-06dc69029600/lg2x 2x" width=650 height=441 /> <img alt="search-query.png" width="2728" height="1852" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f722fa87-e65a-45df-fe42-06dc69029600/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="search-query.png" width="2728" height="1852" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f722fa87-e65a-45df-fe42-06dc69029600/orig" /> </figure> </div> </p><p>This example query looks for logs that matches the following criteria:</p> <ul> <li>Logs that have a <code class="prettyprint">email</code> field (<code class="prettyprint">message.email!=null</code>) AND the email has not been masked (<code class="prettyprint">message.email!:"******"</code> means the email does NOT contain the characters <code class="prettyprint">******</code>).</li> <li>OR logs that have a password field (<code class="prettyprint">message.password!=null</code>) AND the password has NOT been redacted (<code class="prettyprint">password!=REDACTED</code>).</li> </ul> <p>This search query should include all logs that contain sensitive data. Save this search view by clicking <strong>Save as a view</strong>.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0e855f86-bd42-4139-3b73-e8c067da6e00/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0e855f86-bd42-4139-3b73-e8c067da6e00/md2x 2x" width=500 height=339 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0e855f86-bd42-4139-3b73-e8c067da6e00/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0e855f86-bd42-4139-3b73-e8c067da6e00/lg2x 2x" width=650 height=441 /> <img alt="save-view.png" width="2728" height="1852" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0e855f86-bd42-4139-3b73-e8c067da6e00/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="save-view.png" width="2728" height="1852" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/0e855f86-bd42-4139-3b73-e8c067da6e00/orig" /> </figure> </div> </p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/988918d1-f927-4c33-9605-a565208b3700/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/988918d1-f927-4c33-9605-a565208b3700/md2x 2x" width=500 height=55 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/988918d1-f927-4c33-9605-a565208b3700/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/988918d1-f927-4c33-9605-a565208b3700/lg2x 2x" width=650 height=72 /> <img alt="save-as-view.png" width="1930" height="216" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/988918d1-f927-4c33-9605-a565208b3700/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="save-as-view.png" width="1930" height="216" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/988918d1-f927-4c33-9605-a565208b3700/orig" /> </figure> </div> </p><p>Then go to <strong>Alerts</strong>, and create a new alert.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/08338182-2ddb-407e-db85-cad17d0a5d00/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/08338182-2ddb-407e-db85-cad17d0a5d00/md2x 2x" width=500 height=339 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/08338182-2ddb-407e-db85-cad17d0a5d00/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/08338182-2ddb-407e-db85-cad17d0a5d00/lg2x 2x" width=650 height=441 /> <img alt="new-alert.png" width="2728" height="1852" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/08338182-2ddb-407e-db85-cad17d0a5d00/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="new-alert.png" width="2728" height="1852" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/08338182-2ddb-407e-db85-cad17d0a5d00/orig" /> </figure> </div> </p><p>For the <strong>When should we trigger the alert?</strong> section, you need to select the view we just created, and then select the filter based on your own need. To be absolutely save, it is best to choose to be alerted when there is <strong>more than 0 lines of log entry within 30 seconds</strong>.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/b5d31dac-1bab-4d12-63c4-bc182f7a6700/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/b5d31dac-1bab-4d12-63c4-bc182f7a6700/md2x 2x" width=500 height=287 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/b5d31dac-1bab-4d12-63c4-bc182f7a6700/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/b5d31dac-1bab-4d12-63c4-bc182f7a6700/lg2x 2x" width=650 height=374 /> <img alt="alert-trigger.png" width="1976" height="1138" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/b5d31dac-1bab-4d12-63c4-bc182f7a6700/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="alert-trigger.png" width="1976" height="1138" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/b5d31dac-1bab-4d12-63c4-bc182f7a6700/orig" /> </figure> </div> </p><p>Also choose who should be alerted, and save the alert.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/fe1ae198-bff6-4c7b-8481-f20d3935eb00/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/fe1ae198-bff6-4c7b-8481-f20d3935eb00/md2x 2x" width=500 height=83 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/fe1ae198-bff6-4c7b-8481-f20d3935eb00/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/fe1ae198-bff6-4c7b-8481-f20d3935eb00/lg2x 2x" width=650 height=108 /> <img alt="alert-member.png" width="1984" height="332" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/fe1ae198-bff6-4c7b-8481-f20d3935eb00/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="alert-member.png" width="1984" height="332" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/fe1ae198-bff6-4c7b-8481-f20d3935eb00/orig" /> </figure> </div> </p><p>If sensitive data has been leaked into your logs, the team member you choose will receive the alert.</p><p><div data-controller='lightbox' class='relative cursor-pointer'> <figure data-action='click->lightbox#open' data-lightbox-target='picture'> <picture> <source media="(max-width: 800px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/82127c64-ad50-425e-cdd5-2866740da700/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/82127c64-ad50-425e-cdd5-2866740da700/md2x 2x" width=500 height=289 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/82127c64-ad50-425e-cdd5-2866740da700/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/82127c64-ad50-425e-cdd5-2866740da700/lg2x 2x" width=650 height=376 /> <img alt="email-alert.png" width="2762" height="1600" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/82127c64-ad50-425e-cdd5-2866740da700/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="email-alert.png" width="2762" height="1600" loading="lazy" data-action="click->lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/82127c64-ad50-425e-cdd5-2866740da700/orig" /> </figure> </div> </p> <h2 id="conclusion">Conclusion</h2> <p>In conclusion, safeguarding sensitive data and maintaining data security is crucial in today's digital landscape. Throughout this article, we have explored several effective methods to keep sensitive data out of logs. By excluding sensitive data from code, employing masking or redaction techniques, tokenizing data, isolating sensitive information, encrypting data transitions, and implementing access control measures, organizations can minimize the risk of unauthorized access or exposure of sensitive data in logs.</p><p>Regular log audits and automated alerting systems further enhance the security posture by ensuring compliance, detecting potential data breaches, and enabling timely remediation. By adopting these practices, organizations can strengthen their data protection efforts and maintain confidentiality, integrity, and privacy of sensitive information.</p><p>To deepen your understanding of logging practices, we recommend exploring:</p> <ul> <li>A comprehensive guide on <a rel="" target="" class="" href="/community/guides/logging/change-log-levels-dynamically/">dynamic log level modification during runtime</a>,</li> <li><a rel="" target="" class="" href="/community/guides/logging/logging-framework/">Selecting an optimal logging framework</a>, </li> <li><a rel="" target="" class="" href="/community/guides/logging/log-management/">Log management practices</a>, </li> <li><a rel="" target="" class="" href="/community/guides/logging/logging-best-practices/">The dos and don'ts of logging</a>. </li> </ul> <p>These resources will provide valuable insights and strategies for creating the most appropriate logging solution for your specific requirements.</p> <div class='docsearch-ignore'> <a class='block w-0 h-0' id='author-card'></a> <div class='border border-neutral-50 shadow-lg rounded-xl text-base text-neutral-600 flex flex-col px-9 py-6 gap-6 mt-12'> <div class='flex flex-wrap gap-3'> <div><img width="64" height="64" alt="Author's avatar" class="!rounded-none m-0 lazyload" data-src="/assets/articles/authors/eric-hu-04ec93764eb70e80ec37b0a503ced1e6f397002926f8d48c3dc86999b701c286.png" src="" /></div> <div class='flex flex-col justify-end mb-1'> <div class='text-neutral-400'>Article by</div> <div class='text-neutral-800 font-bold text-xl'>Eric Hu</div> </div> <div class='flex grow justify-end items-end content-end gap-3 mb-1'> <a class='p-1 hover:bg-neutral-50 rounded' href='https://github.com/ericnanhu' rel='nofollow noopener noreferrer' target='_blank'> <svg width='16' height='16' alt='GitHub' class='!rounded-none m-0' style='--currentColor: currentColor;'><use href='/assets/articles/icons/github-0ecf36200de79e46cda890ce5e4de0b0be5ed51709bb31889155b809212d2f40.svg#root' /></svg> </a> <a class='p-1 hover:bg-neutral-50 rounded' href='https://www.ericsdevblog.com/' rel='nofollow noopener noreferrer' target='_blank'> <svg width='16' height='16' alt='Website' class='!rounded-none m-0' style='--currentColor: currentColor;'><use href='/assets/articles/icons/globe-923884e022b647ad49be9bbd2380e513173787bc8c280e3fa9876b2ba3fdb8a8.svg#root' /></svg> </a> <a class='p-1 hover:bg-neutral-50 rounded' href='https://twitter.com/ericnanhu' rel='nofollow noopener noreferrer' target='_blank'> <svg width='16' height='16' alt='Twitter' class='!rounded-none m-0' style='--currentColor: currentColor;'><use href='/assets/articles/icons/twitter-0a71c82dff1d94a2c2cec482547d6393d7341e4f4be980ed508136a75b3d1527.svg#root' /></svg> </a> </div> </div> <div class='text-neutral-400 whitespace-pre-wrap'>Eric is a technical writer with a passion for writing and coding, mainly in Python and PHP. He loves transforming complex technical concepts into accessible content, solidifying understanding while sharing his own perspective. He wishes his content can be of assistance to as many people as possible.</div> </div> <iframe class='mt-16 rounded-xl' frameborder='0' height='320' scrolling='no' src='https://betterstack.substack.com/embed' style='border:1px solid #EEE; background:white;' width='100%'></iframe> <div class='mt-11 text-center'> <div class='text-neutral-300 mt-6'> Got an article suggestion? <a class="!underline !text-neutral-300" href="mailto:hello@betterstack.com?subject=Suggestion%20for%20Best%20Logging%20Practices%20for%20Safeguarding%20Sensitive%20Data&body=">Let us know</a> </div> <div class='flex justify-center items-center space-x-3 mt-4'> <a href='https://twitter.com/share?ref_src=twsrc%5Etfw&url=https://betterstack.com/community/guides/logging/sensitive-data/&text=Best+Logging+Practices+for+Safeguarding+Sensitive+Data+%7C+Better+Stack+Community&via=betterstackhq' rel='nofollow noopener' target='_blank'> <svg width='16' height='16' alt='Share on Twitter' class='!rounded-none m-0' style='--currentColor: currentColor;'><use href='/assets/articles/icons/twitter-0a71c82dff1d94a2c2cec482547d6393d7341e4f4be980ed508136a75b3d1527.svg#root' /></svg> </a> <a href='https://www.facebook.com/sharer/sharer.php?u=https://betterstack.com/community/guides/logging/sensitive-data/' rel='nofollow noopener' target='_blank'> <svg width='16' height='16' alt='Share on Facebook' class='!rounded-none m-0' style='--currentColor: currentColor;'><use href='/assets/articles/icons/facebook-6ffe06602047bc3abd84874b8b66c4f962ff5e90b8974b83782cbc1c37b32c44.svg#root' /></svg> </a> <a href='mailto:?subject=Best%20Logging%20Practices%20for%20Safeguarding%20Sensitive%20Data&body=https%3A%2F%2Fbetterstack.com%2Fcommunity%2Fguides%2Flogging%2Fsensitive-data%2F'> <svg width='16' height='16' alt='Share via e-mail' class='!rounded-none m-0' style='--currentColor: currentColor;'><use href='/assets/articles/icons/mail-023765f22acbe30ad587791edbf15dc0ac019d9617046176376561282b997023.svg#root' /></svg> </a> </div> </div> <div class='mt-20 text-center heading-h5'>Next article</div> <a class='mt-5 bg-neutral-40 rounded-lg flex hover:!no-underline' href='/community/guides/logging/log-sampling/'> <div class='p-5 grow'> <div class='text-xl font-bold text-neutral-800'>How to Reduce Logging Costs with Log Sampling</div> <div class='mt-2 text-neutral-300'>Redundant logs in large systems inflate data costs. Log sampling efficiently reduces this by randomly selecting logs, maintaining insights with less data.</div> </div> <div class='p-5 flex items-center'>→</div> </a> <div class='mt-24 flex flex-col items-center'> <a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' rel='nofollow noopener' target='_blank'> <img alt="Licensed under CC-BY-NC-SA" class="m-0 lazyload" width="89" height="31" data-src="/assets/articles/cc-by-nc-sa-1fa5a2f7978211f24b8230a7e79097dd1f8a36be35e813693c49348cf1689f42.png" src="" /> </a> <p class='mt-5 text-center text-neutral-300 max-w-[365px]'>This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.</p> </div> </div> </div> </div> <div class='hidden lg:block ml-12 xl:-mr-8 shrink-0 w-[205px]'> <ol class='-mt-2 mb-7 text-base overflow-y-auto pb-24'> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Explainers</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/log-management/'>What is Log Management?</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/log-aggregation/'>What is Log Aggregation?</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/log-visualization/'>What is Log Visualization?</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/log-monitoring/'>What is Log Monitoring?</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/logging-framework/'>How to Choose a Logging Framework</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/logfmt/'>Introduction to Logfmt</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/json-logging/'>Introduction to JSON Logging</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/structured-logging/'>What is Structured Logging?</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/log-levels-explained/'>Understanding Log Levels</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/change-log-levels-dynamically/'>Changing Log Levels Dynamically</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/logging-microservices/'>Logging in Microservices</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 text-neutral-800 open py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Best Practices</a> </div> <ol class='mb-4' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/logging-best-practices/'>12 Logging Best Practices</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/log-formatting/'>Log Formatting Best Practices</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a aria-current='page' class='grow py-2 text-deprecated-primary-700' href='/community/guides/logging/sensitive-data/'>Keeping Sensitive Data From Logs</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/log-sampling/'>Log Sampling Explained</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/reduce-logging-costs/'>Reducing Logging Costs</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Linux</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-view-and-configure-linux-logs-on-ubuntu-20-04/'>Administering System Logs on Linux</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-manage-log-files-with-logrotate-on-ubuntu-20-04/'>Rotating Logs with Logrotate</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-control-journald-with-journalctl/'>Journalctl Log Management</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-view-and-configure-apache-access-and-error-logs/'>Logging in Apache</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-view-and-configure-nginx-access-and-error-logs/'>Nginx Logging</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/monitoring-linux-auth-logs/'>Monitoring Linux Authentication Logs</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/caddy-logging/'>Logging in Caddy</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Node.js</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-install-setup-and-use-pino-to-log-node-js-applications/'>Logging with Pino</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-install-setup-and-use-winston-and-morgan-to-log-node-js-applications/'>Logging with Winston</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/nodejs-logging-best-practices/'>Node.js Logging Best Practices</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/best-nodejs-logging-libraries/'>8 Best Node.js Logging Libraries</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/morgan-logging-nodejs/'>Morgan Logging in Node.js</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Python</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-python/'>Logging in Python</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/loguru/'>Logging with Loguru</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/structlog/'>Logging with Structlog</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-django/'>Logging in Django</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-flask/'>Logging in Flask</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/python/python-logging-best-practices/'>Python Logging Best Practices</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/best-python-logging-libraries/'>Best Python Logging Libraries</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Go</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/logging-in-go/'>Logging in Go (Slog)</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/golang-contextual-logging/'>Contextual Logging in Go</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/zerolog/'>Logging with Zerolog</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/go/zap/'>Logging with Zap</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/best-golang-logging-libraries/'>9 Best Go Logging Libraries</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Ruby</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-view-and-configure-ruby-logs/'>Logging in Ruby</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-ruby-on-rails/'>Logging in Ruby on Rails</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/best-ruby-logging-libraries/'>Best Ruby Logging Libraries</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/semantic-logger/'>Semantic Logger</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>.NET</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-net/'>Logging in .NET</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-serilog/'>Logging with Serilog</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-nlog/'>Logging with NLog</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-log4net/'>Logging with Log4net</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/best-dotnet-logging-libraries/'>Best .NET Logging Libraries</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Java</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-java/'>Java Logging Best Practices</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-log4j/'>Logging with Log4j</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/java/logback/'>Logging with Logback</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/best-java-logging-libraries/'>Best Java Logging Libraries</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>PHP</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-php/'>Logging in PHP</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-monolog/'>Logging with Monolog</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-laravel/'>Logging in Laravel</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-log4php/'>Logging with Log4php</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/best-php-logging-libraries/'>Best PHP Logging Libraries</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/php-logging-opentelemetry/'>PHP Logging with OpenTelemetry</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Database</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-mysql/'>Logging in MySQL</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-postgresql/'>Logging in PostgreSQL</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-mariadb/'>Logging in MariaDB</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-redis/'>Logging in Redis</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/database/how-to-start-logging-with-mongodb/'>Logging in MongoDB</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Docker</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-docker/'>Logging in Docker</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/docker-logs/'>Docker Container Logs</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/docker-compose-logs/'>Docker Compose Logs</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Platforms</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-heroku/'>Logging in Heroku</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/platforms/vercel-logging/'>Logging in Vercel</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/gcp-logging/'>Logging in GCP</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/azure-logging/'>Logging in Azure</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Platforms: AWS</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/aws-logging/'>Logging in AWS</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/aws-lambda-logging/'>AWS Lambda Logging</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/aws-cloudtrail-logging/'>AWS CloudTrail Logs</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Log Shippers</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/vector-explained/'>Vector</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/fluentd-explained/'>Fluentd</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/fluent-bit-explained/'>Fluent Bit</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/logstash-explained/'>Logstash</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/filebeat-explained/'>Filebeat</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/rsyslog-explained/'>Rsyslog</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-configure-centralised-rsyslog-server/'>Logging with Rsyslog</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/logging/filebeat-vs-logstash/'>Filebeat vs Logstash</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/logging/fluentd-vs-fluent-bit/'>Fluentd vs Fluent Bit</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/log-shippers-explained/'>The Top 7 Log Shippers Explained</a> </div> </li> </ol> </li> <li class='text-neutral-300' data-controller='collapse'> <div class='flex space-x-2 py-1 side-menu-item cursor-pointer font-bold border-b border-neutral-50' data-action='click->collapse#toggle'> <a class='grow py-2' href=''>Other</a> </div> <ol class='mb-4 hidden' data-collapse-target='content'> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-start-logging-with-postfix/'>Logging with Postfix</a> </div> </li> <li class='text-neutral-300'> <div class='flex space-x-2'> <a class='grow py-2' href='/community/guides/logging/how-to-view-and-analyze-logs-with-windows-event-viewer/'>Logging in Windows</a> </div> </li> </ol> </li> </ol> </div> </div> </div> <div class='mt-20 pt-10 text-neutral-200 bg-[#0B0C14]'> <section class='pt-16 md:pt-20 px-5 md:px-10 pb-16 md:pb-32 bg-[#0B0C14]'> <div class='container mx-auto max-w-[950px]'> <h4 class='sm:ml-10 text-white font-bold whitespace-nowrap text-[36px]'>Make your mark</h4> <div class='mt-12 flex flex-col md:flex-row gap-5'> <div class='flex-1 rounded-xl border border-[#727DA1]/20 bg-[#171824]/80'> <div class='p-8 h-full flex flex-col justify-between'> <div class='grow'> <h5 class='md:mx-3 text-white font-bold text-[20px] leading-[130%]'>Join the writer's program</h5> <p class='mt-3 md:mx-3'> Are you a developer and love writing and sharing your knowledge with the world? Join our guest writing program and get paid for writing amazing technical guides. We'll get them to the right readers that will appreciate them. </p> <a class='block mt-3 md:mx-3 text-[#7C87F7]' href='https://betterstack.com/community/write-for-us'> Write for us <svg class=' w-4 h-4 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/mini/chevron-right-ee58bdc22e1fb683dd9ffd95ba0c4df56d8a2a0904d7ddbe63b6e2b4ab82f090.svg#root'></svg> </a> </div> <div> <div class='mt-10 md:mx-3'>Writer of the month</div> <div class='relative mt-5 px-3 py-4 rounded-xl flex items-start gap-3 bg-[#7C87F7] ring-[6px] ring-[#7C87F7]/10'> <img alt="" width="40" height="40" class="shrink-0 mt-1 lazyload" data-src="/assets/articles/authors/marin-0d19fe482115fe2b15c8429a7ee4eb88d803984eaa7c1d8c7309241049f3d402.png" src="" /> <div class='text-white'> <div class='font-bold'>Marin Bezhanov</div> <div class='mt-1 text-ellipsis text-base line-clamp-2'>Marin is a software engineer and architect with a broad range of experience working...</div> </div> <div class='absolute top-[10px] right-[10px]'> <svg class=' text-white w-5 h-5 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/sparkles-a7c4acf0bcb9f170420cb9484c35a2db6d1ed4ef2796d19929b9d9b792002eb4.svg#root'></svg> </div> </div> </div> </div> </div> <div class='flex-1'> <div class='rounded-xl border border-[#727DA1]/20'> <div class='p-10 bg-github-community rounded-t-xl bg-[#171824]/80'> <h5 class='md:mx-3 text-white font-bold text-[20px] leading-[130%]'>Build on top of Better Stack</h5> <p class='mt-3 md:mx-3'> Write a script, app or project on top of Better Stack and share it with the world. Make a public repository and share it with us at our email. </p> <a class='block mt-3 md:mx-3 whitespace-nowrap text-[#7C87F7]' href='mailto:community@betterstack.com?subject=Better%20Stack%20community%20project&body='> <svg size='w-[18px] h-[18px]' class='hidden sm:inline w-[18px] h-[18px] inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/envelope-11bb634875b80bcbea772441a6edd1fc99b92bfea2a5bbd20b1976622bb05e90.svg#root'></svg> community@betterstack.com </a> </div> <div class='px-6 py-4 border-t text-13 border-[#727DA1]/20'> <p class='max-w-[320px]'>or submit a pull request and help us build better products for everyone.</p> </div> </div> <a class='relative mt-5 p-12 rounded-xl border text-neutral-200 flex flex-col items-center border-[#727DA1]/20' href='https://github.com/betterstack-community/projects' target='_blank'> <svg alt='' width='20' height='20' class='block' style='--currentColor: currentColor;'><use href='/assets/v2/github-e74d48ed6bd519eddfaac1a76a313eed359b3ab311dccab980003682a3d3a05e.svg#root'></svg> <p class='mt-2 text-13 text-center max-w-[180px]'>See the full list of amazing projects on github</p> <div class='absolute top-4 right-4'> <svg size='w-4 h-4' class=' w-4 h-4 inline' style='--currentColor: currentColor;'><use href='/assets/icons/heroicons_v2/solid/arrow-up-right-8a7bd4b24ec9b699f4169848a75b04c0ced5cd1a7016c513456e14b68c71381f.svg#root'></svg> </div> </a> </div> </div> </div> </section> </div> </main> </div> <div class='dark'> <nav class='bg-white text-base border-t dark:bg-[#0B0C14] border-neutral-300/10 text-[#363D4E] dark:text-neutral-200'> <div class='mx-auto px-5 md:px-10 pt-8 lg:pt-14 pb-10 md:pb-20 md:flex max-w-[1110px]'> <div class='flex-2 lg:grow flex gap-5'> <div class='flex-1 lg:flex-2 flex flex-col lg:flex-row'> <div class='lg:mr-16 flex-1'> <div class='mb-16 hidden md:block'> <div class='font-medium text-black dark:text-white'>Platform</div> <a class="inline-block -mx-1 px-1 mt-3" href="/enterprise">Enterprise</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/uptime">Uptime</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/telemetry">Telemetry</a> </div> <div class='mb-16'> <div class='font-medium text-black dark:text-white'>Solutions</div> <a class="inline-block -mx-1 px-1 mt-3" href="/telemetry">Log management</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/infrastructure-monitoring">Infrastructure monitoring</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/uptime">Uptime monitoring</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/website-monitoring">Website monitoring</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/incident-management">Incident management</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/status-page">Status page</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/incident-silencing">Incident silencing</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/slack-incident-management">Slack-based incident management</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/dashboards">Dashboards</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="/integrations">Integrations</a> </div> </div> <div class='flex-1'> <div class='mb-16 hidden lg:block'> <div class='font-medium text-black dark:text-white'>Resources</div> <a class="inline-block -mx-1 px-1 mt-3 whitespace-nowrap" href="/help">Help & Support</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/docs/uptime">Uptime docs</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/docs/logs">Logs docs</a> </div> <div class='mb-16 lg:hidden'> <div class='font-medium text-black dark:text-white'>Company</div> <a class="inline-block -mx-1 px-1 mt-3" href="/careers">Work at Better Stack</a> <br class='lg:hidden'> <a class="inline-block -mx-1 px-1 mt-3" href="/careers/engineering">Engineering</a> <br class='lg:hidden'> <a class="inline-block -mx-1 px-1 mt-3" href="/security">Security</a> </div> <div class='mb-16'> <div class='font-medium text-black dark:text-white'>Community</div> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/community/guides">Guides</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/community/questions">Questions</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/community/comparisons">Comparisons</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/community/blog">Blog</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/community/write-for-us">Write for us</a> </div> </div> </div> <div class='lg:ml-12 flex-1 flex flex-col'> <div class='mb-16 hidden lg:flex flex-col items-start'> <div class='font-medium text-black dark:text-white'>Company</div> <a class="inline-block -mx-1 px-1 mt-3" href="/careers">Work at Better Stack</a> <br class='lg:hidden'> <a class="inline-block -mx-1 px-1 mt-3" href="/careers/engineering">Engineering</a> <br class='lg:hidden'> <a class="inline-block -mx-1 px-1 mt-3" href="/security">Security</a> </div> <div class='mb-16 lg:hidden'> <div class='font-medium text-black dark:text-white'>Resources</div> <a class="inline-block -mx-1 px-1 mt-3 whitespace-nowrap" href="/help">Help & Support</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/docs/uptime">Uptime docs</a> <br> <a class="inline-block -mx-1 px-1 mt-3" href="https://betterstack.com/docs/logs">Logs docs</a> </div> <div class='flex flex-col items-start'> <div class='font-medium text-black dark:text-white'>Compare</div> <a class="inline-block -mx-1 px-1 mt-3" href="/pingdom-alternative">Pingdom</a> <a class="inline-block -mx-1 px-1 mt-3" href="/pagerduty-alternative">Pagerduty</a> <a class="inline-block -mx-1 px-1 mt-3" href="/statuspage-io-alternative">StatusPage.io</a> <a class="inline-block -mx-1 px-1 mt-3" href="/uptime-robot-alternative">Uptime Robot</a> <a class="inline-block -mx-1 px-1 mt-3" href="/statuscake-alternative">StatusCake</a> <a class="inline-block -mx-1 px-1 mt-3" href="/opsgenie-alternative">Opsgenie</a> <a class="inline-block -mx-1 px-1 mt-3" href="/victorops-alternative">VictorOps</a> </div> </div> </div> <div class='md:ml-12 flex-1 flex flex-col items-start grow max-w-[450px]'> <div class='font-medium text-black dark:text-white'>From the community</div> <a class="inline-block -mx-1 px-1 mt-4" href="https://betterstack.com/community/guides/incident-management/what-is-incident-management/">What Is Incident Management? Beginner’s Guide</a> <a class="inline-block -mx-1 px-1 mt-4" href="https://betterstack.com/community/guides/incident-management/on-call-scheduling/">How to Create a Developer-Friendly On-Call Schedule in 7 steps</a> <a class="inline-block -mx-1 px-1 mt-4" href="https://betterstack.com/community/comparisons/free-status-page-tools/">8 Best Free & Open Source Status Page Tools in 2024</a> <a class="inline-block -mx-1 px-1 mt-4" href="https://betterstack.com/community/comparisons/api-monitoring-tools/">10 Best API Monitoring Tools in 2024</a> <a class="inline-block -mx-1 px-1 mt-4" href="https://betterstack.com/community/comparisons/incident-management-tools/">5 Most Used Incident Management Tools (Reviewed & Ranked)</a> </div> </div> </nav> <footer class='bg-[#F3F4F7] dark:bg-[#05060F]'> <div class='mx-auto text-base lg:px-5 max-w-[1110px] text-[#363D4E] dark:text-neutral-200'> <div class='px-5 pt-9 flex flex-col lg:flex-row justify-between items-center lg:items-end border-t border-neutral-300/10'> <div> <svg width='154' height='21' alt='' class='text-black dark:text-white scale-75 lg:scale-100' style='--currentColor: currentColor;'><use href='/assets/v2/better-stack-logo-0dd586683a61184ea953948d207470eeec73c76d81d57cd8af24bf56b36a90db.svg#root' /></svg> <p class='mt-3 hidden lg:block max-w-[342px]'> Better Stack lets you see inside any stack, debug any issue, and resolve any incident. </p> </div> <div class='flex items-center gap-6 whitespace-nowrap'> <a class="hidden lg:block -mx-1 px-1" href="tel:+1 (201) 500-2007">+1 (201) 500-2007</a> <a class="hidden lg:block -mx-1 px-1" href="mailto:hello@betterstack.com">hello@betterstack.com</a> <div class='hidden lg:block h-4 border-l border-neutral-300/10'></div> <div class='hidden lg:flex'><div class='flex gap-4 text-neutral-300'> <a aria-label='Better Stack on Instagram' href='https://www.instagram.com/betterstackhq/' rel='nofollow noopener' target='_blank'><svg width='16' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/instagram-4cc4103de28d49cc15040cfbf4b7a5e62fc76726f8a740f0135e777242b972b5.svg#root' /></svg></a> <a aria-label='Better Stack on TikTok' href='https://www.tiktok.com/@betterstack' rel='nofollow noopener' target='_blank'><svg width='16' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/tiktok-88d69bb11d499d82c7fefe4023153cd0152cbbd72809576171915fb9bd69a083.svg#root' /></svg></a> <a aria-label='Better Stack on LinkedIn' href='https://www.linkedin.com/company/betterstack' rel='nofollow noopener' target='_blank'><svg width='16' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/linkedin-4f511cfd40812cf617fa6ca9fbeff362681a975a1f4f911261bdbeaa2b1cbe19.svg#root' /></svg></a> <a aria-label='Better Stack on Twitter' href='https://twitter.com/betterstackhq' rel='nofollow noopener' target='_blank'><svg width='16' height='16' style='--currentColor: currentColor;'><use href='/assets/v2/twitter-c4218c9e217942ebbf4db83a3dec654ce97a94806c3d0fe7ebe31d7d7d2aa9b9.svg#root' /></svg></a> <a aria-label='Better Stack on Github' href='https://github.com/BetterStackHQ/' rel='nofollow noopener' target='_blank'><svg width='16' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/github-e74d48ed6bd519eddfaac1a76a313eed359b3ab311dccab980003682a3d3a05e.svg#root' /></svg></a> <a aria-label='Better Stack on YouTube' href='https://www.youtube.com/@betterstack' rel='nofollow noopener' target='_blank'><svg width='22' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/youtube-30a10afcb8b82cfd3a8ee62842a5d0651fa8d01ac0e6e472349f4359ea683cae.svg#root' /></svg></a> </div> </div> </div> </div> <div class='px-5 lg:px-2 lg:mx-3 mt-5 py-3 lg:border-t flex flex-col lg:flex-row justify-between items-center border-neutral-300/10 dark:border-[#1F2433]/70 text-[12px] leading-[18px]'> <div class='flex items-center gap-6 whitespace-nowrap dark:text-neutral-300'> <a class="-mx-1 px-1" href="/terms">Terms of Use</a> <a class="-mx-1 px-1" href="/privacy">Privacy Policy</a> <a class="-mx-1 px-1" href="/dpa">GDPR</a> <a class='hidden sm:block -mx-1 px-1' href='https://status.betterstack.com/' target='_blank'> <svg width='14' height='15' alt='All services are up' class='mr-1 hidden lg:inline' style='--currentColor: currentColor;'><use href='/assets/v2/status-green-9b323a3710393221033993056c8b5de0999eaf3139262ab0625db787dee99f00.svg#root' /></svg> System status </a> </div> <div class='mt-8 mb-2 flex lg:hidden'><div class='flex gap-4 text-neutral-300'> <a aria-label='Better Stack on Instagram' href='https://www.instagram.com/betterstackhq/' rel='nofollow noopener' target='_blank'><svg width='16' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/instagram-4cc4103de28d49cc15040cfbf4b7a5e62fc76726f8a740f0135e777242b972b5.svg#root' /></svg></a> <a aria-label='Better Stack on TikTok' href='https://www.tiktok.com/@betterstack' rel='nofollow noopener' target='_blank'><svg width='16' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/tiktok-88d69bb11d499d82c7fefe4023153cd0152cbbd72809576171915fb9bd69a083.svg#root' /></svg></a> <a aria-label='Better Stack on LinkedIn' href='https://www.linkedin.com/company/betterstack' rel='nofollow noopener' target='_blank'><svg width='16' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/linkedin-4f511cfd40812cf617fa6ca9fbeff362681a975a1f4f911261bdbeaa2b1cbe19.svg#root' /></svg></a> <a aria-label='Better Stack on Twitter' href='https://twitter.com/betterstackhq' rel='nofollow noopener' target='_blank'><svg width='16' height='16' style='--currentColor: currentColor;'><use href='/assets/v2/twitter-c4218c9e217942ebbf4db83a3dec654ce97a94806c3d0fe7ebe31d7d7d2aa9b9.svg#root' /></svg></a> <a aria-label='Better Stack on Github' href='https://github.com/BetterStackHQ/' rel='nofollow noopener' target='_blank'><svg width='16' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/github-e74d48ed6bd519eddfaac1a76a313eed359b3ab311dccab980003682a3d3a05e.svg#root' /></svg></a> <a aria-label='Better Stack on YouTube' href='https://www.youtube.com/@betterstack' rel='nofollow noopener' target='_blank'><svg width='22' height='17' style='--currentColor: currentColor;'><use href='/assets/v2/youtube-30a10afcb8b82cfd3a8ee62842a5d0651fa8d01ac0e6e472349f4359ea683cae.svg#root' /></svg></a> </div> </div> <div class='flex items-center text-neutral-300'> © 2025 Better Stack, Inc. <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="root" fill="none" height="15" viewBox="0 0 14 15" width="14" class="ml-2 transition hover:-rotate-[15deg] hidden lg:inline"><mask id="a" fill="#000" height="14" maskUnits="userSpaceOnUse" width="14" x=".84082" y=".910156"><path d="m.84082.910156h14v14h-14z" fill="#fff"></path><path clip-rule="evenodd" d="m12.4541 1.91016h-4.37651v.54686h-.54823v.54771 1.85936 1.2038h-.54617v.54725h-.87535v.54642h-.87576v.54777h-.54616v.54551h-.0011-.54589-.54734v-.65488h-.54706v2.84474h.54616v.6549h.54824v.547h.54699v.4392.6557.5469.4376.0003h.65647v-.0003h.43765v-.4376h-.43765v-.5469h.43765v-.6557h.54706v-.5478h.65609v.5472h.43768v.1982h1.09412v-.4377h-.54709v-.8541h.54701v-.5472h.54712v-.87494h.54616v-1.86076h.65821v.43832h.547v-.54706h-.0011v-.43832h-1.20411v-1.2027h.65671v-1.09465h2.1892v-.0002h.5459v-2.40707h-.5459zm-9.41064 5.25148h-.54617v-1.20358h-.65647v3.50119h.54616v.43769h.65648zm7.22294-1.74985h1.6412v.54706h-1.6412zm-1.62526-2.63729h.00042v-.00005h.80045v.00013h.26677v1.06726h-.26682v-.00107h-.8004v-.26582h-.00042zm.26682.79945h.534v-.53268h-.534z" fill="#000" fill-rule="evenodd"></path></mask><path d="m8.07759 1.91016v-.952682h-.95268v.952682zm4.37651 0h.9527v-.952682h-.9527zm-4.37651.54686v.95268h.95268v-.95268zm-.54823 0v-.95268h-.95268v.95268zm0 3.61087v.95268h.95268v-.95268zm-.54617 0v-.95268h-.95267v.95268zm0 .54725v.95268h.95268v-.95268zm-.87535 0v-.95268h-.95267v.95268zm0 .54642v.95268h.95268v-.95268zm-.87576 0v-.95268h-.95268v.95268zm0 .54777v.95268h.95268v-.95268zm-.54616 0v-.95268h-.95268v.95268zm0 .54551v.95268h.95268v-.95268zm-1.09433 0h-.95268v.95268h.95268zm0-.65488h.95268v-.95268h-.95268zm-.54706 0v-.95268h-.95268v.95268zm0 2.84474h-.95268v.9527h.95268zm.54616 0h.95268v-.9527h-.95268zm0 .6549h-.95268v.9526h.95268zm.54824 0h.95268v-.9527h-.95268zm0 .547h-.95268v.9527h.95268zm.54699 0h.95268v-.9527h-.95268zm0 2.0797h-.95268v.9527h.95268zm.65647 0v.9527h.95268v-.9527zm0-.0003v-.9526h-.95268v.9526zm.43765 0v.9527h.95268v-.9527zm0-.4376h.95268v-.9527h-.95268zm-.43765 0h-.95268v.9527h.95268zm0-.5469v-.9527h-.95268v.9527zm.43765 0v.9527h.95268v-.9527zm0-.6557v-.9527h-.95268v.9527zm.54706 0v.9527h.95268v-.9527zm0-.5478v-.9526h-.95268v.9526zm.65609 0h.95268v-.9526h-.95268zm0 .5472h-.95267v.9527h.95267zm.43768 0h.95268v-.9527h-.95268zm0 .1982h-.95268v.9526h.95268zm1.09412 0v.9526h.95268v-.9526zm0-.4377h.95268v-.9527h-.95268zm-.54709 0h-.95267v.9527h.95267zm0-.8541v-.9527h-.95267v.9527zm.54701 0v.9527h.95268v-.9527zm0-.5472v-.9527h-.95268v.9527zm.54712 0v.9527h.95267v-.9527zm0-.87494v-.95267h-.95268v.95267zm.54616 0v.95264h.95271v-.95264zm0-1.86076v-.95268h-.95268v.95268zm.65821 0h.9527v-.95268h-.9527zm0 .43832h-.9527v.95268h.9527zm.547 0v.95268h.9527v-.95268zm0-.54706h.9527v-.95268h-.9527zm-.0011 0h-.95264v.95268h.95264zm0-.43832h.9527v-.95268h-.9527zm-1.20411 0h-.95268v.95268h.95268zm0-1.2027v-.95268h-.95268v.95268zm.65671 0v.95268h.9527v-.95268zm0-1.09465v-.95268h-.95267v.95268zm2.1892 0v.95267h.9527v-.95267zm0-.0002v-.95268h-.9527v.95268zm.5459 0v.95267h.9526v-.95267zm0-2.40707h.9526v-.95268h-.9526zm-.5459 0h-.9527v.95268h.9527zm-9.95681 4.70462h-.95268v.95268h.95268zm.54617 0h.95267v-.95268h-.95267zm-.54617-1.20358h.95268v-.95268h-.95268zm-.65647 0v-.95268h-.952678v.95268zm0 3.50119h-.952678v.95265h.952678zm.54616 0h.95268v-.95268h-.95268zm0 .43769h-.95268v.95266h.95268zm.65648 0v.95266h.95267v-.95266zm8.86414-4.48515h.9526v-.95268h-.9526zm-1.6412 0v-.95268h-.9527v.95268zm1.6412.54706v.95268h.9526v-.95268zm-1.6412 0h-.9527v.95268h.9527zm-1.62484-3.18435v.95268h.95268v-.95268zm-.00042 0v-.95268h-.95267v.95268zm.00042-.00005v-.95268h-.95268v.95268zm.80045 0h.95269v-.95268h-.95269zm0 .00013h-.95268v.95268h.95268zm.26677 0h.95272v-.95268h-.95272zm0 1.06726v.95268h.95272v-.95268zm-.26682 0h-.95268v.95268h.95268zm0-.00107h.95264v-.95268h-.95264zm-.8004 0h-.95268v.95267h.95268zm0-.26582h.95268v-.95268h-.95268zm-.00042 0h-.95267v.95268h.95267zm.26682-.001h-.95268v.95268h.95268zm.534 0v.95268h.95264v-.95268zm0-.53268h.95264v-.95268h-.95264zm-.534 0v-.95268h-.95268v.95268zm-.83037-.17844h4.37651v-1.905352h-4.37651zm.95268-.40581v-.54686h-1.90536v.54686zm-1.50091.95268h.54823v-1.90536h-.54823zm.95268-.40497v-.54771h-1.90536v.54771zm0 1.85936v-1.85936h-1.90536v1.85936zm0 1.2038v-1.2038h-1.90536v1.2038zm-1.49885.95268h.54617v-1.90536h-.54617zm.95268-.40543v-.54725h-1.90535v.54725zm-1.82803.95268h.87535v-1.90536h-.87535zm.95268-.40626v-.54642h-1.90535v.54642zm-1.82844.95268h.87576v-1.90536h-.87576zm.95268-.40491v-.54777h-1.90536v.54777zm-1.49884.95268h.54616v-1.90536h-.54616zm.95268-.40717v-.54551h-1.90536v.54551zm-.95378.95268h.0011v-1.90535h-.0011zm-.54589 0h.54589v-1.90535h-.54589zm-.54734 0h.54734v-1.90535h-.54734zm-.95268-1.60756v.65488h1.90536v-.65488zm.40562.95268h.54706v-1.90536h-.54706zm.95268 1.89206v-2.84474h-1.90536v2.84474zm-.40652-.9527h-.54616v1.9054h.54616zm.95268 1.6076v-.6549h-1.90536v.6549zm-.40444-.9527h-.54824v1.9053h.54824zm.95268 1.4997v-.547h-1.90536v.547zm-.40569-.9527h-.54699v1.9054h.54699zm.95268 1.3919v-.4392h-1.90536v.4392zm0 .6557v-.6557h-1.90536v.6557zm0 .5469v-.5469h-1.90536v.5469zm0 .4376v-.4376h-1.90536v.4376zm0 .0003v-.0003h-1.90536v.0003zm-.29621-.9526h-.65647v1.9053h.65647zm-.95268.9523v.0003h1.90536v-.0003zm1.39033-.9526h-.43765v1.9053h.43765zm-.95268.515v.4376h1.90536v-.4376zm.51503.9527h.43765v-1.9054h-.43765zm-.95268-1.4996v.5469h1.90536v-.5469zm1.39033-.9527h-.43765v1.9054h.43765zm-.95268.297v.6557h1.90536v-.6557zm1.49974-.9527h-.54706v1.9054h.54706zm-.95268.4049v.5478h1.90536v-.5478zm1.60877-.9526h-.65609v1.9053h.65609zm.95268 1.4998v-.5472h-1.90535v.5472zm-.515-.9527h-.43768v1.9054h.43768zm.95268 1.1509v-.1982h-1.90536v.1982zm.14144-.9527h-1.09412v1.9053h1.09412zm-.95268.515v.4377h1.90536v-.4377zm.40559.9527h.54709v-1.9054h-.54709zm-.95267-1.8068v.8541h1.90535v-.8541zm1.49968-.9527h-.54701v1.9054h.54701zm-.95268.4055v.5472h1.90536v-.5472zm1.4998-.9527h-.54712v1.9054h.54712zm-.95268.07776v.87494h1.90535v-.87494zm1.49884-.95267h-.54616v1.90531h.54616zm-.95268-.90809v1.86076h1.90539v-1.86076zm1.61089-.95268h-.65821v1.90536h.65821zm.9527 1.391v-.43832h-1.9054v.43832zm-.4057-.95268h-.547v1.90536h.547zm-.95264.40562v.54706h1.90534v-.54706zm.95154.95268h.0011v-1.90536h-.0011zm-.95264-1.391v.43832h1.90534v-.43832zm-.25147.95268h1.20411v-1.90536h-1.20411zm-.95268-2.15538v1.2027h1.90539v-1.2027zm1.60939-.95268h-.65671v1.90536h.65671zm-.95267-.14197v1.09465h1.90537v-1.09465zm3.14187-.95268h-2.1892v1.90535h2.1892zm-.9527.95248v.0002h1.9054v-.0002zm1.4986-.95268h-.5459v1.90535h.5459zm-.9527-1.45439v2.40707h1.9053v-2.40707zm.4068.95268h.5459v-1.90536h-.5459zm-.9527-1.49954v.54686h1.9054v-.54686zm-9.00411 6.20416h.54617v-1.90536h-.54617zm-.95268-2.15626v1.20358h1.90536v-1.20358zm.29621.95268h.65647v-1.90536h-.65647zm.95268 2.54851v-3.50119h-1.905358v3.50119zm-.40652-.95268h-.54616v1.90533h.54616zm.95268 1.39037v-.43769h-1.90536v.43769zm-.2962-.95268h-.65648v1.90534h.65648zm-.95268-1.78262v2.7353h1.90535v-2.7353zm9.81682-2.70253h-1.6412v1.90536h1.6412zm.9526 1.49974v-.54706h-1.9053v.54706zm-2.5938.95268h1.6412v-1.90536h-1.6412zm-.9527-1.49974v.54706h1.9054v-.54706zm-.67214-3.58997h-.00042v1.90536h.00042zm-.95268.95263v.00005h1.90536v-.00005zm1.75313-.95268h-.80045v1.90536h.80045zm.95269.95281v-.00013h-1.90537v.00013zm-.68592-.95268h-.26677v1.90536h.26677zm.95272 2.01994v-1.06726h-1.9054v1.06726zm-1.21954.95268h.26682v-1.90536h-.26682zm-.95268-.95375v.00107h1.90532v-.00107zm.95268-.95268h-.8004v1.90535h.8004zm.15228.95268v-.26582h-1.90536v.26582zm-.9531.68686h.00042v-1.90536h-.00042zm-.95267-1.75313v.80045h1.90535v-.80045zm1.21949 1.75213h.534v-1.90536h-.534zm-.41868-1.48536v.53268h1.90532v-.53268zm.41868.95268h.534v-1.90536h-.534zm.95268-.42v-.53268h-1.90536v.53268z" fill="#646e87" mask="url(#a)"></path></svg> </div> </div> </div> </footer> </div> </div> <script src='https://cdnjs.betterstack.com/prismjs@1.29.0/components/prism-core.min.js'></script> <script src='https://cdnjs.betterstack.com/prismjs@1.29.0/plugins/autoloader/prism-autoloader.min.js'></script> <script src='https://cdnjs.betterstack.com/prismjs@1.29.0/plugins/keep-markup/prism-keep-markup.min.js'></script> </body> </html>