intellij IDEA配置scala中使用logback,把日志丢到kafka服务的坑(已经填平)

1) 安装好zookeeper

   cp  zoo_example.cfg  zoo.cfg 

2) 启动zookeeper

    bin/zkServer.sh start

3) 安装kafka_2.11_0.9.0.0

    修改配置 config/server.proxxx

    注意: host.name 与 advertised.host.name 

    如果 在windows连kafka,则尽量要配置这2个参数,不用使用localhost 

   记得关linux的防火墙

   bin/kafka-server-start.sh config/server.properties


   再启动kafka的消费者

   命名的topic为 logs ,可以随便定义,但是要统一即可

   bin/kafka-console-consumer.sh --zookeeper 127.0.0.1:2181 --topic logs --from-beginning

以上三步是在linux环境部署


4) 开发环境为windows

   使用idea 创建 scala的项目

   idea需要安装sbt plugin 与scala plugin的插件

   安装好之后,需要重启一下idea工具

5) 创建项目

   使用idea 创建 scala的sbt项目

   创建完毕之后,会自动生成project与src/main/scala+java+resources文件夹,则说明环境配置正常.

   在project目录下新建一个Build.scala的文件,内容如下(主要是涉及到jar包的管理)   /project/Build.scala

   scala使用的是2.11.7

  

import sbt._
import sbt.Keys._

object Build extends Build {
  scalaVersion := "2.11.7"
  lazy val defaultSettings =
    Defaults.coreDefaultSettings ++
      Seq(
        version := "1.0",
        scalaVersion := "2.11.7",
        scalacOptions := Seq(
          "-feature",
          "-language:implicitConversions",
          "-language:postfixOps",
          "-unchecked",
          "-deprecation",
          "-encoding", "utf8",
          "-Ywarn-adapted-args"
        ),
        libraryDependencies ++= Seq(
        )
      )

  lazy val root = Project("test_log",
    file("."),
    settings = defaultSettings ++ Seq(
      libraryDependencies ++= Seq(
        "org.slf4j" % "slf4j-api" % "1.7.6",
        "ch.qos.logback" % "logback-classic" % "1.1.2", // % "provided",
        "com.github.danielwegener" % "logback-kafka-appender" % "0.1.0"
      ),
      resolvers += "oschina" at "http://maven.oschina.net/content/groups/public/",
      externalResolvers := Resolver.withDefaultResolvers(resolvers.value, mavenCentral = false) //只从这个源,不然他会去国外的源下载,卡的要死.
    )
  )
}

6) 在src/main/scala目录下创建一个test.scala的object

   

package test
import org.slf4j.LoggerFactory

object test {

  def main( args : Array[String]) : Unit = {

    val logger = LoggerFactory.getLogger("LogbackIntegrationIT") //注意这个操蛋的东西,如果没对应上,你会遇到Timeout的问题

    System.out.println("----  " + logger.isDebugEnabled)
      for (i <- 0 to 846 ) {
          System.out.println(i)
          logger.debug("----debug message ")
          logger.error("----error message " + i)
          logger.info("----info message " + i)
      }
  }
}
比如会遇到:

1)  o.apache.kafka.clients.NetworkClient - Error while fetching metadata with correlation id 0 : {logs=L

2)  [kafka-producer-network-thread | producer-1] DEBUG o.apache.kafka.clients.NetworkClient - Initialize connection to node -1 for sending metadata request

    然后提示 6000 Timeout

3)   kafka client org.apache.kafka.common.errors.TimeoutException: Failed to upda

4)  info的日志可以丢到kafka里面,但是debug的却无法,比如

 
  

    


但是如果改成debug,就没反应.

好像有一些,反正很狗血


上面的代码写好之后,然后配置一下logback.xml文件



   
       
           
               %msg
           
       

        logs
        
        

        bootstrap.servers=10.57.137.131:9092

    


        



    
        
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        
    

    
        
    


请注意,代码里面写的是

val logger = LoggerFactory.getLogger("LogbackIntegrationIT") // 后面的参数不能随便乱填,至少目前是这样,也可能是我理解不正确.
                                                                 // 这个参数一定要从xml的logger里面找对应的name,否则debug的信息无法发送给kafka


    这样就能收到debug级别的,注意,这里配置的是

里面的东西,好像root不管用,如果有这方面的文档,请留言提醒一下,感谢.

更多的说明,请查看:  https://github.com/danielwegener/logback-kafka-appender


补充:

kafka的config/server.properties



listeners=PLAINTEXT://:9092


# The port the socket server listens on
#port=9092


# Hostname the broker will bind to. If not set, the server will bind to all interfaces
host.name=centos7  //确保另外的机器能连上


# Hostname the broker will advertise to producers and consumers. If not set, it uses the
# value for "host.name" if configured.  Otherwise, it will use the value returned from
# java.net.InetAddress.getCanonicalHostName().
#advertised.host.name=
advertised.host.name=centos77  //确保另外的机器能连上, 为了的打印日志的时候,看看是打印哪个服务.

以上2个host.name都是指向kafka服务器,尽量设置为一样,确保网络正常.


附加DEMO:

链接


你可能感兴趣的:(编程,scala,intellij,idea,zookeeper)