{"id":6398,"date":"2015-12-05T10:37:24","date_gmt":"2015-12-05T09:37:24","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/"},"modified":"2015-12-05T10:37:24","modified_gmt":"2015-12-05T09:37:24","slug":"sql-monitoring-in-postgresql-1-the-logging-system","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/","title":{"rendered":"SQL Monitoring in PostgreSQL (1) &#8211; the logging system"},"content":{"rendered":"<p>When developing an application as well as when the application is in production there is the need to identify long running queries. In Oracle one tool you might use for that is the <a href=\"http:\/\/docs.oracle.com\/database\/121\/TGSQL\/tgsql_monit.htm#TGSQL94607\">SQL Monitor<\/a>. In this post I&#8217;ll look into what PostgreSQL provides in this area.<\/p>\n<p>PostgreSQL has a very strong <a href=\"http:\/\/www.postgresql.org\/docs\/9.4\/static\/runtime-config-logging.html\" target=\"blank\" rel=\"noopener\">logging system<\/a>. This system can be used to log many, many server messages as well as information about sql queries. To enable to background process that captures the server log messages and redirects them to log files you need to set the logging_collector parameter to on in a first step:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; alter system set logging_collector=on;\nALTER SYSTEM\nTime: 30.390 ms\n(postgres@[local]:4448) [postgres] &gt; show logging_collector;\n logging_collector \n-------------------\n on\n(1 row)\n<\/pre>\n<p>Once you have this enabled you need to tell PostgreSQL where you want to log to. This is done by setting the parameter log_directory:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; show log_directory;\n     log_directory      \n------------------------\n \/u02\/pgdata\/PG6\/pg_log\n(1 row)\n<\/pre>\n<p>In my case this is set to the pg_log directory which is located in my data directory. Additionally we can define how the log files will be named:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; show log_filename;\n   log_filename    \n-------------------\n postgresql-%a.log\n(1 row)\n<\/pre>\n<p>The place holders which can be used are the same as in <a href=\"pubs.opengroup.org\/onlinepubs\/009695399\/functions\/strftime.html\" target=\"_blank\" rel=\"noopener\">strftime<\/a>. The default is:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; alter system set log_filename='postgresql-%Y-%m-%d_%H%M%S.log';\nALTER SYSTEM\nTime: 45.666 ms\n<\/pre>\n<p>I recommend to set the log_rotation_age or log_rotation_size parameter so that the log-files will be rotated:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; show log_rotation_size;\n log_rotation_size \n-------------------\n 10MB\n(1 row)\n\nTime: 1.015 ms\n(postgres@[local]:4448) [postgres] &gt; show log_rotation_age;\n log_rotation_age \n------------------\n 8d\n(1 row)\n<\/pre>\n<p>As we now have the basic settings available lets check if we need to restart the server for the settings to go into effect:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; select name,pending_restart \n                                       from pg_settings \n                                      where name in ('log_filename','log_rotation_size'\n                                                    ,'log_rotation_age','log_destination','logging_collector');\n       name        | pending_restart \n-------------------+-----------------\n log_destination   | f\n log_filename      | f\n log_rotation_age  | f\n log_rotation_size | f\n logging_collector | f\n(5 rows)\n\n(postgres@[local]:4448) [postgres] &gt; select pg_reload_conf();\n pg_reload_conf \n----------------\n t\n(1 row)\n<\/pre>\n<p>Ok, should be fine. Lets quickly check if there is a log file with some recent messages in the directory we specified:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG6] ls -altr \/u02\/pgdata\/PG6\/pg_log\ntotal 68\ndrwx------. 19 postgres postgres 4096 Dec  5 11:01 ..\ndrwx------.  2 postgres postgres   45 Dec  5 11:01 .\n-rw-------.  1 postgres postgres  384 Dec  5 11:01 postgresql-2015-12-05_100103.log\n<\/pre>\n<p>Looks fine. Back to what this post is about. How can we log sql statements? One parameter in this area is log_duration. When we set this to on:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; alter system set log_duration=on;\nALTER SYSTEM\nTime: 38.978 ms\n(postgres@[local]:4448) [postgres] &gt; select name,pending_restart \n                                       from pg_settings \n                                      where name in ('log_duration');\n     name     | pending_restart \n--------------+-----------------\n log_duration | f\n(1 row)\n\nTime: 2.044 ms\n\n(postgres@[local]:4448) [postgres] &gt; select pg_reload_conf();\n pg_reload_conf \n----------------\n t\n(1 row)\n<\/pre>\n<p>&#8230; the duration of every statement is logged to the log file:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; create table tt ( a int );\nCREATE TABLE\nTime: 23.829 ms\n(postgres@[local]:4448) [postgres] &gt; insert into tt (a) values (generate_series(1,1000));\nINSERT 0 1000\nTime: 37.333 ms\n(postgres@[local]:4448) [postgres] &gt; select count(*) from tt;\n count \n-------\n  1000\n(1 row)\n<\/pre>\n<p>Having a look at the log file we can confirm that the duration is logged:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG6] tail \/u02\/pgdata\/PG6\/pg_log\/postgresql-2015-12-05_100103.log \n2015-12-05 10:08:07.044 GMT - 4 - 4609 - postgres@postgres LOG:  statement: create table tt ( a int );\n2015-12-05 10:08:07.067 GMT - 5 - 4609 - postgres@postgres LOG:  duration: 23.669 ms\n2015-12-05 10:08:22.052 GMT - 6 - 4609 - postgres@postgres LOG:  duration: 37.163 ms\n2015-12-05 10:08:25.519 GMT - 7 - 4609 - postgres@postgres LOG:  duration: 22.992 ms\n<\/pre>\n<p>Well, is the duration without the text of the statement very helpful? Not really and this is where the log_min_duration_statement parameter comes into the game. Setting this to any value greater than -1 logs each statement that runs longer than what you specified. If you set it to zero all statements will be logged:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; alter system set log_min_duration_statement=0;\nALTER SYSTEM\n\nTime: 0.188 ms\n(postgres@[local]:4448) [postgres] &gt; select pg_reload_conf();\n pg_reload_conf \n----------------\n t\n(1 row)\n\n(postgres@[local]:4448) [postgres] &gt; select count(*) tt;\n tt \n----\n  1\n(1 row)\n\nTime: 0.680 ms\n\n<\/pre>\n<p>Checking the logfile again:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG6] tail -1 \/u02\/pgdata\/PG6\/pg_log\/postgresql-2015-12-05_100103.log\n2015-12-05 10:13:48.392 GMT - 8 - 4651 - postgres@postgres LOG:  duration: 0.216 ms  statement: select count(*) tt;\n<\/pre>\n<p>Much better: We have the time stamp when the statement was executed, the number of the line in the logfile where we can find the log message (8), the operating system process id and the user which executed the statement. <\/p>\n<p>That&#8217;s is for now. Make yourself familiar with the <a href=\"www.postgresql.org\/docs\/current\/static\/runtime-config-logging.html\" target=\"_blank\" rel=\"noopener\">various parameters of the logging system<\/a>. There are plenty of things you can control and adjust. <\/p>\n<p>The next post will look at another way to identify problematic statements.<\/p>\n<p>Btw: The PostgreSQL version I used here is:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:4448) [postgres] &gt; select version();\n                                                     version                                                      \n------------------------------------------------------------------------------------------------------------------\n PostgreSQL 9.5alpha2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit\n(1 row)\n\nTime: 0.376 ms\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>When developing an application as well as when the application is in production there is the need to identify long running queries. In Oracle one tool you might use for that is the SQL Monitor. In this post I&#8217;ll look into what PostgreSQL provides in this area. PostgreSQL has a very strong logging system. This [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[143,77,98],"type_dbi":[],"class_list":["post-6398","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-monitoring","tag-postgresql","tag-sql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>SQL Monitoring in PostgreSQL (1) - the logging system - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Monitoring in PostgreSQL (1) - the logging system\" \/>\n<meta property=\"og:description\" content=\"When developing an application as well as when the application is in production there is the need to identify long running queries. In Oracle one tool you might use for that is the SQL Monitor. In this post I&#8217;ll look into what PostgreSQL provides in this area. PostgreSQL has a very strong logging system. This [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-05T09:37:24+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"SQL Monitoring in PostgreSQL (1) &#8211; the logging system\",\"datePublished\":\"2015-12-05T09:37:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/\"},\"wordCount\":449,\"commentCount\":0,\"keywords\":[\"Monitoring\",\"PostgreSQL\",\"SQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/\",\"name\":\"SQL Monitoring in PostgreSQL (1) - the logging system - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2015-12-05T09:37:24+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Monitoring in PostgreSQL (1) &#8211; the logging system\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQL Monitoring in PostgreSQL (1) - the logging system - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/","og_locale":"en_US","og_type":"article","og_title":"SQL Monitoring in PostgreSQL (1) - the logging system","og_description":"When developing an application as well as when the application is in production there is the need to identify long running queries. In Oracle one tool you might use for that is the SQL Monitor. In this post I&#8217;ll look into what PostgreSQL provides in this area. PostgreSQL has a very strong logging system. This [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/","og_site_name":"dbi Blog","article_published_time":"2015-12-05T09:37:24+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"SQL Monitoring in PostgreSQL (1) &#8211; the logging system","datePublished":"2015-12-05T09:37:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/"},"wordCount":449,"commentCount":0,"keywords":["Monitoring","PostgreSQL","SQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/","url":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/","name":"SQL Monitoring in PostgreSQL (1) - the logging system - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2015-12-05T09:37:24+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/sql-monitoring-in-postgresql-1-the-logging-system\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL Monitoring in PostgreSQL (1) &#8211; the logging system"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/6398","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=6398"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/6398\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=6398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=6398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=6398"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=6398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}