CINXE.COM

Log Formatting in Production: 9 Best Practices | 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>Log Formatting in Production: 9 Best Practices | 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='Learn 9 best practices for formatting your logs in production to make them easy to read, parse, and troubleshoot.' name='description'> <meta content='website' property='og:type'> <meta content='Log Formatting in Production: 9 Best Practices | Better Stack Community' property='og:title'> <meta content='Learn 9 best practices for formatting your logs in production to make them easy to read, parse, and troubleshoot.' property='og:description'> <meta content='https://betterstack.com/og-image/log-formatting.png' property='og:image'> <meta content='summary_large_image' property='twitter:card'> <meta content='betterstackhq' property='twitter:site'> <meta content='Log Formatting in Production: 9 Best Practices | Better Stack Community' property='twitter:title'> <meta content='Learn 9 best practices for formatting your logs in production to make them easy to read, parse, and troubleshoot.' property='twitter:description'> <meta content='https://betterstack.com/og-image/log-formatting.png' property='twitter:image'> <meta content='no-cache' name='turbo-cache-control'> <link href='https://betterstack.com/community/guides/logging/log-formatting/' rel='canonical'> <meta content='https://betterstack.com/community/guides/logging/log-formatting/' property='og:url'> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="Bvd_sx4ZiovOIW875ApjYT1e26r9xESawJCrEl-8XHJPPnXvVhmDgIcJeB2Ns5mmsXF6b7-Bz5PPxv1cif4uEA" /> <meta name="csp-nonce" content="c4ce798b7b27b2bee50709507f54ee97" /> <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='c4ce798b7b27b2bee50709507f54ee97'> 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='c4ce798b7b27b2bee50709507f54ee97'> !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='c4ce798b7b27b2bee50709507f54ee97'> !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='c4ce798b7b27b2bee50709507f54ee97'> !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='c4ce798b7b27b2bee50709507f54ee97'> _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 = "c4ce798b7b27b2bee50709507f54ee97"; b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; s.parentNode.insertBefore(b, s);})(window.lintrk); </script> <script defer='' nonce='c4ce798b7b27b2bee50709507f54ee97'> !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='c4ce798b7b27b2bee50709507f54ee97'> 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="c4ce798b7b27b2bee50709507f54ee97">{ "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-bdc191a9092986bc6a53fff514dadd5fffae6bbcbfa0a56394d47a35b17119cf.js", "application_controllers/payment/plan_controller": "/assets/application_controllers/payment/plan_controller-e001672c9f0dbe0d5f3db235e637a0de7a06db10e56b1438ffbb2829e7c879f6.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-2a4ae4655f472eab99b30ded483e7ecbc32d1ca1d10054f3ff83dbb8b8e6a157.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-400cea45a8d5db0115d23e22e7657e2c8fe6a7e0f7bc8e86e4f448ac91817638.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-77824ffe892ec1f4fc2a9ca248c0a16a1fdb2d545daa2c5a58b30f014a7d2126.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-31d0c1b39b018cca46f0bb5fe5be4f3c54526839cdffc7d21adb34d812fa4817.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="c4ce798b7b27b2bee50709507f54ee97"> <link rel="modulepreload" href="https://cdnjs.betterstack.com/@vue/devtools-api@6.6.3/lib/esm/index.js" nonce="c4ce798b7b27b2bee50709507f54ee97"> <link rel="modulepreload" href="https://cdnjs.betterstack.com/vue-demi@0.14.8/lib/index.mjs" nonce="c4ce798b7b27b2bee50709507f54ee97"> <link rel="modulepreload" href="https://cdnjs.betterstack.com/pinia@2.1.7/dist/pinia.esm-browser.js" nonce="c4ce798b7b27b2bee50709507f54ee97"> <link rel="modulepreload" href="https://cdnjs.betterstack.com/vue-turbolinks@2.2.2/index.js" nonce="c4ce798b7b27b2bee50709507f54ee97"> <script type="esms-options" nonce="c4ce798b7b27b2bee50709507f54ee97">{"nonce":"c4ce798b7b27b2bee50709507f54ee97"}</script> <script src="/assets/es-module-shims.min-d89e73202ec09dede55fb74115af9c5f9f2bb965433de1c2446e1faa6dac2470.js" defer="defer" data-turbo-track="reload" nonce="c4ce798b7b27b2bee50709507f54ee97"></script> <script type="module" nonce="c4ce798b7b27b2bee50709507f54ee97"> //<![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="c4ce798b7b27b2bee50709507f54ee97">import "entrypoints/articles"</script> <script type="application/javascript" nonce="c4ce798b7b27b2bee50709507f54ee97"> //<![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="c4ce798b7b27b2bee50709507f54ee97">import "channels"</script> <link rel="stylesheet" href="/assets/articles-e782bbfd0f7a58752013ae536af8456bd01826ea482194f5af657ddc02a9430b.css" media="all" data-turbo-track="reload" /> <style> @supports (-webkit-hyphens:none) { .book, .book:hover { filter: unset; } } </style> <script type="application/ld+json" nonce="c4ce798b7b27b2bee50709507f54ee97"> //<![CDATA[ [ { "@context": "https://schema.org", "@type": "Article", "headline": "Log Formatting in Production: 9 Best Practices", "author": "Ayooluwa Isaiah", "image": "/og-image/log-formatting.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/log-formatting/", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://google.com/article" }, "datePublished": "2023-06-29T05:51:03Z", "dateCreated": "2023-06-29T05:51:03Z", "dateModified": "2023-12-04T16:16:47Z", "description": "Learn 9 best practices for formatting your logs in production to make them easy to read, parse, and troubleshoot." } ] //]]> </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='Log Formatting in Production: 9 Best Practices' name='meta-docsearch-hierarchy4'> <meta content='Log Formatting Best Practices' name='meta-docsearch-name'> <meta content='Log Formatting in Production: 9 Best Practices' name='meta-docsearch-title'> <meta content='Learn 9 best practices for formatting your logs in production to make them easy to read, parse, and troubleshoot.' name='meta-docsearch-description'> <meta content='Learn 9 best practices for formatting your logs in production to make them easy to read, parse, and troubleshoot.' name='meta-docsearch-og_description'> <meta content='Ayooluwa Isaiah' name='meta-docsearch-authors'> </head> <body> <script type="application/javascript" nonce="c4ce798b7b27b2bee50709507f54ee97"> //<![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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting'> 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&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting'> Guides </a> </li> <li class='flex relative dropdown-trigger hover:text-white'> <a class='w-full p-2' href='/community/questions/?utm_content&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting'> Questions </a> </li> <li class='flex relative dropdown-trigger hover:text-white'> <a class='w-full p-2' href='/community/comparisons/?utm_content&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting'> Comparisons </a> </li> <li class='flex relative dropdown-trigger hover:text-white'> <a class='w-full p-2' href='/community/blog/?utm_content&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting'> 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="c4ce798b7b27b2bee50709507f54ee97"> //<![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]'> Log Formatting in Production: 9 Best Practices </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&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting">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/log-formatting?utm_content&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting">Log Formatting</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&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting">Logging</a> </div> <div class='mt-10 md:mt-16 mt-20 text-center'> <div class='text-white'>Ayooluwa Isaiah</div> <div class='mt-1 uppercase whitespace-nowrap text-xs font-medium text-neutral-300 tracking-[1.56px]'> Updated on December 4, 2023 </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="#types-of-log-formats">Types of log formats</a> </li> <li> <a href="#log-formatting-best-practices-impact-vs-difficulty">Log formatting best practices: impact vs. difficulty</a> </li> <li> <a href="#1-use-structured-json-logging">1. Use structured JSON logging</a> </li> <li> <a href="#2-standardize-on-string-based-log-levels">2. Standardize on string-based log levels</a> </li> <li> <a href="#3-record-timestamps-as-iso-8601">3. Record timestamps as ISO-8601</a> </li> <li> <a href="#4-include-detailed-log-source-information">4. Include detailed log source information</a> </li> <li> <a href="#5-include-the-build-version-or-commit-hash">5. Include the build version or commit hash</a> </li> <li> <a href="#6-ensure-stack-traces-are-included-in-error-logs">6. Ensure stack traces are included in error logs</a> </li> <li> <a href="#7-standardize-your-contextual-fields">7. Standardize your contextual fields</a> </li> <li> <a href="#8-correlate-your-request-logs-with-an-id">8. Correlate your request logs with an ID</a> </li> <li> <a href="#9-implement-selective-logging-for-your-objects">9. Implement selective logging for your objects</a> </li> <li> <a href="#final-thoughts">Final thoughts</a> </li> </ul> </div> </div> </div> <div class='grow shrink-0 prose max-w-[616px]' data-controller='body' data-toc-target='content'> <p>Log formatting plays an important role in capturing and organizing various application event details. It encompasses concerns such as:</p> <ul> <li>Structuring each log entry for clarity and consistency,</li> <li>Choosing the encoding method for logs,</li> <li>Strategically including and organizing contextual fields within logs,</li> <li>Defining how individual log records are separated or delimited.</li> </ul> <p>Sifting through poorly formatted logs will only lead to frustration akin to finding a needle in a haystack. Therefore, prioritizing proper log formatting is essential to enhance the effectiveness of your logging strategy, and it paves the way for more efficient log analysis and management.</p><p>Before discussing specific <a rel="" target="" class="" href="#log-formatting-best-practices-impact-vs-difficulty">formatting guidelines</a>, let&#39;s take a brief look at the three main categories of log formats.</p> <h2 id="types-of-log-formats">Types of log formats</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/7884e45c-fdbe-4444-2ed8-491d37999b00/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/7884e45c-fdbe-4444-2ed8-491d37999b00/md2x 2x" width=500 height=294 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/7884e45c-fdbe-4444-2ed8-491d37999b00/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/7884e45c-fdbe-4444-2ed8-491d37999b00/lg2x 2x" width=650 height=382 /> <img alt="log-formats-explained.png" width="1700" height="1000" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/7884e45c-fdbe-4444-2ed8-491d37999b00/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="log-formats-explained.png" width="1700" height="1000" loading="lazy" data-action="click-&gt;lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/7884e45c-fdbe-4444-2ed8-491d37999b00/orig" /> </figure> </div> </p><p>When it comes to formatting application logs, there are three primary approaches:</p> <h3 id="1-unstructured-logging">1. Unstructured logging</h3> <p>Unstructured logs are the freeform artists of the logging world. They defy predefined formats to offer flexibility and ease of reading in development.</p><p>Consider these examples:</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">&nbsp;</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>1687927940843: Starting application on port 3000 Encountered an unexpected error while backing up the database [2023-06-28T04:49:48.113Z]: Device XYZ123 went offline </code></pre> </div> </div> <p>Each entry tells a story, but without a consistent structure or sufficient context. The lack of a uniform format means that as your application scales, troubleshooting specific issues using these logs becomes an Herculean task.</p><p>Command-line tools like <code class="prettyprint">sed</code>, <code class="prettyprint">awk</code>, and <code class="prettyprint">grep</code> can help filter messages or extract key information, but this is more of a makeshift solution than a sustainable one.</p> <h3 id="2-semi-structured-logging">2. Semi-structured logging</h3> <p>Semi-structured logs are a step up from unstructured logs. They maintain some semblance of structure, but they often lack a recognizable format. For instance, consider the following 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"><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">2023-06-28 19:09:48.801818 I [969609:60] MyApp -- Starting application on port 3000 2023-06-28 19:09:48.801844 I [969609:60] MyApp -- Device XYZ123 went offline 2023-06-28 19:09:48.801851 E [969609:60 main.rb:13] MyApp -- Service &quot;ABCDE&quot; stopped unexpectedly. Restarting the service </code></pre> </div> </div> <p>In each entry, elements like the timestamp, log level, process and thread IDs, and application name are standardized, but the log message retains a flexible, narrative style that embeds all other contextual details.</p> <h3 id="3-structured-logging">3. Structured logging</h3> <p>Structured logging is a contemporary and highly effective approach to logging. Each log entry adheres to a recognizable and consistent format that facilitates automated searching, analysis, and monitoring using log management tools.</p><p>The most widely embraced structured format is JSON:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ &quot;host&quot;: &quot;fedora&quot;, &quot;application&quot;: &quot;Semantic Logger&quot;, &quot;timestamp&quot;: &quot;2023-06-28T17:20:19.409882Z&quot;, &quot;level&quot;: &quot;info&quot;, &quot;level_index&quot;: 2, &quot;pid&quot;: 982617, &quot;thread&quot;: &quot;60&quot;, &quot;name&quot;: &quot;MyApp&quot;, &quot;message&quot;: &quot;Starting application on port 3000&quot; } </code></pre> </div> </div> <p>Structured log entries present well-defined fields and values that capture precise information about the logged event or message.</p><p>The main downside to structured logging is reduced human-readability, which is essential in development environments.</p><p>This can usually be resolved by configuring your framework to output a semi-structured and colorized format in development, while defaulting to JSON output in production.</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/cb795c37-5b36-4e1f-55e5-dad292972700/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/cb795c37-5b36-4e1f-55e5-dad292972700/md2x 2x" width=500 height=325 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/cb795c37-5b36-4e1f-55e5-dad292972700/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/cb795c37-5b36-4e1f-55e5-dad292972700/lg2x 2x" width=650 height=422 /> <img alt="Screenshot from 2023-07-23 15-48-51.png" width="2702" height="1758" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/cb795c37-5b36-4e1f-55e5-dad292972700/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="Screenshot from 2023-07-23 15-48-51.png" width="2702" height="1758" loading="lazy" data-action="click-&gt;lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/cb795c37-5b36-4e1f-55e5-dad292972700/orig" /> </figure> </div> </p> <h2 id="log-formatting-best-practices-impact-vs-difficulty">Log formatting best practices: impact vs. difficulty</h2> <p>To enhance the utility of your logs, begin by adjusting the format of the data included in each log entry. Below are nine practices to follow for more effective logging:</p><div class='table-container'> <table> <thead> <tr> <th></th> <th>Impact</th> <th>Difficulty</th> </tr> </thead> <tbody> <tr> <td>Use structured JSON logging</td> <td>⭐⭐⭐⭐⭐</td> <td>⭐⭐</td> </tr> <tr> <td>Standardize on string-based log levels</td> <td>⭐⭐⭐</td> <td>⭐</td> </tr> <tr> <td>Log timestamps as ISO-8601</td> <td>⭐⭐⭐⭐</td> <td>⭐⭐</td> </tr> <tr> <td>Include log source information</td> <td>⭐⭐⭐</td> <td>⭐</td> </tr> <tr> <td>Add the build version or Git commit hash</td> <td>⭐⭐⭐</td> <td>⭐</td> </tr> <tr> <td>Capture a stack trace when logging errors</td> <td>⭐⭐⭐⭐⭐</td> <td>⭐</td> </tr> <tr> <td>Standardize your contextual fields</td> <td>⭐⭐⭐</td> <td>⭐⭐⭐</td> </tr> <tr> <td>Use a correlation ID to group related logs</td> <td>⭐⭐⭐⭐⭐</td> <td>⭐⭐⭐</td> </tr> <tr> <td>Selectively log object fields</td> <td>⭐⭐⭐</td> <td>⭐⭐⭐</td> </tr> </tbody> </table> </div> <h2 id="1-use-structured-json-logging">1. Use structured JSON logging</h2> <p>The easiest way to generate structured logs is to <a rel="" target="" class="" href="/community/guides/logging/logging-framework/">adopt a framework</a> that provides this ability natively or through a plugin. Most frameworks support this requirement, and many modern libraries even default to it. Here&#39;s an example of <a rel="" target="" class="" href="/community/guides/logging/logging-in-go/">structured logging in Go</a>:</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">&nbsp;</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 go' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-go'><code>package main import ( &quot;log/slog&quot; &quot;os&quot; ) func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) logger.Info(&quot;an info message&quot;) } </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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code class="!whitespace-pre-wrap">{&quot;time&quot;:&quot;2023-09-14T11:49:17.671587229+02:00&quot;,&quot;level&quot;:&quot;INFO&quot;,&quot;msg&quot;:&quot;an info message&quot;} </code></pre> </div> </div> <p>Your application dependencies can also usually be configured to produce structured logs. For instance, both <a rel="" target="" class="" href="/community/guides/logging/how-to-start-logging-with-postgresql/">PostgreSQL</a> and <a rel="" target="" class="" href="/community/guides/logging/how-to-view-and-configure-nginx-access-and-error-logs/">Nginx</a> support logging in JSON format:</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">/etc/nginx/nginx.conf</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 { log_format custom_json escape=json &#39;{&#39; &#39;&quot;timestamp&quot;:&quot;$time_iso8601&quot;,&#39; &#39;&quot;pid&quot;:&quot;$pid&quot;,&#39; &#39;&quot;remote_addr&quot;:&quot;$remote_addr&quot;,&#39; &#39;&quot;remote_user&quot;:&quot;$remote_user&quot;,&#39; &#39;&quot;request&quot;:&quot;$request&quot;,&#39; &#39;&quot;status&quot;: &quot;$status&quot;,&#39; &#39;&quot;body_bytes_sent&quot;:&quot;$body_bytes_sent&quot;,&#39; &#39;&quot;request_time_ms&quot;:&quot;$request_time&quot;,&#39; &#39;&quot;http_referrer&quot;:&quot;$http_referer&quot;,&#39; &#39;&quot;http_user_agent&quot;:&quot;$http_user_agent&quot;&#39; &#39;}&#39;; access_log /var/log/nginx/access.json custom_json; } </code></pre> </div> </div> <p>With the above Nginx access log configuration, you&#39;ll go from the archaic Combined Log Format representation:</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">&nbsp;</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>127.0.0.1 alice Alice [07/May/2021:10:44:53 +0200] &quot;GET / HTTP/1.1&quot; 200 396 &quot;-&quot; &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4531.93 Safari/537.36&quot; </code></pre> </div> </div> <p>To one with clearly defined fields:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ &quot;timestamp&quot;: &quot;2023-09-06T15:13:11+00:00&quot;, &quot;pid&quot;:&quot;8&quot;, &quot;remote_addr&quot;: &quot;217.138.222.109&quot;, &quot;remote_user&quot;: &quot;&quot;, &quot;request&quot;: &quot;GET /icons/ubuntu-logo.png HTTP/1.1&quot;, &quot;status&quot;: &quot;404&quot;, &quot;body_bytes_sent&quot;: &quot;197&quot;, &quot;request_time_ms&quot;: &quot;0.000&quot;, &quot;http_referrer&quot;: &quot;http://192.168.100.1/&quot;, &quot;http_user_agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36&quot; } </code></pre> </div> </div> <h2 id="2-standardize-on-string-based-log-levels">2. Standardize on string-based log levels</h2> <p><a rel="" target="" class="" href="/community/guides/logging/log-levels-explained/">Log levels</a> signify the recorded event&#39;s severity, and logging frameworks usually represent these levels internally with integers. For instance, here are Go&#39;s default levels and their integer representations:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ debug: -4, info: 0, warn: 4, error: 8, } </code></pre> </div> </div> <p>Usually, the level is emitted as strings for clarity regardless of their internal representations:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{&quot;level&quot;:&quot;INFO&quot;,&quot;time&quot;:&quot;2023-03-15T13:07:39.105777557+01:00&quot;,&quot;msg&quot;:&quot;Info message&quot;} </code></pre> </div> </div> <p>However, some frameworks like Node.js&#39;s <a rel="" target="" class="" href="/community/guides/logging/how-to-install-setup-and-use-pino-to-log-node-js-applications/">Pino</a> use their integer representations directly:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{&quot;level&quot;:60,&quot;time&quot;:1643664517737,&quot;msg&quot;:&quot;Fatal message&quot;} </code></pre> </div> </div> <p>In Pino, <code class="prettyprint">60</code> corresponds to the <code class="prettyprint">FATAL</code> level, per this schema:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ trace: 10, debug: 20, info: 30, warn: 40, error: 50, fatal: 60, } </code></pre> </div> </div> <p>To minimize confusion and ensure log uniformity across all the applications in your environment, it&#39;s better to normalize log formatting to always use string levels.</p><p>This approach mitigates ambiguity arising from differing interpretations of integer levels in various languages.</p><p><strong>Learn more</strong>: <a rel="" target="" class="" href="/community/guides/logging/log-levels-explained/">Log Levels Explained and How to Use Them</a></p> <h2 id="3-record-timestamps-as-iso-8601">3. Record timestamps as ISO-8601</h2> <p>When formatting timestamps, I recommend using the <a rel="" target="_blank" class="" href="https://en.wikipedia.org/wiki/ISO_8601">ISO-8601<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> format (or its stricter counterpart, <a rel="" target="_blank" class="" href="https://tools.ietf.org/html/rfc3339">RFC 3339<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>) as it provides a human-readable and unambiguous representation of the date and time (up to nanosecond precision) with optional timezone information.</p><p>Some examples:</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">&nbsp;</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>2023-09-10T12:34:56.123456789Z 2023-09-10T12:34:56+02:00 2023-11-17T12:34:56.123456789+01:00 </code></pre> </div> </div> <p>Ensure your timestamps are normalized to location-independent universal time (UTC) to establish a standard reference across all your services. If the location is relevant, offset the time zone accordingly.</p> <h2 id="4-include-detailed-log-source-information">4. Include detailed log source information</h2> <p>Every log entry should contain information about its source or origin to help identify where it was generated. Typically, logging frameworks can automatically include the source file, line number, and function in the log with minimal setup:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ &quot;time&quot;: &quot;2023-05-24T19:39:27.005Z&quot;, &quot;level&quot;: &quot;DEBUG&quot;, <div class='code-highlight top'> &quot;source&quot;: {</div> <div class='code-highlight'> &quot;function&quot;: &quot;main.main&quot;,</div> <div class='code-highlight'> &quot;file&quot;: &quot;app/main.go&quot;,</div> <div class='code-highlight'> &quot;line&quot;: 30</div> <div class='code-highlight bottom'> },</div> &quot;msg&quot;: &quot;Debug message&quot; } </code></pre> </div> </div> <p>In general, include whatever information helps you quickly pinpoint where the log message originated. In distributed systems, the hostname, container ID, and other relevant identifiers can also be immensely valuable for identifying issues on specific nodes.</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&amp;utm_medium=guides&amp;utm_source=community&amp;utm_term=log-formatting'> <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&nbsp;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-include-the-build-version-or-commit-hash">5. Include the build version or commit hash</h2> <p>Incorporating the build version number or commit hash into your log entries associates logs with a specific version of your application. This connection is crucial for reproducing and troubleshooting issues, as it allows you to identify the exact state of your project when the log was generated.</p><p>As codebases evolve, source information like function names and line numbers may change, making correlating logs with the updated code challenging. Including version information resolves this by providing a clear reference point.</p><p>Consider this log entry 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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ &quot;time&quot;: &quot;2023-05-24T19:39:27.005Z&quot;, &quot;level&quot;: &quot;ERROR&quot;, &quot;source&quot;: { &quot;function&quot;: &quot;main.main&quot;, &quot;file&quot;: &quot;app/main.go&quot;, &quot;line&quot;: 30 }, &quot;msg&quot;: &quot;Something unexpected happened&quot; } </code></pre> </div> </div> <p>If the associated code is refactored or relocated, matching this log with the current codebase could be confusing. However, with the application version or commit hash included, you can quickly revert to the specific state of the project (using commands like git checkout) for a more accurate investigation.</p><p>Another relevant detail is the compiler or runtime version used to compile or execute the program. This can also help ensure perfect reproducibility when investigating problems in the code.</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code class="!whitespace-pre-wrap">{ &quot;time&quot;: &quot;2023-06-29T06:37:38.429463999+02:00&quot;, &quot;level&quot;: &quot;ERROR&quot;, &quot;source&quot;: { &quot;function&quot;: &quot;main.main&quot;, &quot;file&quot;: &quot;app/main.go&quot;, &quot;line&quot;: 38 }, &quot;msg&quot;: &quot;an unexpected error&quot;, <div class='code-highlight top'> &quot;build_info&quot;: {</div> <div class='code-highlight'> &quot;go_version&quot;: &quot;go1.20.2&quot;,</div> <div class='code-highlight'> &quot;commit_hash&quot;: &quot;9b0695e1c4732a2ea2c8ac678472c4c3c235101b&quot;</div> <div class='code-highlight bottom'> }</div> } </code></pre> </div> </div> <h2 id="6-ensure-stack-traces-are-included-in-error-logs">6. Ensure stack traces are included in error logs</h2> <p>Including stack traces in your error logs is necessary for swiftly pinpointing the problem&#39;s source. Most well-designed frameworks will automatically capture stack trace details for exceptions, but some may need extra configuration or additional packages.</p><p>Here&#39;s an example of a stack trace produced by <a rel="" target="" class="" href="/community/guides/logging/how-to-start-logging-with-python/">Python&#39;s standard logging module</a> coupled with <a rel="" target="_blank" class="" href="https://github.com/madzak/python-json-logger">python-json-logger<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>:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ &quot;name&quot;: &quot;__main__&quot;, &quot;timestamp&quot;: &quot;2023-02-06T09:28:54Z&quot;, &quot;severity&quot;: &quot;ERROR&quot;, &quot;filename&quot;: &quot;example.py&quot;, &quot;lineno&quot;: 26, &quot;process&quot;: 913135, &quot;message&quot;: &quot;division by zero&quot;, &quot;exc_info&quot;: &quot;Traceback (most recent call last):\n File \&quot;/home/betterstack/community/python-logging/example.py\&quot;, line 24, in &lt;module&gt;\n 1 / 0\n ~~^~~\nZeroDivisionError: division by zero&quot; } </code></pre> </div> </div> <p>The entire stack trace is included as a string property in this instance. Some frameworks such as <a rel="" target="" class="" href="/community/guides/logging/structlog/">Structlog</a>, support structured stack traces in JSON format, which is highly preferable:</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ &quot;event&quot;: &quot;Cannot divide one by zero!&quot;, &quot;level&quot;: &quot;error&quot;, &quot;timestamp&quot;: &quot;2023-07-31T07:00:31.526266Z&quot;, &quot;exception&quot;: [ { &quot;exc_type&quot;: &quot;ZeroDivisionError&quot;, &quot;exc_value&quot;: &quot;division by zero&quot;, &quot;syntax_error&quot;: null, &quot;is_cause&quot;: false, &quot;frames&quot;: [ { &quot;filename&quot;: &quot;/home/betterstack/structlog_demo/app.py&quot;, &quot;lineno&quot;: 16, &quot;name&quot;: &quot;&lt;module&gt;&quot;, &quot;line&quot;: &quot;&quot;, &quot;locals&quot;: { &quot;__name__&quot;: &quot;__main__&quot;, &quot;__doc__&quot;: &quot;None&quot;, &quot;__package__&quot;: &quot;None&quot;, &quot;__loader__&quot;: &quot;&lt;_frozen_importlib_external.SourceFileLoader object at 0xffffaa2f3410&gt;&quot;, &quot;__spec__&quot;: &quot;None&quot;, &quot;__annotations__&quot;: &quot;{}&quot;, &quot;__builtins__&quot;: &quot;&lt;module &#39;builtins&#39; (built-in)&gt;&quot;, &quot;__file__&quot;: &quot;/home/betterstack/structlog_demo/app.py&quot;, &quot;__cached__&quot;: &quot;None&quot;, &quot;structlog&quot;: &quot;\&quot;&lt;module &#39;structlog&#39; from &#39;/home/betterstack/structlog_demo/venv/lib/python3.11/site-\&quot;+32&quot;, &quot;logger&quot;: &quot;&#39;&lt;BoundLoggerLazyProxy(logger=None, wrapper_class=None, processors=None, context_&#39;+55&quot; } } ] } ] } </code></pre> </div> </div> <p>Where possible, prefer a structured stack trace as above but a large string block is better than nothing.</p> <h2 id="7-standardize-your-contextual-fields">7. Standardize your contextual fields</h2> <p>To make your log messages more informative and actionable, you need to add contextual fields to your log messages. These fields should help answer key questions about each logged event such as what happened, when, where, why, and the responsible entity.</p><p>In the past, logging APIs typically required embedding contextual details directly into the log message string:</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">&nbsp;</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 go' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-go'><code>log.Println(&quot;User &#39;&quot; + user.id + &quot;&#39; logged in&quot;) </code></pre> </div> </div> <p>This approach has a few downsides:</p> <ul> <li>Inefficient string formatting could occur even if the log is ultimately ignored.</li> <li>Extracting the data from the formatted message is often challenging.</li> <li>You have to manually add contextual details to each log message.</li> </ul> <p>Instead, log contextual information as key/value pairs:</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">&nbsp;</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 go' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-go'><code>slog.Info(&quot;User logged in&quot;, slog.Int(&quot;user_id&quot;, 42)) </code></pre> </div> </div> <p>This results in logs that look like this:</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code class="!whitespace-pre-wrap">{ &quot;time&quot;: &quot;2023-11-16T08:58:20.474534594+02:00&quot;, &quot;level&quot;: &quot;INFO&quot;, &quot;msg&quot;: &quot;User logged in&quot;, &quot;user_id&quot;: 42 } </code></pre> </div> </div> <p>This approach also makes it easy to bind data attributes to your loggers to ensure they are present in subsequent logging calls:</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">&nbsp;</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 go' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-go'><code>l := slog.With(slog.Int(&quot;user_id&quot;, 42)) l.Info(&quot;user logged in&quot;) l.Info(&quot;user deleted doc&quot;, slog.String(&quot;doc_id&quot;, &quot;DOC-123&quot;)) l.Info(&quot;user logged out&quot;) </code></pre> </div> </div> <p>This way, the <code class="prettyprint">user_id</code> will be included in all subsequent 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"><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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code class="!whitespace-pre-wrap">{ &quot;time&quot;: &quot;2023-11-16T09:03:04.631228502+02:00&quot;, &quot;level&quot;: &quot;INFO&quot;, &quot;msg&quot;: &quot;user logged in&quot;, &quot;user_id&quot;: 42 } { &quot;time&quot;: &quot;2023-11-16T09:03:04.631353885+02:00&quot;, &quot;level&quot;: &quot;INFO&quot;, &quot;msg&quot;: &quot;user deleted doc&quot;, &quot;user_id&quot;: 42, &quot;doc_id&quot;: &quot;DOC-123&quot; } { &quot;time&quot;: &quot;2023-11-16T09:03:04.6313599+02:00&quot;, &quot;level&quot;: &quot;INFO&quot;, &quot;msg&quot;: &quot;user logged out&quot;, &quot;user_id&quot;: 42 } </code></pre> </div> </div> <p>To maintain log consistency, establish standards for field names and content types to help prevent situations where user IDs are logged as <code class="prettyprint">user</code>, <code class="prettyprint">user_id</code>, or <code class="prettyprint">userID</code> in various places.</p><p>Additionally, consider including units in field names for integer values (e.g. <code class="prettyprint">execution_time_ms</code> or <code class="prettyprint">response_size_bytes</code>) to eliminate ambiguity.</p> <h2 id="8-correlate-your-request-logs-with-an-id">8. Correlate your request logs with an ID</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/1d4040d8-bef1-44e3-99b7-4bbfe70bf200/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/1d4040d8-bef1-44e3-99b7-4bbfe70bf200/md2x 2x" width=500 height=325 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/1d4040d8-bef1-44e3-99b7-4bbfe70bf200/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/1d4040d8-bef1-44e3-99b7-4bbfe70bf200/lg2x 2x" width=650 height=423 /> <img alt="Screenshot from 2023-09-14 22-41-18.png" width="2172" height="1415" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/1d4040d8-bef1-44e3-99b7-4bbfe70bf200/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="Screenshot from 2023-09-14 22-41-18.png" width="2172" height="1415" loading="lazy" data-action="click-&gt;lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/1d4040d8-bef1-44e3-99b7-4bbfe70bf200/orig" /> </figure> </div> </p><p>A single log entry often represents just one event within a larger operation or workflow. For instance, when handling an HTTP request, numerous log entries may be generated at various stages of the request&#39;s lifecycle.</p><p>To better understand and collectively analyze these logs, including a correlation ID that ties together all the log entries related to a specific request is crucial.</p><p>Such IDs can be generated at the edge of your infrastructure and propagated throughout the entire request lifecycle. This ensures each related log message carries this identifier, enabling you to easily group and analyze logs from a single request.</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">&nbsp;</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 json' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-json'><code>{ &quot;timestamp&quot;: &quot;2023-09-10T15:30:45.123456Z&quot;, <div class='code-highlight top bottom'> &quot;correlation_id&quot;: &quot;9ea8f2b4-639e-4de7-b406-f6cd3a155e9f&quot;,</div> &quot;level&quot;: &quot;INFO&quot;, &quot;message&quot;: &quot;Received incoming HTTP request&quot;, &quot;request&quot;: { &quot;method&quot;: &quot;GET&quot;, &quot;path&quot;: &quot;/api/resource&quot;, &quot;remote_address&quot;: &quot;192.168.1.100&quot; } } </code></pre> </div> </div> <h2 id="9-implement-selective-logging-for-your-objects">9. Implement selective logging for your objects</h2> <p>To reduce the verbosity of your logs and safeguard against accidentally exposing sensitive data, it&#39;s necessary to control which aspects of your custom objects/structs are logged.</p><p>This is often achievable by implementing a method (usually <code class="prettyprint">toString()</code>, <code class="prettyprint">String()</code>, or similar) in your objects that specifies which fields are safe to log. By doing so, you can ensure that only necessary object fields are included in your logs.</p><p>Here&#39;s an example using <a rel="" target="_blank" class="" href="https://pkg.go.dev/log/slog">Go&#39;s Slog package<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>:</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">&nbsp;</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 go' data-clipboard-target='content' data-controller='code'> <pre class='highlight language-go'><code>type User struct { ID string `json:&quot;id&quot;` Name string `json:&quot;name&quot;` Email string `json:&quot;email&quot;` Password string `json:&quot;password&quot;` } func (u *User) LogValue() slog.Value { return slog.StringValue(u.ID) } </code></pre> </div> </div> <p>By implementing the <code class="prettyprint">LogValuer</code> interface, you effectively control the logging output of the <code class="prettyprint">User</code> struct. Here, only the <code class="prettyprint">ID</code> field will be included in the log record whenever a <code class="prettyprint">User</code> instance is logged.</p><p>This approach not only reduces log clutter but also prevents inadvertent logging of sensitive fields (including those added in the future).</p><p><strong>Learn more</strong>: <a rel="" target="" class="" href="/community/guides/logging/sensitive-data/">Best Logging Practices for Safeguarding Sensitive Data</a></p> <h2 id="final-thoughts">Final thoughts</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/a8b83366-454f-4921-9025-1ebbe97af900/md1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/a8b83366-454f-4921-9025-1ebbe97af900/md2x 2x" width=500 height=289 /> <source media="(min-width: 801px)" data-srcset="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/a8b83366-454f-4921-9025-1ebbe97af900/lg1x 1x, https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/a8b83366-454f-4921-9025-1ebbe97af900/lg2x 2x" width=650 height=376 /> <img alt="nginx-live-tail.png" width="1601" height="927" class="w-full lazyload" data-src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/a8b83366-454f-4921-9025-1ebbe97af900/orig" src="" /> </picture> </figure> <figure class='hidden lightbox' data-lightbox-target='container'> <img alt="nginx-live-tail.png" width="1601" height="927" loading="lazy" data-action="click-&gt;lightbox#close" data-lightbox-target="img" src="https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/a8b83366-454f-4921-9025-1ebbe97af900/orig" /> </figure> </div> </p><p>Once you&#39;ve started generating structured and well-formatted logs, the next step is to <a rel="" target="" class="" href="/community/guides/logging/log-aggregation/">aggregate</a> and centralize them in a log management service that provides an easy way to filter, visualize, and set up alert rules to promptly notify you about specific events or patterns that warrant attention.</p><p>For further reading on log management, read our <a rel="" target="" class="" href="/community/guides/logging/log-management/">newest article</a>. </p><p>Sounds interesting? Spin up a free trial of <a rel="" target="" class="" href="https://betterstack.com/logs">Better Stack</a> to see how easy log analytics can be.</p><p>Thanks for reading, and happy logging!</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&#39;s avatar" class="!rounded-none m-0 lazyload" data-src="/assets/articles/authors/ayooluwa-isaiah-f240882dd153c62ad0f7f0a6dd33fe642a0fabca635395a7e6c1cce19f9cf42b.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'>Ayooluwa Isaiah</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/ayoisaiah' 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://freshman.tech' 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> </div> </div> <div class='text-neutral-400 whitespace-pre-wrap'>Ayo is a technical content manager at Better Stack. His passion is simplifying and communicating complex technical ideas effectively. His work was featured on several esteemed publications including LWN.net, Digital Ocean, and CSS-Tricks. When he&#39;s not writing or coding, he loves to travel, bike, and play tennis.</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%20Log%20Formatting%20in%20Production%3A%209%20Best%20Practices&amp;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&amp;url=https://betterstack.com/community/guides/logging/log-formatting/&amp;text=Log+Formatting+in+Production%3A+9+Best+Practices+%7C+Better+Stack+Community&amp;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/log-formatting/' 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=Log%20Formatting%20in%20Production%3A%209%20Best%20Practices&amp;body=https%3A%2F%2Fbetterstack.com%2Fcommunity%2Fguides%2Flogging%2Flog-formatting%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/sensitive-data/'> <div class='p-5 grow'> <div class='text-xl font-bold text-neutral-800'>Best Logging Practices for Safeguarding Sensitive Data</div> <div class='mt-2 text-neutral-300'>In this guide, you will learn several best practices for keeping sensitive data out of your logs</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-&gt;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-&gt;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 aria-current='page' class='grow py-2 text-deprecated-primary-700' 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 class='grow py-2' 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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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&apos;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&amp;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 &amp; 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 &amp; 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 &amp; 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 &amp; 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'> &copy; 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>

Pages: 1 2 3 4 5 6 7 8 9 10