Scala, как применить функцию в стеке вызывающего - PullRequest
0 голосов
/ 04 октября 2018

Я использую «LazyLogging» и настроил «logback» для печати класса и номера строки оператора print.

Я хочу создать небольшую функцию-обертку в моем коде, которая печатаетнекоторый контекст наряду с обычным сообщением.Но поскольку фактический «вызывающий» из функции log находится внутри этой новой функции-оболочки, я теряю свой класс и номер строки истинного оператора print.

Например:

class Foo(context: Context) extends LazyLogging {
...
...
logger.info("some message") // assume this is line "41"
...
...
}

полученный консольный журнал выглядит следующим образом:

14:40:39 INFO  [Foo:41] some message

Но, скажем, я создаю небольшую оболочку, которая должна печатать «контекст» с каждым оператором журнала:

class Foo(context: Context) extends LazyLogging {
...
...
def logWithContext(msg: String) = logger.info(s"[$context] $msg") // assume this is line 5
...
...
logWithContext("some message") // assume this is line "41"
...
...
logWithContext("a different message") // assume this is line "51"
...
...
}

Но теперь получилась консольвсегда появляется в строке 5

14:40:39 INFO  [Foo:5] some message 
14:40:39 INFO  [Foo:5] a different message 

Я предполагаю, что мне нужно вернуть "не примененную" функцию вызывающей стороне и применить в их контексте (в их строке), или какой-то другой вид макроса (такойкак те, что я сделал бы в старой школе C / C ++ и т. д., фиксируя контекст вызывающей стороны)

1 Ответ

0 голосов
/ 04 октября 2018

Возможно, это не то, что вы ищете, но вход в систему потенциально может спасти вас через несколько громоздких caller{depth}

Я определил Conf Conf Log:

<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} %caller{4} - %msg %n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

и мой код:

import com.typesafe.scalalogging.LazyLogging

object Main extends App with LazyLogging {

  def lg(msg: String) = logger.info("prefix + " + msg)

  lg("1")

  lg("2")

}

и результат:

270  [main] INFO  lg.Main$ Caller+0  at lg.Main$.lg(Main.scala:7)
Caller+1     at lg.Main$.delayedEndpoint$lg$Main$1(Main.scala:9)
Caller+2     at lg.Main$delayedInit$body.apply(Main.scala:5)
Caller+3     at scala.Function0.apply$mcV$sp(Function0.scala:34)
 - prefix + 1 
273  [main] INFO  lg.Main$ Caller+0  at lg.Main$.lg(Main.scala:7)
Caller+1     at lg.Main$.delayedEndpoint$lg$Main$1(Main.scala:11)
Caller+2     at lg.Main$delayedInit$body.apply(Main.scala:5)
Caller+3     at scala.Function0.apply$mcV$sp(Function0.scala:34)
 - prefix + 2 

Main.scala:9 и Main.scala:11 дифференцируют линию вызывающего абонента

...