<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Plabon Kumar saha</title>
    <description>The latest articles on DEV Community by Plabon Kumar saha (@plabonkumarsaha).</description>
    <link>https://dev.to/plabonkumarsaha</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1239982%2F0a2f12ae-cb6d-465d-9443-ed415933362c.jpeg</url>
      <title>DEV Community: Plabon Kumar saha</title>
      <link>https://dev.to/plabonkumarsaha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/plabonkumarsaha"/>
    <language>en</language>
    <item>
      <title>Resend: sending email for beginners got even easier</title>
      <dc:creator>Plabon Kumar saha</dc:creator>
      <pubDate>Sun, 24 Mar 2024 05:08:39 +0000</pubDate>
      <link>https://dev.to/plabonkumarsaha/resend-sending-email-for-beginners-got-even-easier-3l</link>
      <guid>https://dev.to/plabonkumarsaha/resend-sending-email-for-beginners-got-even-easier-3l</guid>
      <description>&lt;p&gt;we have always been using Sendgrid for configuring and sending emails. But I found an even easier solution. Literally within some lines of code, you’ll be able to set up emails. In this discussion, I’ll showcase how it is better than Sendgrid and how can you easily set it up in your code.&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is it better?
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Modern simpler functionality and easy to use.&lt;/li&gt;
&lt;li&gt;Pricing is compromised (even though the SendGrid fee tire has a larger capacity)&lt;/li&gt;
&lt;li&gt;Simpler analytics&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  now let’s learn how to implement it in node js.
&lt;/h2&gt;

