{"id":135684,"date":"2019-08-27T22:04:05","date_gmt":"2019-08-27T22:04:05","guid":{"rendered":"http:\/\/inchoo.net\/?p=23879"},"modified":"2019-08-27T22:04:05","modified_gmt":"2019-08-27T22:04:05","slug":"magento-2-logging","status":"publish","type":"post","link":"https:\/\/www.sushilkumar.ind.in\/blog\/magento-2\/magento-2-logging\/","title":{"rendered":"Magento 2 logging"},"content":{"rendered":"<p>Logging is an important part of every development process. Logs provide insight into system processes of Magento 2 and are a great tool for tracking errors, significant events, exceptions and many more.\u00a0In order for the logging library to be properly implemented with Magento 2, it must comply with PSR-3 standard.<\/p>\n<p>Magento 2 comes with built-in logging solution based on<a href=\"https:\/\/github.com\/Seldaek\/monolog\"> Monolog Library<\/a> which will be analyzed further in this article.<span id=\"more-23879\"><\/span><\/p>\n<p>Main Magento 2 log class is <em>\u201cMagento\\Framework\\Logger\\Monolog\u201d<\/em> and is defined in \u201cMAGENTO2_ROOT\/app\/etc\/di.xml\u201d<\/p>\n<pre class=\"ish\"><code class=\"language-xml\"><span class=\"sc3\"><span class=\"re1\">&lt;preference<\/span> <span class=\"re0\">for<\/span>=\u201dPsr\\Log\\LoggerInterface\u201d <span class=\"re0\">type<\/span>=\u201dMagento\\Framework\\Logger\\Monolog\u201d<span class=\"re2\">&gt;<\/span><\/span><\/code><\/pre>\n<p>As mentioned before Monolog is a powerful logging tool that allows the user to use a wide range of handlers to their benefit, such as logging to files and syslog, sending alerts and e-mails, logging database activity, etc.<\/p>\n<p>Logger class has 8 levels of logs and methods for each of those levels, usage of these methods depends on the type of the message user is logging.<\/p>\n<p>Each of these methods accepts 2 arguments, first one is the message itself ( string) and the second one is an optional array (for example instance of an Exception object)<\/p>\n<pre class=\"ish\"><code class=\"language-php\"><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">emergency<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span><span class=\"sy0\">;<\/span>\u00a0\u00a0<span class=\"co1\">\/\/saved in var\/log\/system.log<\/span>\n&nbsp;\n<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">alert<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span>\u00a0\u00a0<span class=\"co1\">\/\/saved in var\/log\/system.log<\/span>\n&nbsp;\n<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">critical<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span>\u00a0 <span class=\"co1\">\/\/saved in var\/log\/system.log<\/span>\n&nbsp;\n<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">error<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span>\u00a0\u00a0<span class=\"co1\">\/\/saved in var\/log\/system.log<\/span>\n&nbsp;\n<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">warning<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span>\u00a0\u00a0<span class=\"co1\">\/\/saved in\u00a0 var\/log\/system.log<\/span>\n&nbsp;\n<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">notice<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span>\u00a0\u00a0<span class=\"co1\">\/\/saved in var\/log\/system.log<\/span>\n&nbsp;\n<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">info<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span>\u00a0\u00a0<span class=\"co1\">\/\/saved in var\/log\/system.log<\/span>\n&nbsp;\n<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">debug<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span>\u00a0\u00a0<span class=\"co1\">\/\/saved in var\/log\/debug.log (does not work in production mode)<\/span><\/code><\/pre>\n<p>There is another method that can\u00a0<span style=\"font-weight: 400\">be used to log something with an arbitrary level passed as\u00a0 first parameter<\/span><\/p>\n<pre class=\"ish\"><code class=\"language-php\"><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span>_logger<span class=\"sy0\">-&gt;<\/span> <span class=\"kw3\">log<\/span><span class=\"br0\">&#040;<\/span><span class=\"re0\">$level<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$message<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$context<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span><span class=\"br0\">&#041;<\/span><\/code><\/pre>\n<p>All exceptions, no matter what log level is used, are saved in var\/log\/exception.log<\/p>\n<h2>Using logger class<\/h2>\n<p>Magento 2 uses<a href=\"http:\/\/inchoo.net\/magento-2\/basics-dependency-injection-usage-magento-2\/\"> dependency injection<\/a> so in order to use logger in our class we must pass it in our class constructor.<\/p>\n<p>Here is an example of how to use logger in a custom class to log an exception.<\/p>\n<pre class=\"ish\"><code class=\"language-php\"><span class=\"kw2\">class<\/span> Example\n<span class=\"br0\">&#123;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"kw2\">private<\/span> <span class=\"re0\">$logger<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> __construct<span class=\"br0\">&#040;<\/span>\\Psr\\<span class=\"kw3\">Log<\/span>\\LoggerInterface <span class=\"re0\">$logger<\/span><span class=\"br0\">&#041;<\/span> <span class=\"br0\">&#123;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">logger<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$logger<\/span><span class=\"sy0\">;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"br0\">&#125;<\/span>\n&nbsp;\n\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> exampleMethod<span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"br0\">&#123;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try <span class=\"br0\">&#123;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"co1\">\/\/do something<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"br0\">&#125;<\/span> catch <span class=\"br0\">&#040;<\/span>\\Exception <span class=\"re0\">$e<\/span><span class=\"br0\">&#041;<\/span> <span class=\"br0\">&#123;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">logger<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">critical<\/span><span class=\"br0\">&#040;<\/span><span class=\"st_h\">'Error message'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">[<\/span><span class=\"st_h\">'exception'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$e<\/span><span class=\"br0\">]<\/span><span class=\"br0\">&#041;<\/span><span class=\"sy0\">;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"br0\">&#125;<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"br0\">&#125;<\/span>\n\u00a0<span class=\"br0\">&#125;<\/span><\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>Note that we are passing <em>\\Psr\\Log\\LoggerInterface<\/em> in our constructor, as mentioned at the beginning, preference for LoggerInterface is set to Monolog class in di.xml<\/p>\n<p>In some cases it is not necessary to pass logger in constructor as some classes like\u00a0<em> \u201cMagento\\Framework\\View\\Element\\Template\u201d<\/em> and<em> \u201cMagento\\Framework\\Model\\AbstractModel\u201d<\/em> already have <em>$_logger<\/em> property so if you extend one of these classes logger is already available.<\/p>\n<h2>Debug Logging<\/h2>\n<p>By default, Magento writes to the debug log only in default and develop mode, but not in production mode.<\/p>\n<p>To change the default value in default and develop mode following command can be used:<\/p>\n<p>1.\u00a0\u00a0<em>bin\/magento setup:config:set &#8211;enable-debug-logging=true|false<\/em><\/p>\n<p>2.\u00a0<em>bin\/magento cache:flush<\/em><\/p>\n<h2>Database Logging<\/h2>\n<p>Another great Magento 2 functionality is logging database activity. By default, database log is saved in var\/debug\/db.log. Usage of database logging is highly recommended because it allows us to track all database queries and can help us find performance bottlenecks.<\/p>\n<p>Use the following command to enable\/disable database logging:<\/p>\n<p>1.\u00a0 <em>bin\/magento dev:query-log:enable|disable<\/em><\/p>\n<p>2.\u00a0\u00a0<em>bin\/magento cache:flush<\/em><\/p>\n<h2>Cron Logging<\/h2>\n<p>As of Magento 2.3.1 version cron log is more extensive and is now logged in <em>var\/log\/cron.log<\/em> instead of <em>var\/log\/system.log<\/em><\/p>\n<p>These were the basics of Magento 2 logging. Even though Magento 2 uses Monolog logger by default other logging solutions can be used by setting preference for<em> LoggerInterface<\/em> as long as it complies with PSR-3 standard.<\/p>\n<p>There are also many other possibilities when it comes to logging such as creating custom handlers for custom log files, sending emails with log data, sending log records to a Slack account, etc.<\/p>\n<p class=\"p1\"><span class=\"s1\">In case you feel you need some extra help, we can <a href=\"http:\/\/inchoo.net\/services\/technical-audit\/\">offer you a detailed custom report based on our technical audit<\/a> \u2013 feel free to get in touch and see what we can do for you!<\/span><\/p>\n<hr \/>\n<p><strong>Note!<\/strong> This article was revised on Aug 26, 2019. The original article was posted in 2015 by Domagoj Potkoc.<\/p>\n<p>The post <a rel=\"nofollow\" href=\"https:\/\/inchoo.net\/magento-2\/magento-2-logging\/\">Magento 2 logging<\/a> appeared first on <a rel=\"nofollow\" href=\"https:\/\/inchoo.net\">Inchoo<\/a>.<\/p>\n<h1><a target=\"_blank\" href=\"http:\/\/www.circulatetechnology.com\/\">Click here for more informations about top website development services <\/a><\/h1>\n","protected":false},"excerpt":{"rendered":"<p>Logging is an important part of every development process. Logs provide insight into system processes of Magento 2 and are a great tool for tracking errors, significant events, exceptions and many more.\u00a0In order for the logging library to be properly implemented with Magento 2, it must comply with PSR-3 standard. Magento 2 comes with built-in &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[14109,1121,14110,14111,20,14112,257],"tags":[],"class_list":["post-135684","post","type-post","status-publish","format-standard","","category-cron","category-database","category-db-logging","category-logging","category-magento-2","category-monolog","category-programming"],"jetpack_publicize_connections":[],"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p99pkJ-zis","_links":{"self":[{"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/posts\/135684"}],"collection":[{"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/comments?post=135684"}],"version-history":[{"count":0,"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/posts\/135684\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/media?parent=135684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/categories?post=135684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sushilkumar.ind.in\/blog\/wp-json\/wp\/v2\/tags?post=135684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}