README.md

# LoggerTelegramBackend

[![Build Status](https://github.com/adriankumpf/logger-telegram-backend/workflows/CI/badge.svg)](https://github.com/adriankumpf/logger-telegram-backend/actions)
[![Docs](https://img.shields.io/badge/hex-docs-green.svg?style=flat)](https://hexdocs.pm/logger_telegram_backend)
[![Hex.pm](https://img.shields.io/hexpm/v/logger_telegram_backend?color=%23714a94)](http://hex.pm/packages/logger_telegram_backend)

<!-- MDOC !-->

A logger backend for [Telegram](https://telegram.org/).

## Installation

Add `:logger_telegram_backend` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:logger_telegram_backend, "~> 3.0"},
    {:logger_backends, "~> 1.0"},
    {:hackney, "~> 1.18"},
  ]
end
```

In your `c:Application.start/2` callback, add the `LoggerTelegramBackend` backend:

```elixir
@impl true
def start(_type, _args) do
  LoggerBackends.add(LoggerTelegramBackend)

  # ...
end
```

## Configuration

First of all you need to create a [Telegram bot](https://core.telegram.org/bots). Follow the [instructions here](https://core.telegram.org/bots#6-botfather) to create one and get the `token` for the bot. Since bots are not allowed to contact users, you need to send a message first. Afterwards, retrieve your `chat_id` with `$ curl -X GET https://api.telegram.org/botYOUR_TOKEN/getUpdates`.

Then configure the telegram `chat_id` and bot `token`:

```elixir
config :logger, LoggerTelegramBackend,
  chat_id: "$chatId",
  token: "$botToken"
```

### Options

The following options are available:

- `:level` - the level to be logged by this backend (either `:debug`, `:info`, `:warning` or `:error`).

  Note that messages are filtered by the general `:level` configuration for the `:logger` application first.

  Default: `nil` (all levels are logged)

- `:metadata` - the metadata to be included in the telegram message. Setting `:metadata` to `:all` gets all metadata.

  Default: `[:line, :function, :module, :application, :file]`.

- `:metadata_filter` - the metadata which is required in order for a message to be logged.

  Default: `nil`

- `:client` - If you need different functionality for the HTTP client, you can define your own module that implements the `LoggerTelegramBackend.HTTPClient` behaviour and set `client` to that module

  Default: `LoggerTelegramBackend.HackneyClient`

- `:hackney_opts`

  Default: `[pool: :logger_telegram_backend_pool]`

- `:hackney_pool_max_connections`

  Default: `50`

- `:hackney_pool_timeout`

  Default: `5000`

### Examples

#### Finch client

1. Add Finch instead of `:hackney` to your list of dependencies:

   ```elixir
    {:finch, "~> 0.16"}
   ```

2. Add a module that implements the `LoggerTelegramBackend.HTTPClient` behaviour:

   ```elixir
   defmodule MyFinchClient do
     @behaviour LoggerTelegramBackend.HTTPClient

     @finch_pool_name MyApp.Finch

     @impl true
     def child_spec do
       Finch.child_spec(name: @finch_pool_name)
     end

     @impl true
     def request(method, url, headers, body) do
       req = Finch.build(method, url, headers, body)

       case Finch.request(req, @finch_pool_name) do
         {:ok, %Finch.Response{status: status, headers: headers, body: body}} ->
           {:ok, status, headers, body}

         {:error, reason} ->
           {:error, reason}
       end
     end
   end
   ```

3. Pass your client module to the `:client` option:

   ```elixir
   config :logger, LoggerTelegramBackend,
     client: MyFinchClient,
     # ...
   ```

#### Metadata filter

```elixir
config :logger, LoggerTelegramBackend,
  chat_id: "$chatId",
  token: "$botToken",
  level: :info,
  metadata: :all
  metadata_filter: [application: :ui]
```

#### SOCKS5 proxy

```elixir
config :logger, LoggerTelegramBackend,
  chat_id: "$chatId",
  token: "$botToken",
  hackney_opts: [
    ssl: [verify: :verify_none],
    hackney: [insecure: true],
    proxy: {:socks5, ~c"127.0.0.1", 9050}
  ]
```

See the [hackney docs](https://github.com/benoitc/hackney#proxy-a-connection) for further information.