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:
链接