SlackOps: logging applications into a Slack channel with JavaScript
Tags: programming, tutorial, javascript
Published: 2022-10-09 16:12:11

Here at [Woovi](https://woovi.com/), we manage a lot of logs of our applications in Slack channels. We can know things like:

- For what reason some requests failed;
- Who is the new user, the company, what is the flow that they went, etc;
- Things related to Pix like if someone paid a QR code, withdrawals, some refund, etc;

We care about the data and security of all our users, therefore we sanitize and avoid sending any sensitive data.

All of it is even in our development environments too, local and staging.

## How can I log things into some channels?

Here we create a simple function called `sendtoSlack` where we handle both `@slack/node` and `@slack/webhook` libraries internally.

So we get our webhook request URL created by Slack and put it into an environment variable like: `process.env.SLACK_WEBHOOK`. See here:

```ts
// .env
SLACK_WEBHOOK = 
"https://api.slack.com/messaging/webhooks/<foo>/<bar>";
```

You can see [here](https://api.slack.com/messaging/webhooks) how to create your webhook URL.

---

After you own your URL, we just create an instance from `IncomingWebhook` with this webhook as your `url` argument. For example:

```ts
import { IncomingWebhook } from '@slack/webhook'; 

const wh = new IncomingWebhook(process.env.SLACK_WEBHOOK);
```

Now, we just do a simple conditional validating in which environment you are and get the Slack channel based on it. Like this:

```ts
const getChannel = (channel: string) => {
  const isProduction = process.env.NODE_ENV === 'production';

  if (!isProduction) return `${channel}-dev`;
  
  return channel;
}
```

Then, you can send your message now. Using your `IncomingWebhook` instance, just execute the `send` method.

```ts
const wh = new IncomingWebhook(process.env.SLACK_WEBHOOK);

await wh.send({
  channel: getChannel('<some channel here>'),
  blocks: // your message will go here
});
```

And you will see your messages in your Slack channels! Now, you can abstract it to a function to use it anywhere.

---

The final result will be something like this:

```js
const sendToSlack = async ({
  channel,
  blocks,
}) => {
  const getChannel = (channel: string) => {
    const isProduction = process.env.NODE_ENV === 'production';

    if (!isProduction) return `${channel}-dev`;
  
    return channel;
  }

  try {
    const wh = new IncomingWebhook(process.env.SLACK_WEBHOOK);

    wh.send({
      channel: getChannel(channel),
      blocks,
      // feel free to add any other arguments from this function that fits your needs.
    });
  } catch (err) {
    // do something with the error
    // here, we logged into Sentry
  }
}
```

With that function, you can reuse the logging anywhere on your codebase.

You can reach a similar behavior using another communication tool, like Discord or anything else. Just see how they handle webhooks or things like that.

By the way, if you are curious about what is `blocks`, you can see [here](https://api.slack.com/block-kit) what is the **Block Kit** from Slack. Is just a prettier way to log things.

If you want just simple messages, you can use `attachment` argument from `wh.send`.

---

You can see a simple example of how we log things using the `sendToSlack` function:

```js
sendToSlack({
  channel: 'join',
  attachments: [
    {
      text: 'Invalid recaptcha attempt',
    },
    ...getSomeUsefulData(), // here we get some useful data like timestamp, etc
  ],
});
```

---

[Woovi](https://woovi.com) is a Startup that enables shoppers to pay as they like. To make this possible, Woovi provides instant payment solutions for merchants to accept orders.

Here we do a lot of things with Slack to improve our daily processes, if you are curious about that, [we are hiring](https://woovi.com/jobs)!