SCALA 的日志管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013148156/article/details/41951215

        日志对于任何一个正式的项目来说都是必不可少的组成部分,它对于系统问题的定位有着非常重大的意义。另外,它也是用户数据分析挖掘的重要来源。因此,一个好的日志框架对于开发者是至关重要的。熟悉 JAVA 的人都知道 SLF4J,这个框架提供了一组统一的日志接口,屏蔽了各种不同的日志系统具体实现,在 JAVA 领域的影响也越来越大。SCALA 同样也提供一个 SLF4J 的封装模块,同时,SCALA 还在更高层次提供了一个日志抽象模块以更加高效简便地使用日志。另外,对于 AKKA 这个替代了 SCALA 原生 Actor 模块的Actor模型实现模块,它自己也基于 SLF4J 封装了一个日志管理模块,并且以异步事件驱动的方式记录所需日志。通过这段时间对 SCALA 日志系统的学习调研,总结了下这些日志模块的使用,方便以后查阅吧,同时也希望能对初学者有微薄的帮助。

        本文给出的日志方案都是以 Logback 为日志底层实现系统,Logback 是目前比较高效一个日志实现,已经逐渐取代 Log4J 的位置。下面分几种常用场景以简单示例的方式对SCALA中日志的使用进行说明,感觉这些例子已经能够自明了,就不多加文字描述了(这些例子都是可以不用修改直接运行的)。

  • Slf4j + Logback

//--------------build.sbt-------------------


name := "slf4j-logback-pro"


version := "0.1.0-SNAPSHOT"


scalaVersion := "2.11.2"


libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2"


libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.0.4"

下图是SBT update 获取到的类库,包括直接被声明管理的库以及其所依赖的一些库。



//--------------src/main/scala/LogTest.scala--------------

import org.slf4j.LoggerFactory
import com.typesafe.scalalogging.slf4j.Logger


object LogTest extends App {
  val logger = Logger(LoggerFactory.getLogger("name"))
  
  logger.debug("This is very convenient ;-)")
}


  • Scala-logging + Logback

//--------------build.sbt-------------------

name := "scala_logging-logback-pro"


version := "0.1.0-SNAPSHOT"


scalaVersion := "2.11.2"


libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2"


libraryDependencies += "com.typesafe.scala-logging" % "scala-logging_2.11" % "3.1.0"

下图是SBT update 获取到的类库,包括直接被声明管理的库以及其所依赖的一些库。



//--------------src/main/scala/LogTest.scala--------------

import org.slf4j.LoggerFactory
import com.typesafe.scalalogging.Logger


object LogTest extends App {
  val logger = Logger(LoggerFactory.getLogger("name"))
  
  logger.debug("This is very convenient ;-)")
}


  • Akka: Slf4j + Logback

//--------------build.sbt-------------------


name := "akka_slf4j_pro"


version := "0.1.0-SNAPSHOT"


scalaVersion := "2.11.4"


libraryDependencies ++= {
  val akka_version = "2.3.7"
    Seq("com.typesafe.akka" % "akka-actor_2.11" % akka_version,
        "com.typesafe.akka" % "akka-remote_2.11" % akka_version,
        "com.typesafe.akka" % "akka-slf4j_2.11" % akka_version)
}


libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2"


下图是SBT update 获取到的类库,包括直接被声明管理的库以及其所依赖的一些库。




//------------src/main/scala/AkkaClient.scala-------------


import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.Props
import akka.actor.ActorSystem
import akka.routing.RoundRobinRouter
import akka.event.Logging


object AkkaClient extends App {
  sealed trait AkkaTestMsg
  case object Start
  case object Stop
          
  class Client extends Actor {

    val log = Logging(context.system, this)

    def receive = {
      case Start => println("start")
        log.info("good start!")
        self ! Stop
      case Stop => println("stop")
        log.info("good stop!")
        context.system.shutdown
    }
  }
  
  val system = ActorSystem("system")
  val client = system.actorOf(Props[Client], "client")
  val log = Logging(system, client)
                        
  log.info("ok")
  client ! Start
}

//-----------------src/main/resources/application.conf-----------------


akka {
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = "INFO"
}


NOTE: Logback 的配置如下,熟悉的可以直接忽略


//-----------------src/main/resources/logback.xml-----------------


<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="MYCONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <target>System.out</target>
    <encoder>
      <pattern>%X{akkaTimestamp} %-5level[%thread] %logger{0} - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="MYFILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/akka.log</file>
    <append>true</append>
    <encoder>
      <pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="akka" level="INFO" />
    <root level="DEBUG">
      <appender-ref ref="MYCONSOLE"/>
      <appender-ref ref="MYFILE"/>
    </root>

</configuration>




阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页