복붙노트

[SCALA] 스칼라에 로그인

SCALA

스칼라에 로그인

스칼라 응용 프로그램에서 로깅을 할 수있는 좋은 방법은 무엇입니까? 언어 철학과 일치 뭔가 코드를 혼란, 낮은 유지 보수 및 방해하지 않습니다. 다음은 기본적인 요구 사항 목록은 다음과 같습니다

나는 기존의 자바 로깅 솔루션을 사용할 수 있습니다 알고 있지만, 위, 즉 혼란 및 구성 적어도 두에 실패합니다.

귀하의 답변 주셔서 감사합니다.

해결법

  1. ==============================

    1.스칼라의 로깅 라이브러리의 대부분은, 그러나 년 3 월 2015 년 자바 로깅 프레임 워크 (SLF4J, log4j에 등) 주변에 약간의 래퍼왔다, 살아남은 로그 라이브러리는 모든 SLF4J입니다. 이러한 로그 라이브러리는 당신이 정보를 호출 할 수있는에 로그 개체 (...), 디버그 (...) 등 내가 SLF4J의 큰 팬이 아니에요의 일종을 제공하지만, 지금은 주된 로깅 프레임 워크 것 같다 . 여기 SLF4J의 설명입니다 :

    스칼라의 로깅 라이브러리의 대부분은, 그러나 년 3 월 2015 년 자바 로깅 프레임 워크 (SLF4J, log4j에 등) 주변에 약간의 래퍼왔다, 살아남은 로그 라이브러리는 모든 SLF4J입니다. 이러한 로그 라이브러리는 당신이 정보를 호출 할 수있는에 로그 개체 (...), 디버그 (...) 등 내가 SLF4J의 큰 팬이 아니에요의 일종을 제공하지만, 지금은 주된 로깅 프레임 워크 것 같다 . 여기 SLF4J의 설명입니다 :

    배포시에 기본 로그 라이브러리를 변경하는 기능은 당신이 알고 있어야합니다 로거, 전체 SLF4J 제품군에 고유 한 특성에 제공합니다 :

    큰 프로젝트에서 실제로 모든 사람들이 SLF4J를 사용하면 이적 의존성의 로깅 동작을 제어 할 수있는 것이 편리 할 수 ​​있습니다.

    스칼라 로깅 그의 slf4s의 후계자로 HEIKO Seeberger에 의해 작성되었습니다. 이 표현은 잠재적으로 비용이 로그 호출을 피할 수있는 경우에 호출을 확장하기 위해 매크로 사용합니다.

  2. ==============================

    2.스칼라으로 형태 보증에 의해 ScalaLogging을 고려 2.10+. 매우 깨끗한 API를 제공하는 매크로를 사용

    스칼라으로 형태 보증에 의해 ScalaLogging을 고려 2.10+. 매우 깨끗한 API를 제공하는 매크로를 사용

    https://github.com/typesafehub/scala-logging

    자신의 위키에서 인용 :

    logger.debug(s"Some ${expensiveExpression} message!")
    

    매크로가인가 된 후, 코드는 상술 관용구로 변형 된 것이다.

    추가 ScalaLogging 제공에서 편리하게 클래스의 이름으로 초기화 된 로거 인스턴스를 제공하는 특성 로깅에 혼합 :

    import com.typesafe.scalalogging.slf4j.LazyLogging
    
    class MyClass extends LazyLogging {
      logger.debug("This is very convenient ;-)")
    }
    
  3. ==============================

    3.SLF4J를 사용하고 래퍼는 좋은 그러나 그것의 사용은 다음 보간 값의 배열을 만들 필요가 있기 때문에 당신이, 보간에 두 개 이상의 값을 가질 때 아래로 보간 나누기에 내장입니다.

    SLF4J를 사용하고 래퍼는 좋은 그러나 그것의 사용은 다음 보간 값의 배열을 만들 필요가 있기 때문에 당신이, 보간에 두 개 이상의 값을 가질 때 아래로 보간 나누기에 내장입니다.

    솔루션과 같은 더 스칼라는 썽크를 사용하거나 오류 메시지의 연결을 지연 클러스터입니다. 이것의 좋은 예는 리프트의 로거

    Log.scala Slf4jLog.scala

    어느 다음과 같다 :

    class Log4JLogger(val logger: Logger) extends LiftLogger {
      override def trace(msg: => AnyRef) = if (isTraceEnabled) logger.trace(msg)
    }
    

    참고 MSG 통화 별 이름이고 멋진 메시지 열을 생성에는 비용이 없다, 그래서 isTraceEnabled에 해당하지 않는 한 평가되지 않습니다. 이 오류 메시지를 분석 필요 SLF4J의 보간 장치 주위에 작동합니다. 이 모델을 사용하면 오류 메시지에 값의 수를 보간 할 수 있습니다.

    별도의 특성이있는 경우 믹스 클래스에이 Log4JLogger은, 당신은 할 수있는

    trace("The foobar from " + a + " doesn't match the foobar from " +
          b + " and you should reset the baz from " + c")
    

    대신에

    info("The foobar from {0} doesn't match the foobar from {1} and you should reset the baz from {c},
         Array(a, b, c))
    
  4. ==============================

    4.사실 유진의 추천을 따라 그것을 시도하고 서투른 구성을 가지고 있으며 (예 :이 하나) 고정되지 않는 버그에 노출되는 것을 발견했습니다. 그것은 잘 유지 될 보지 않고는 스칼라 2.10 지원하지 않습니다.

    사실 유진의 추천을 따라 그것을 시도하고 서투른 구성을 가지고 있으며 (예 :이 하나) 고정되지 않는 버그에 노출되는 것을 발견했습니다. 그것은 잘 유지 될 보지 않고는 스칼라 2.10 지원하지 않습니다.

    다음은 메이븐으로 실행해야 할 것입니다 :

    <dependency>
      <groupId>com.weiglewilczek.slf4s</groupId>
      <artifactId>slf4s_2.9.1</artifactId>
      <version>1.0.7</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.6.6</version>
    </dependency>
    
  5. ==============================

    5.이것은 내가 나를 위해 스칼라 로깅 작업을 가지고하는 방법입니다 :

    이것은 내가 나를 위해 스칼라 로깅 작업을 가지고하는 방법입니다 :

    당신의 build.sbt이 넣어 :

    libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.7.2",
    libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3"
    

    그 후, SBT 갱신을 수행 한 후, 친절한 로그 메시지 출력이 인쇄 :

    import com.typesafe.scalalogging._
    object MyApp extends App with LazyLogging {
      logger.info("Hello there")
    }
    

    당신이 플레이를 사용하는 경우, 당신은 물론 단순히 로그 메시지를 작성하기위한 play.api.Logger를 가져올 수 있습니다 Logger.debug ( "안녕하세요").

    추가 정보를 원하시면 해당 문서를 참조하십시오.

  6. ==============================

    6.나는 작업 형식의 비트를 scalax의 로깅 특성을 뽑아, 또한 MessageFormat의 기반 라이브러리를 통합하는 특성을 만들었습니다.

    나는 작업 형식의 비트를 scalax의 로깅 특성을 뽑아, 또한 MessageFormat의 기반 라이브러리를 통합하는 특성을 만들었습니다.

    그렇다면이 같은 외모 종류의 물건 :

    class Foo extends Loggable {
        info( "Dude, I'm an {0} with {1,number,#}", "Log message", 1234 )
    }
    

    우리는 지금까지 접근 방식을 좋아한다.

    이행:

    trait Loggable {
    
        val logger:Logger = Logging.getLogger(this)
    
        def checkFormat(msg:String, refs:Seq[Any]):String =
            if (refs.size > 0) msgfmtSeq(msg, refs) else msg 
    
        def trace(msg:String, refs:Any*) = logger trace checkFormat(msg, refs)
    
        def trace(t:Throwable, msg:String, refs:Any*) = logger trace (checkFormat(msg, refs), t)
    
        def info(msg:String, refs:Any*) = logger info checkFormat(msg, refs)
    
        def info(t:Throwable, msg:String, refs:Any*) = logger info (checkFormat(msg, refs), t)
    
        def warn(msg:String, refs:Any*) = logger warn checkFormat(msg, refs)
    
        def warn(t:Throwable, msg:String, refs:Any*) = logger warn (checkFormat(msg, refs), t)
    
        def critical(msg:String, refs:Any*) = logger error checkFormat(msg, refs)
    
        def critical(t:Throwable, msg:String, refs:Any*) = logger error (checkFormat(msg, refs), t)
    
    }
    
    /**
     * Note: implementation taken from scalax.logging API
     */
    object Logging {  
    
        def loggerNameForClass(className: String) = {  
            if (className endsWith "$") className.substring(0, className.length - 1)  
            else className  
        }  
    
        def getLogger(logging: AnyRef) = LoggerFactory.getLogger(loggerNameForClass(logging.getClass.getName))  
    }
    
  7. ==============================

    7.나는 SLF4J + Logback 고전 사용하고 다음과 같이 적용 :

    나는 SLF4J + Logback 고전 사용하고 다음과 같이 적용 :

    trait Logging {
      lazy val logger = LoggerFactory.getLogger(getClass)
    
      implicit def logging2Logger(anything: Logging): Logger = anything.logger
    }
    

    그런 다음 당신은 당신의 스타일을 더 잘 맞는 중 사용할 수 있습니다 :

    class X with Logging {
        logger.debug("foo")
        debug("bar")
    }
    

    그러나 물론이 방법은 클래스 인스턴스 당 로거 인스턴스를 사용합니다.

  8. ==============================

    8.당신은 scalax 라이브러리를 살펴 있어야한다 : http://scalax.scalaforge.org/ 이 라이브러리에서 백엔드로 sl4j를 사용하여 로깅 특성이있다. 이 특성을 사용하여, 당신은 아주 쉽게 로그인 할 수 있습니다 (다만 로거 필드를 사용하여 클래스 단위) 특성을 상속.

    당신은 scalax 라이브러리를 살펴 있어야한다 : http://scalax.scalaforge.org/ 이 라이브러리에서 백엔드로 sl4j를 사용하여 로깅 특성이있다. 이 특성을 사용하여, 당신은 아주 쉽게 로그인 할 수 있습니다 (다만 로거 필드를 사용하여 클래스 단위) 특성을 상속.

  9. ==============================

    9.작가, 모노 이드와 모나드의 구현입니다.

    작가, 모노 이드와 모나드의 구현입니다.

  10. ==============================

    10.아직 그것을 시도했지만 Configgy의 외모 구성 및 로깅 모두 약속하지 않았 :

    아직 그것을 시도했지만 Configgy의 외모 구성 및 로깅 모두 약속하지 않았 :

    http://github.com/robey/configgy/tree/master

  11. ==============================

    11.잠시 동안 slf4s 및 logula을 사용한 후, 나는 loglady 간단한 로깅 특성 포장 SLF4J를 썼다.

    잠시 동안 slf4s 및 logula을 사용한 후, 나는 loglady 간단한 로깅 특성 포장 SLF4J를 썼다.

    그것은 일반적인 사소한 경우 (기본 문자열, 간단한 서식) 및 보일러 포맷을 피하게 파이썬의 로깅 라이브러리와 유사한 API를 제공합니다.

    http://github.com/dln/loglady/

  12. ==============================

    12.나는 나에게 같은 구문을 제공하는 간단한 스칼라 래퍼, 자바 로거, 예를 들어 sl4j의 어떤 종류를 사용하여 매우 편리 찾기

    나는 나에게 같은 구문을 제공하는 간단한 스칼라 래퍼, 자바 로거, 예를 들어 sl4j의 어떤 종류를 사용하여 매우 편리 찾기

    val #! = new Logger(..) // somewhere deep in dsl.logging.
    
    object User with dsl.logging {
    
      #! ! "info message"
      #! dbg "debug message"
      #! trace "var a=true"
    
    }
    

    자바 검증 된 로깅 프레임 워크와 스칼라의 화려한 구문 내 의견에 매우 유용 믹스 인.

  13. ==============================

    13.빠르고 쉬운 형태.

    빠르고 쉬운 형태.

    스칼라 2.10 이상 :

    import com.typesafe.scalalogging.slf4j.Logger
    import org.slf4j.LoggerFactory
    val logger = Logger(LoggerFactory.getLogger("TheLoggerName"))
    logger.debug("Useful message....")
    

    그리고 build.sbt :

    libraryDependencies += "com.typesafe" %% "scalalogging-slf4j" % "1.1.0"
    

    스칼라 2.11+ 및 최신 :

    import import com.typesafe.scalalogging.Logger
    import org.slf4j.LoggerFactory
    val logger = Logger(LoggerFactory.getLogger("TheLoggerName"))
    logger.debug("Useful message....")
    

    그리고 build.sbt :

    libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.1.0"
    
  14. from https://stackoverflow.com/questions/978252/logging-in-scala by cc-by-sa and MIT license