Lighting@刘迎光
相信了,才有可能遇见,不相信,也许只会是擦肩而过!
Toggle navigation
Lighting@刘迎光
首页
IT技术
微服务(IT)
技术问答
OpenBI
读书笔记
公众号【今日脑图】
关于我
自媒体
归档
标签
Docker中java logback 项目 向 EFK 写入日志
Docker
java
logback
EFK
2017-05-26 13:02:56
1145
lightingfire
Docker
java
logback
EFK
继续上篇文章[java logback 向 EFK 写入日志](http://blog.liuyingguang.cn/blog/post/lightingfire/8c0a2f48274f), 此篇文章主要讲述在docker环境下EFK与logback的整合,主要解决java项目在docker环境下,向EFK输出日志的问题: 1. 上篇文章中的方法虽然可以向EFK写入日志,但是在集群环境中,无法区分容器,除非自己在日志的msg中写入相关信息,然而往往会被分词器分开,这点比较麻烦 2. 虽然上篇文章中的[logback-more-appenders](https://github.com/sndyuk/logback-more-appenders.git)可以使用DataFluentAppender方式来向elasticsearch添加额外的fields,但是这里也同时存在一个问题,就是msg中的部分信息,会被拆分成多个field,导致msg信息不再完整,以及从kibana上面查看日志非常不便 下面来一起看看我是如何解决的(部分内容跟上篇文章同) ### 部署一套EFK 详情参考部署文档[CentOS7 安装EFK(elasticsearch、fluent、kibana)进行Docker下日志搜集](http://blog.csdn.net/gsying1474/article/details/52426366) ### 打包日志插件(此处有不同) 源码地址:[fluentd-logback-appender](https://github.com/lightingLYG/fluentd-logback-appender)(此插件是我基于logback-more-appenders源码进行的改进,使得在使用FluentLogbackAppender类的时候,也可以添加额外的fields) 关于此插件的打包,这里不多做说明,相应jar包可以在[刘迎光的nexus](http://app.firewarm.com:8088/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.0</modelVersion> <groupId>com.firewarm</groupId> <artifactId>testLogback4Fluentd</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>testLogback4Fluentd Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <jetty.version>8.1.10.v20130312</jetty.version> <fluentd.logger.version>0.3.2</fluentd.logger.version> </properties> <dependencies> <!-- logback 配置 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.7</version> </dependency> <dependency> <groupId>com.firewarm</groupId> <artifactId>fluentd-logback-appender</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.fluentd</groupId> <artifactId>fluent-logger</artifactId> <version>${fluentd.logger.version}</version> <optional>true</optional> </dependency> <!-- logback 配置, end --> </dependencies> <build> <finalName>testLogback4Fluentd</finalName> </build> </project> ``` 配置logback-test.xml文件 ``` <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="FLUENT_TEXT" class="com.firewarm.fluentd_logback_appender.FluentLogbackAppender"> <!-- Tag for Fluentd. Farther information: http://docs.fluentd.org/articles/config-file --> <tag>${app.name}</tag> <!-- [Optional] Label for Fluentd. Farther information: http://docs.fluentd.org/articles/config-file --> <label>logback</label> <!-- Host name/address and port number which Flentd placed --> <remoteHost>${fluentd_host}</remoteHost> <port>${fluentd_port}</port><!-- ${fluentd_port} --> <!-- Max queue size of logs which is waiting to be sent (When it reach to the max size, the log will be disappeared). --> <maxQueueSize>999</maxQueueSize> <additionalField> <key>container_id</key> <value>${hostname}</value> </additionalField> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80}- %msg%n</pattern> <!-- <pattern><![CDATA[%date{HH:mm:ss.SSS} [%thread] %-5level %logger{15}#%line %msg]]></pattern> --> </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 ] } ``` 显示结果如图所示(我们想要的都有了) ![image](http://firewarm.coding.me/images/kibana/Docker%E4%B8%ADjava%20logback%20%E9%A1%B9%E7%9B%AE%20%E5%90%91%20EFK%20%E5%86%99%E5%85%A5%E6%97%A5%E5%BF%97.png) 在kibana的搜索中,只需要填写“container_id:testLog1”,即可搜索到相关的日志了 如此,即完成了测试 --- > by 刘迎光@萤火虫工作室 > OpenBI交流群:495266201 > MicroService 微服务交流群:217722918 > mail: liuyg#liuyingguang.cn > 博主首页(==防止爬虫==):http://blog.liuyingguang.cn > OpenBI问答社区:http://openbi.liuyingguang.cn/
Pre:
java logback 向 EFK 写入日志
Next:
如何push一个docker镜像到DockerHub上
Table of content