Telegram Logger handler

logger_telegram_h is a custom log handler for the Erlang/OTP Logger that forwards log messages to a Telegram chat via the Telegram Bot API.

It allows you to receive errors, warnings, and other important system events in real time directly in Telegram.

ErlangHex Version


๐Ÿ“ฅ Installation

The package can be installed by adding logger_telegram_h to your list of dependencies in rebar.config:

{deps, [logger_telegram_h]}.

โš™๏ธ Configuration

Add the handler to your logger configuration:

Config=#{
    level => all,
    config => #{
      fun_error_send=>fun logger:log/3,%%  Fun(Level, Message, #{domain => [telegram_send_error],telegram_error_msg => Msg,telegram_handler_id => Id })
      telegram_send_param=>#{
                chat_id=><<"@mychat">>
                 %,protect_content=>true
                 %,parse_mode => <<"HTML">>
                 %,message_thread_id
                 %,message_effect_id ..
                %% see req param -> https://hexdocs.pm/telegram_bot_api/telegram_bot_api.html#sendMessage/2
      },
      telegram_pool_options=>#{
            %% see https://hexdocs.pm/telegram_bot_api/telegram_bot_api_sup.html#start_pool/1
            token=><<"1234256789:AAEAAAaAAaVgAAAASSSDDDFFk">> %% Use this token to access the HTTP API, get token @BotFather
      }
    },
     filters => [
      {level, {fun logger_filters:level/2, {stop, neq, error}}},
      {skip_progress_info, {fun logger_filters:progress/2, stop}},
      {ignore_telegram_error_log, {fun logger_filters:domain/2, {stop, sub, [telegram_send_error]}}}
     ],
     formatter =>
            {logger_formatter,#{ 
              single_line => true,
              legacy_header => false,
              chars_limit => 4096,
              max_size => 4096,
              depth => unlimited,
              time_offset => "Z",
              time_designator => $\s,
              template => [time," [",level,"] ",mfa,":",line," ",pid," ",domain," ",msg]
            }
          }
  },
  %%add handler
  ok = logger:add_handler(telegram_handler_1, logger_telegram_h, Config).

Remove the handler to your logger:

  ok=logger:remove_handler(telegram_handler_1).

Set config logger:

  ok=logger:set_handler_config(telegram_handler_1, ConfigNew).

Update config logger:

 ok=logger:update_handler_config(telegram_handler_1,formatter,NewFormater).

๐Ÿš€ Macros Log

-include_lib("kernel/include/logger.hrl").
?LOG_EMERGENCY("example log ~p", [123]).
?LOG_ALERT("example log ~p", [123]).
?LOG_CRITICAL("example log ~p", [123]).
?LOG_ERROR("example log ~p", [123]).
?LOG_WARNING("example log ~p", [123]).
?LOG_NOTICE("example log ~p", [123]).
?LOG_INFO("example log ~p", [123]).
?LOG_DEBUG("example log ~p", [123]).

๐Ÿงช Example

Example config/sys.config:

[
{kernel, [
    {logger_level, all},
    {logger, [
    {handler, default, logger_std_h,
    #{
        level => info,
        filters => [
            {skip_progress_info, {fun logger_filters:progress/2, stop}}
        ]
    }},               
    {handler, telegram_handler_1, logger_telegram_h,
    #{
    level => all,
    config => #{
        fun_error_send=>fun logger:log/3,
        fun_rate_limit=>fun logger_telegram_h:rate_limit/2,
        telegram_send_param=>#{
            chat_id=><<"@mychat">>
        },
        telegram_pool_options=>#{
            token=><<"1111111111:tokenxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">>
        }
        },
        filters => [
            {level, {fun logger_filters:level/2, {stop, neq, error}}},
            {skip_progress_info, {fun logger_filters:progress/2, stop}},
            {ignore_telegram_error_log, {fun logger_filters:domain/2, {stop, sub, [telegram_send_error]}}}
        ],
        formatter =>
            {logger_formatter,#{ 
                single_line => true,
                legacy_header => false,
                chars_limit => 4096,
                max_size => 4096,
                depth => unlimited,
                time_offset => "Z",
                time_designator => $\s,
                template => [time," [",level,"] ",mfa,":",line," ",pid," ",domain," ",msg]
            }
            }

        }
    },
{handler, handler_telegram_send_error, logger_std_h,
    #{
        level => debug,
        config => #{
            file =>"/var/log/telegram_send_error.log"
        },
        filters => [
            {level, {fun logger_filters:level/2, {stop, neq, error}}},
            {skip_progress_info, {fun logger_filters:progress/2, stop}},
            {ignore_telegram_error_log, {fun logger_filters:domain/2, {stop, not_equal, [telegram_send_error]}}}
        ],
        formatter => {
            logger_formatter, #{
            single_line => true,time_offset => "Z",time_designator => $\s,
            template => [time,":",telegram_handler_id,":",telegram_error_msg," send:",msg,"\n"]}}
    }
}
]}
]}
].

๐Ÿ“Œ Other