Docker中java logback 项目 向 EFK 写入日志

继续上篇文章java logback 向 EFK 写入日志, 此篇文章主要讲述在docker环境下EFK与logback的整合,主要解决java项目在docker环境下,向EFK输出日志的问题:

  1. 上篇文章中的方法虽然可以向EFK写入日志,但是在集群环境中,无法区分容器,除非自己在日志的msg中写入相关信息,然而往往会被分词器分开,这点比较麻烦
  2. 虽然上篇文章中的logback-more-appenders可以使用DataFluentAppender方式来向elasticsearch添加额外的fields,但是这里也同时存在一个问题,就是msg中的部分信息,会被拆分成多个field,导致msg信息不再完整,以及从kibana上面查看日志非常不便

下面来一起看看我是如何解决的(部分内容跟上篇文章同)

部署一套EFK

详情参考部署文档CentOS7 安装EFK(elasticsearch、fluent、kibana)进行Docker下日志搜集

打包日志插件(此处有不同)

源码地址:fluentd-logback-appender(此插件是我基于logback-more-appenders源码进行的改进,使得在使用FluentLogbackAppender类的时候,也可以添加额外的fields)

关于此插件的打包,这里不多做说明,相应jar包可以在刘迎光的nexus中找到,搜索“fluentd-logback-appender”即可

项目引用

pom.xml文件添加依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0modelVersion>
	<groupId>com.firewarmgroupId>
	<artifactId>testLogback4FluentdartifactId>
	<packaging>warpackaging>
	<version>0.0.1-SNAPSHOTversion>
	<name>testLogback4Fluentd Maven Webappname>
	<url>http://maven.apache.orgurl>
	<properties>
		<jetty.version>8.1.10.v20130312jetty.version>
		<fluentd.logger.version>0.3.2fluentd.logger.version>
	properties>
	<dependencies>
		
		<dependency>
			<groupId>ch.qos.logbackgroupId>
			<artifactId>logback-classicartifactId>
			<version>1.1.7version>
		dependency>
		<dependency>
			<groupId>ch.qos.logbackgroupId>
			<artifactId>logback-coreartifactId>
			<version>1.1.7version>
		dependency>
		<dependency>
			<groupId>com.firewarmgroupId>
			<artifactId>fluentd-logback-appenderartifactId>
			<version>0.0.1-SNAPSHOTversion>
		dependency>
		<dependency>
			<groupId>org.fluentdgroupId>
			<artifactId>fluent-loggerartifactId>
			<version>${fluentd.logger.version}version>
			<optional>trueoptional>
		dependency>
		
	dependencies>
	<build>
		<finalName>testLogback4FluentdfinalName>
	build>
project>

配置logback-test.xml文件


<configuration>
	<appender name="FLUENT_TEXT"
		class="com.firewarm.fluentd_logback_appender.FluentLogbackAppender">
		
		<tag>${app.name}tag>
		
		<label>logbacklabel>
		
		<remoteHost>${fluentd_host}remoteHost>
		<port>${fluentd_port}port>
		
		<maxQueueSize>999maxQueueSize>

		<additionalField>
			<key>container_idkey>
			<value>${hostname}value>
		additionalField>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<pattern>%date [%thread] %-5level %logger{80}- %msg%npattern>
			
		layout>
	appender>

	<logger name="com.firewarm" level="trace">
		<appender-ref ref="FLUENT_TEXT" />
	logger>
	<root level="trace">
		<appender-ref ref="trace" />
	root>
configuration>

这里有话说:

  1. 为了方便使用,这里的app.name、fluentd_host、fluentd_port、hostname全以环境变量方式配置(这里不多讲了,我在windows中配置了环境变量,做测试)
  2. 这里的hostname在docker应用中,如果没有指定hostname的情况下(并且也没必要指定,因为在实现scale的时候,这个hostname指定就没有什么实际意义了),默认是container_id

实测结果

这里就拿写入错误栈来看

# 源json串

{
  "_index": "testlogback-2016.10.25",
  "_type": "fluentd",
  "_id": "AVbuZYUTOf1yFl8aApQh",
  "_score": null,
  "_source": {
    "msg": "2016-10-25 09:51:12,090 [main] ERROR com.firewarm.test.TestLog- -->> Exception\r\njava.lang.NullPointerException: null\r\n\tat com.firewarm.test.TestLog.log(TestLog.java:23)\r\n\tat com.firewarm.test.TestLog.main(TestLog.java:16)\r\n",
    "container_id": "testLog1",
    "@timestamp": "2016-10-25T09:51:12+08:00"
  },
  "fields": {
    "@timestamp": [
      1477360272000
    ]
  },
  "sort": [
    1477360272000
  ]
}

显示结果如图所示(我们想要的都有了) 

在kibana的搜索中,只需要填写“container_id:testLog1”,即可搜索到相关的日志了

如此,即完成了测试

你可能感兴趣的:(日志管理)