&lt;p&gt;1.Go to &lt;a href="https://resend.com/overview"&gt;Resend &lt;/a&gt;Website and register. You’ll get a page like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ttptwuj9wsrd0jfb0r0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ttptwuj9wsrd0jfb0r0.png" alt="Image description" width="684" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Now add a domain and add the configure value in your DNS record.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsh4qu38aai15dlzbjfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsh4qu38aai15dlzbjfl.png" alt="Image description" width="683" height="331"&gt;&lt;/a&gt;&lt;br&gt;
now you’ll be able to use your domain name’s email as the sender email such as contact@domain.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Now add them to your node project
add dependency
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm add resend

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then add your RESEND_KEY in your env file. During calling the function call it like the following. You’ll get the key from API Keys sub-section.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Resend } from "resend";
app.get("/send-email", async (req: Request, res: Response) =&amp;gt; {
htmlScript="&amp;lt;strong&amp;gt;it works!&amp;lt;/strong&amp;gt;";
  const resend = new Resend(process.env.RESEND_KEY);
  const { data, error } = await resend.emails.send({
   from: process.env.SEND_EMAIL,
   to: ['receiver@gmail.com'],
   subject: "Testing Resend email platform",
   html: htmlScript,
    });
  if (error) {
    return res.status(400).json({ error });
  }

  res.status(200).json({ data });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And would you believe it! This is done. Now each time your endpoint is called you’ll get logs like the following.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vs26e5u6hqy3op93cqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vs26e5u6hqy3op93cqc.png" alt="Image description" width="680" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa75qhothn1gepr0qbgfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa75qhothn1gepr0qbgfn.png" alt="Image description" width="679" height="242"&gt;&lt;/a&gt;&lt;br&gt;
I hope this is helpful to you. Happy implementing.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Log4j2 in Spring boot</title>
      <dc:creator>Plabon Kumar saha</dc:creator>
      <pubDate>Mon, 22 Jan 2024 05:02:27 +0000</pubDate>
      <link>https://dev.to/plabonkumarsaha/log4j2-in-spring-boot-4gp4</link>
      <guid>https://dev.to/plabonkumarsaha/log4j2-in-spring-boot-4gp4</guid>
      <description>&lt;p&gt;In the dynamic world of fintech, where thousands of transactions per hour demand seamless operations, backend engineers play a pivotal role in ensuring systems' high availability and reliability. One indispensable tool in their arsenal is comprehensive logging, which serves as the backbone for identifying, troubleshooting, and optimizing critical financial applications. Detailed logs can help trace the execution flow, pinpoint errors, and understand the context of unexpected behaviors. Not only do these logs help to monitor performance, auditing system health checks. Thus I was tasked to implement log4j. The implementation details are below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependency&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
   &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
   &amp;lt;exclusions&amp;gt;
    &amp;lt;exclusion&amp;gt;
     &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;spring-boot-starter-logging&amp;lt;/artifactId&amp;gt;
    &amp;lt;/exclusion&amp;gt;
   &amp;lt;/exclusions&amp;gt;
  &amp;lt;/dependency&amp;gt;

   &amp;lt;dependency&amp;gt;
   &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;spring-boot-starter-log4j2&amp;lt;/artifactId&amp;gt;
   &amp;lt;version&amp;gt;2.5.5&amp;lt;/version&amp;gt;
  &amp;lt;/dependency&amp;gt;

  &amp;lt;dependency&amp;gt;
   &amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;log4j-layout-template-json&amp;lt;/artifactId&amp;gt;
   &amp;lt;version&amp;gt;2.14.1&amp;lt;/version&amp;gt;
  &amp;lt;/dependency&amp;gt;
  &amp;lt;dependency&amp;gt;
   &amp;lt;groupId&amp;gt;net.logstash.logback&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;logstash-logback-encoder&amp;lt;/artifactId&amp;gt;
   &amp;lt;version&amp;gt;6.6&amp;lt;/version&amp;gt;
  &amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Usage of logs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LoggerFactory.getLogger(getClass()).info(message);
LoggerFactory.getLogger(getClass()).debug(message);
LoggerFactory.getLogger(getClass()).error(message);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;Add an XML file named logback.xml like below&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;appender name="jsonConsoleAppender" class="ch.qos.logback.core.ConsoleAppender"&amp;gt;
        &amp;lt;encoder class="net.logstash.logback.encoder.LogstashEncoder"/&amp;gt;
    &amp;lt;/appender&amp;gt;
    &amp;lt;appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"&amp;gt;
        &amp;lt;encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"&amp;gt;
            &amp;lt;providers&amp;gt;
                &amp;lt;timestamp/&amp;gt;
                &amp;lt;pattern&amp;gt;
                    &amp;lt;pattern&amp;gt;
                        {
                        "level": "%level",
                        "logger": "%logger",
                        "message": "%message"
                        }
                    &amp;lt;/pattern&amp;gt;
                &amp;lt;/pattern&amp;gt;
            &amp;lt;/providers&amp;gt;
        &amp;lt;/encoder&amp;gt;

        &amp;lt;rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"&amp;gt;
            &amp;lt;fileNamePattern&amp;gt;ms-identity-%d{yyyy-MM-dd}.%i.log&amp;lt;/fileNamePattern&amp;gt;
            &amp;lt;maxFileSize&amp;gt;1GB&amp;lt;/maxFileSize&amp;gt;
            &amp;lt;cleanHistoryOnStart&amp;gt;false&amp;lt;/cleanHistoryOnStart&amp;gt;
        &amp;lt;/rollingPolicy&amp;gt;
    &amp;lt;/appender&amp;gt;


    &amp;lt;root level="INFO"&amp;gt;
        &amp;lt;appender-ref ref="jsonConsoleAppender"/&amp;gt;
        &amp;lt;appender-ref ref="RollingFile" /&amp;gt;

    &amp;lt;/root&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;If you want to store logs in files.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"&amp;gt;
        &amp;lt;encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"&amp;gt;
            &amp;lt;providers&amp;gt;
                &amp;lt;timestamp/&amp;gt;
                &amp;lt;pattern&amp;gt;
                    &amp;lt;pattern&amp;gt;
                        {
                        "level": "%level",
                        "logger": "%logger",
                        "message": "%message"
                        }
                    &amp;lt;/pattern&amp;gt;
                &amp;lt;/pattern&amp;gt;
            &amp;lt;/providers&amp;gt;
        &amp;lt;/encoder&amp;gt;

        &amp;lt;rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"&amp;gt;
            &amp;lt;fileNamePattern&amp;gt;application-name-%d{yyyy-MM-dd}.%i.log&amp;lt;/fileNamePattern&amp;gt;
            &amp;lt;maxFileSize&amp;gt;1GB&amp;lt;/maxFileSize&amp;gt;
            &amp;lt;cleanHistoryOnStart&amp;gt;false&amp;lt;/cleanHistoryOnStart&amp;gt;
        &amp;lt;/rollingPolicy&amp;gt;
    &amp;lt;/appender&amp;gt;

    &amp;lt;root level="INFO"&amp;gt;
        &amp;lt;appender-ref ref="RollingFile" /&amp;gt;
    &amp;lt;/root&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;Store logs in DB&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   CREATE TABLE `logging` (
  `EVENT_ID` int(11) NOT NULL AUTO_INCREMENT,
  `EVENT_DATE` datetime DEFAULT NULL,
  `LEVEL` varchar(45) DEFAULT NULL,
  `LOGGER` varchar(45) DEFAULT NULL,
  `MSG` varchar(45) DEFAULT NULL,
  `THROWABLE` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`EVENT_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;Configuration&amp;gt;
 &amp;lt;Appenders&amp;gt;
  &amp;lt;Console name="Console" target="SYSTEM_OUT"&amp;gt;
   &amp;lt;PatternLayout
    pattern="%d{HH:mm:ss.SSS} $${env:JournalDevVar} $${env:JournalDevSecondVar} [%t] %-5level %logger{36} - %msg%n" /&amp;gt;
  &amp;lt;/Console&amp;gt;
  &amp;lt;JDBC name="databaseAppender" tableName="journaldev.logging"&amp;gt;
   &amp;lt;DataSource jndiName="java:/comp/env/jdbc/JournalDevDB" /&amp;gt;
   &amp;lt;Column name="EVENT_DATE" isEventTimestamp="true" /&amp;gt;
   &amp;lt;Column name="LEVEL" pattern="%level" /&amp;gt;
   &amp;lt;Column name="LOGGER" pattern="%logger" /&amp;gt;
   &amp;lt;Column name="MSG" pattern="%message" /&amp;gt;
   &amp;lt;Column name="THROWABLE" pattern="%ex{full}" /&amp;gt;
  &amp;lt;/JDBC&amp;gt;
 &amp;lt;/Appenders&amp;gt;
 &amp;lt;Loggers&amp;gt;
  &amp;lt;Root level="ERROR"&amp;gt;
   &amp;lt;AppenderRef ref="Console" /&amp;gt;
  &amp;lt;/Root&amp;gt;
  &amp;lt;logger name="com" level="TRACE" additivity="false"&amp;gt;
   &amp;lt;AppenderRef ref="databaseAppender" /&amp;gt;
  &amp;lt;/logger&amp;gt;
  &amp;lt;logger name="com.journaldev" additivity="false"&amp;gt;
   &amp;lt;AppenderRef ref="databaseAppender" /&amp;gt;
  &amp;lt;/logger&amp;gt;
 &amp;lt;/Loggers&amp;gt;
&amp;lt;/Configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>springboot</category>
      <category>debugging</category>
      <category>security</category>
    </item>
  </channel>
</rss>
