10
2621

Log::Any и аргументы

klopp
2016-01-23 15:21

Правильно ли я понимаю, что в Log::Any нет никаких шансов обрабатывать несколько аргументов, кроме как в sprintf-методах?

Точнее: есть аппендер для Log4perl, который умеет такое: $logger->info( $c, $d, $e ); Примерно как в Log::Log4perl::Appender::DBI.

Первые попытки прикрутить его в качестве адаптера к Log::Any ничем хорошим пока не заканчиваются - внутри Log::Any::Proxy аргументы безусловно джойнятся и вся красота пропадает.

  • ivanych
    2016-01-27 14:13 #

    В адаптер (Вы же "аппендером" называете именно адаптер?) всегда передается строка. Поэтому искать готовый адаптер, который будет каким-либо образом форматировать параметры, бесполезно - таких не бывает и быть не может.

    Но, в Log::Any::Proxy можно задать свой formatter, вместо дефолтного sprintf:

    use Log::Any '$log', formatter => sub { my ($cat, $lvl, @args) = @_; функциядлякрасивого_вывода( @args ); };

    Но это придется руками делать, для каждого пакета, где вызывается логирование.

    Я лично форматирование делаю сам, а в лог отправляю уже готовую строку. Типа того:

    $log->info( функциядлякрасивого_вывода($c, $d, $e) );

    или CTRL+Enter формат
    • ivanychivanych
      2016-01-27 14:16 #

      Оффтопик:

      Парни, парсер форума съедает подчеркивания. В комментарии выше строка " функциядлякрасивого" должна быть с подчеркиваниями.

      Хорошо бы поправить.

      или CTRL+Enter формат
      • ivanychivanych
        2016-01-27 14:23 #

        Видимо, предполагается, что если что-то не размечено как код, то подчеркивания превращаются в курсив... Но в середине слова так делать не надо бы. Перл же, подчеркивания встречаются на каждом шагу:)

        или CTRL+Enter формат
        • kloppivanych
          2016-01-27 14:32 #

          Можно размечать не как блок кода, а как одну строку, просто обратными кавычками:

          `use Log::Any '$log', formatter => sub { my ($cat, $lvl, @args) = @_; функция_для_красивого_вывода( @args ); };`

          или CTRL+Enter формат
    • kloppivanych
      2016-01-27 14:28 #

      > В адаптер (Вы же "аппендером" называете именно адаптер?)

      Log::Log4perl::Appender::*

      >всегда передается строка.

      Нет, если:

      log4perl.appender.MYAPP.layout  = NoopLayout
      log4perl.appender.MYAPP.warp_message = 0

      Тогда будет передаваться массив аргументов as is (не зря я для примера привёл Log::Log4perl::Appender::DBI. Именно так он и работает, не склеивая аргументы). К сожалению, Log::Any игнорирует эти настройки, о чём, собственно, и вопрос.

      Как подменять sprintf-методы понятно, но хотелось бы добиться подобного и с обычными методами. Ибо менять во всём проекте info() на infof() etc пока не хочется.

      В принципе вариант с функцией предварительного форматирования самый простой, да :) Но - опять же, рефакторить кучу кода...

      или CTRL+Enter формат
Чтобы ответить, залогиньтесь или зарегистрируйтесь.
  • @user
  • _italic_

    italic

  • **bold**

    bold

  • [PP](http://pragmaticperl.com)

    PP

  • <http://pragmaticperl.com>

    http://pragmaticperl.com

  • module:Plack

    Plack

  • release:URI

    URI

  • author:VTI

    VTI

  • `my $foo = 'bar'`
  • ```
    my $multi;
    $line;
    ```