首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

克拉克拉(KilaKila):借力阿里云快速构建短视频推荐系统

作者:阿里云MVP田亮 一、产品背景克拉克拉(KilaKila)是国内专注二次元、主打年轻用户的娱乐互动内容社区软件。KilaKila 推出互动语音直播、短视频、对话小说等功能,满足当下年轻用户个性化、碎片化的文娱需求。其中短视频每天都有海量的视频素材产生,这对用户造成了严重的信息过载,难以从中自主挑选感兴趣的内容。每一位视频内容的消费者同时也是生产者,期望自己的作品能够被更多的志同道合者所看到,获得最大的曝光度。为解决以上矛盾,考虑构建个性化推荐系统,在不需要用户明确说明更多信息的情况下仅仅依靠分析用户的历史行为数据,为用户推荐他可能感兴趣的内容。同时,推荐系统能够有效挖掘长尾内容,使一些小众的主题作品能够获得尽可能多的展示机会。面对以上业务诉求,经技术调研后决定使用阿里云PAI平台搭建基于KilaKila二次元UGC的个性化智能

优秀的个人博客,低调大师

阿里云Redis助力新东方乐词业务快速稳定发展

背景介绍 乐词是新东方倾情打造权威英语单词背记APP,业务涵盖初中、高中、新概念、英语四六级、考研、雅思、托福、GRE、SAT、ACT 、GMAT、托业、商务英语等英语单词库,科学规划词根背记,离线背单词随时学,权威详尽单词解析,全新考试干货课程,群组背记英语单词,完整的视频教学体系为用户提供全方位的单词学习体验。乐词系统涵盖词书、背词、查词、视频课程、活动、用户、在线支付等10多个核心业务模块,用户使用日活10w+,为了给用户提供稳定可靠的服务,对我们系统的可用性提出了更高的要求。Redis作为业界目前流行的Key-Value型NoSQL存储组件,可以帮我们解决面临的技术挑战。因我们属于创业型项目,自建系统以及自行运维意味着前期较大的投入以及过高的运维成本,随着业务规模的扩张,资源水平扩展以及垂直扩展也是未来无法避免的痛点,所以我

优秀的个人博客,低调大师

使用PHP辅助快速制作一套自己的手写字体实践

一、背景 笔者以前在网上看到有民间高手制作字体的相关事迹,觉得把自己的手写字用键盘敲出来是一件很有意思的事情,所以一直有时间想制作一套自己的手写体,前几天在网上搜索了一下制作字体的方法,发现技术上并不是太难,结合了自己PHP方面的开发经验,很快的做出了一套自己的手写字体。 制作字体的流程大致是这样,首先我们需要确定那些字体需要自己写,确定了字体之后将这一批字利用工具做成一个模板,不过汉字的总量非常的多,搜索了一下大概在10万字左右,这个工程量太大,因此我们需要找出一批属于自己常用的字体(大概1700字左右),或者自己所常见到的字体,这个过程就需要用PHP来分析,分析出来之后再将其提取出来,做成模板。 在这篇文章当中笔者将完整的记录制作字体过程,其中会将用到的PHP代码公布出来,方便其他读者使用,也给自己留个备份。 二、操作概要 提取常用汉字 制作字体模板 生成字体文件 三、提取常用汉字 做一套字体的工作量是比较大的,因为汉字数量比较多,不过我们可以将我们常用的汉字提取出来,优先将这写汉字的做出来,后面不常用的字体空闲时再去累加,这里我们用到了PHP来辅助我们提取常用的汉字。 3.1 收集数据 在网络中有各种2000个常用汉字之类的doc文档,但是每个人所用到的却不一样;因此我们需要收集一批自己经常接触的字体数据,比如可以从自己的笔记、博客、聊天数据、通讯录中提取;比如笔者便将以往的笔记、文章、通讯录收集了起来,如下图则是笔者过往的文章列表 我们将文章内容复制到txt文件当中,然后保存到某一个文件夹当中,如下图所示 3.2 去除杂项 收集了文章之后,里面有很多杂项,比如空格和换行,这些内容我们并不需要,如下图所示 此时可以通过正则表达式将不需要的内容删除,笔者使用的匹配非中文的正则表达式如下: [^\u4e00-\u9fa5] 笔者平时开发习惯使用phpstorm这款IDE,因此这里教大家使用此IDE来删除非中文字符;按住键盘 ctrl+r,替换文本内容,然后将正则表达式放入查找项当中,并且勾选regex,此时所有非汉字内容会被选中,如下图所示: 当笔者点击Replace all按钮时,变删除了所有非中文字符,此时我们的内容应该只有一行内容,如下图所示 3.3 字体去重 在整理好文字之后,我们现在需要对里面的内容进行去重,保证每一个汉字只保留一个,因为我们字体模板每个字只需要写一次就可以;因此可以使用PHP对汉字进行去重,代码如下所示 <?php //汉字去重函数 function mb_str_split(string $string) { return implode('', array_unique(preg_split('/(?<!^)(?!$)/u', $string))); } //将收集的汉字数据读取出来 $word = file_get_contents('ziti/shoulu.txt'); $word .= file_get_contents('ziti/phpsafe.txt'); $word .= file_get_contents('ziti/reming.txt'); $word .= file_get_contents('ziti/2000.txt'); $word .= file_get_contents('ziti/https.txt'); $word .= file_get_contents('ziti/wangwen/wuxian.txt'); $word .= file_get_contents('ziti/wangwen/qixi.txt'); $word .= file_get_contents('ziti/wangwen/qiantan.txt'); $word .= file_get_contents('ziti/wangwen/jiaoyi.txt'); //执行去重 echo mb_str_split($word); 当这段代码被执行之后,会返回去重后的结果,笔者执行结果如下图: 从图中可以看出,笔者已经得到了一批去重后的文字 3.4 统计并排序 去重之后已经得到了一批独一无二的汉字,但是字数实在太多,达到了1730个汉字,可能一下写不完,不过作为开发者当然是要讲究高效率的;所以可以通过PHP来进行优先级的计算,把最常用到字体排在前面,因此笔者需要写一段PHP代码。 3.4.1 汉字拆分数组 首先笔者将去重后的字符串拆分成数组,因为汉字比较特殊,所以需要自定义一段代码,参考代码如下: //把汉字拆分为数组 function ch2arr(string $str) { $length = mb_strlen($str, 'utf-8'); $array = []; for ($i = 0; $i < $length; $i++) { $array[] = mb_substr($str, $i, 1, 'utf-8'); } return $array; } 3.4.1 排序后筛选 下载笔者需要通过foreach来遍历统计每个字出现的次数,并且安装倒序排序,如果limit大于0,还可以筛选重复次数大于0的汉字,代码如下 function strSelect(string $string, string $word, $limit = 0) { //把字符串分割为数组 $cnList = ch2arr($string); foreach ($cnList as $val) { $result[$val] = substr_count($word, $val); } //重复高的出现在最前 arsort($result); //筛选字符串 $ret = ''; foreach ($result as $key => $val) { if ($val > $limit) { // $ret .= "$key:$val".PHP_EOL; //查看每个字重复的次数 $ret .= $key; } } return $ret; } 在前面两个方法写完之后,笔者只需要调用一行代码即可得出最常用的一些字符,也可以筛选结果,调用代码如下: echo strSelect($str, $allStr, 1); 代码执行之后,笔者将会安装汉字出现的次数进行排序,把最常见的字符排在前面,并且筛选出现次数大于1的才返回,返回结果如下图所示: 从图中可以看到字体顺序已经发生了很大变化,数量明显少了很多。 参考代码地址: http://tuchuang.songboy.net/ziti/code.txt 四、制作字体模板 把自己最常接触的汉字找出来之后,需要制作一套字体模板,这套字体模板的用处是让手写汉字后,顺利的找到对应的汉字,这里需要依靠第三方网站提供的一些功能。 4.1 字体文件编码 现在笔者将PHP计算的字符写入到一个txt文件当中,参考命令如下 php quchong.php > result.txt 保存之后,还需要将它的编码设置为UTF-8;操作步骤为:首先用windows的记事本打开,然后将文件另存为UTF-8编码的文件,笔者用mac系统怎么也不行,使用windows很顺利的就完成了,建议使用windows,如下图所示 4.2 生成字体模板 现在笔者需要将之前保存的汉字,用固定格式的模板展现出来,后期需要用此模板生成字体文件,这里需要用到一个网站来辅助,网站地址如下 http://www.flexifont.com/ 网站需要注册,注册过程笔者这里将不做描述;在登陆之后点击我的字体,可以看到当前的字体模板,选择自定义,参考下图 点击自定义之后,笔者能看到一个上传txt文件的表单,如下图所示 上传完成之后,笔者回到列表当中,就可以看到刚才创建的字体模板,如下图所示 4.3 手写字体 笔者将刚才创建的模板下载到电脑当中,并解压该文件,解压后的结果如下图所示 这里一定要打开这些图片确认无误,确认这些字和上传的字能对应的上,如果里面的字明显不是刚才上传的,很有可能是你上传文件的编码不正确,笔者生成的字体模板如下图所示 确认无误后需要将这几张图片打印下来,最好自己有打印机,笔者之前买过一款惠普的1121打印机,总价格不到200块钱,建议各位读者也买一个,有打印机有时候真的很方便; 打印出来之后,就需要笔者将对应文字意义手写。 五、生成字体文件 手写字体是一个比较辛苦的过程,手写完成之后还有一些步骤,如果读者比较熟悉用手机编辑图片,那么这一步很快就能完成,如果不熟悉,就详细的看一下笔者的处理方法吧。 5.1 拍照 首先需要将刚才手写的文字进行拍照,拍照的时候注意尽量平着拍,需要把4个黑边拍进去;笔者使用的是iPhone手机,因此非常建议使用iPhone的读者将相机的网格线功能打开,因为这样就可以看出手机是否是平着拍的,在设置->相机->网格线,参考如下图 设置好之后,笔者再次打开相机,就能看到网格线,如下图所示 中间的十字架如果是黄颜色的,说明笔者当前是平着拍摄的,这样拍照的时候图片就不会那么斜了。 5.2 处理图片 虽然在拍照的时候已经很用心的去拍摄,但拍的过程当中难免有一些不满意,这个时候可以用手机简单处理一下,笔者这里依然以iPhone手机为例 打开相册查看图片的右上方有一个编辑功能,如下图所示 点击编辑之后,在左下角有一个方块按钮,点击之后可以对图片进行放大缩小的跳转,以及旋转,对齐等功能,读者可以自己去操作一番,将图片尽量调整到理想的状态。 笔者处理后的效果如下图所示 5.3 上传并生成字体 现在打开字体上传页面,把笔者已经处理过的图片上传到手写体网站当中了,URL地址如下 http://www.flexifont.com/flexifont-chn/add_font/ 如下图所示,手写体站点的一些规则 需要记住别选择错模板(笔者一开始没选择对,还以为系统出问题了),然后把字体上传,上传完成之后,可以点击查看队列,看看当前的字体处理状态,URL地址如下 http://www.flexifont.com/flexifont-chn/queuers/ 笔者上传字体后,不到1分钟便已经处理完成,处理完成之后,可以在我的字体下方看到字体列表,如下图所示 六、使用字体 当字体生成完成之后,笔者安装字体文件即可 6.1 安装字体 安装字体在mac下和widnows下都非常简单,首先看看mac下安装方法,下载字体之后,可以直接双击字体文件,会看到如下图 笔者直接点击安装字体就可以了 再说说windows下安装,其实也只需要双击字体文件即可,然后点击安装,如下图所示 不过笔者在电脑在安装字体的时候出现了错误,提示字体无效,于是我换了一种方式;右击鼠标->为所有用户安装 又好了,原因未知,如果读者出现这种情况也可以试试。 6.2 在WPS中使用 笔者很多时候都会使用到word文件,读者喜欢用wps,那么如何在WPS中使用“轻松体”呢,其实非常简单,在随便输入一些文字之后,在上方选择“轻松体”即可,效果如下图所示 如果发现某个字体不是你手写的风格,那应该是这个字体不再你的字体模板当中,你可以生成一个新的模板,然后合并之前的字体即可。 6.3 补充 在手写体当中默认的模板也不错,读者也可以去尝试一下,另外不仅仅汉字可以做手写体,符号也可以。 作者:汤青松 微信:songboy8888 日期:2018年8月20号

优秀的个人博客,低调大师

“互联网+”英特尔,快速响应让零售更贴心

第十届商业信息化行业大会今天在深圳拉开帷幕。英特尔携手国内领先的POS和智能POS产品生产商、板卡厂家以及方案提供商等众多生态系统合作伙伴,联合展示了多款智能零售创新产品和解决方案,全面阐释了智能零售和智能收银收单新定义,以及支付终端在其中所扮演的重要作用。 从以连锁店为代表的传统实体零售,到以电商为代表的在线零售,再到当前虚实结合的智能零售模式,全球零售业正在经历一场史无前例的剧烈变革。2017年,资源整合的步伐正在不断加快,线上与线下的融合越发紧密。直到2020年,零售物联网市场的规模将达到356.4亿美元[1],零售商越来越多的通过物联网解决方案来提高运营效率,并在线上和线下创造令人兴奋的全新用户体验。而作为技术的前沿的支付,受到愈演愈烈的智能零售风潮以及新兴市场的催化,也在经历一场全新的转型:从单一应用、单一功能和体验,升级至集成多种应用和功能、支持多屏触控和多种操作系统,有效联动智能商店的其他设备,从而实现更多基于数据分析和其他相关的增值应用。 为了解决零售业面临的挑战,英特尔正在为零售业开发全面的端到端产品组合,整合了先进计算、客户体验、资源部署、通信与深度学习所必需的广泛技术,这些技术拥有跨实体店、云基础设施和数据中心的无与伦比的可扩展性和安全性。英特尔拥有得天独厚的优势来实现智能互联世界的各个环节--支持全球绝大多数数据中心、连接数亿个物联网设备并履行对时刻在线、5G连接、深度机器学习以及安全和隐私的承诺。 “英特尔广泛的与解决方案提供商合作,致力于推动零售业的持续增长。”英特尔公司物联网事业部零售解决方案部门零售平台市场总监Alec Gefrides表示:“随着越来越多的商家将资金投入到支付终端及店面智能设备的升级换代中,英特尔致力于提供强大的计算能力和独一无二的端到端的技术支持。” 随着物联网下的智能消费体验日渐深入人心,从线上的精准营销到线下的购物体验,全渠道营销真正实现了跨界发展,从根本上推动了整个零售行业的变革。英特尔凭借着自身优异的CPU和GPU性能,通过软硬集成的服务逐年不断优化为零售行业量身订制的参考设计,从前端到后端提供完善的智能零售解决方案和技术,配合大数据分析对于消费者的深入洞察,真正瞄准了目标群体,提升了用户黏性,大幅增加了销售利润,最终助推实体店回归商业本质,线上线下两条腿走路实现了实体店的全新逆袭。 本文出处:畅享网 本文来自云栖社区合作伙伴畅享网,了解相关信息可以关注vsharing.com网站。

优秀的个人博客,低调大师

快速上手ndk开发! Mac/Win下配置和使用!(2018.4重编版)

目录 前言 ndk环境配置 下载ndk 配置ndk路径 配置ndk环境路径 ndk上手 实现c函数, 并编译生成.so 其他项目使用.so 最后 前言 说下我的AndroidStudio版本是2.3.3, 还没有更新到3.x(手动委屈), 主要还是想把手头项目搞定了再跳坑. 然后这次添加了mac平台的配置, 其实没多大区别, 当然, linux也是大同小异, 毕竟android studio是通用的. 为什么要使用.so?从我自己的理解出发, 有几点非常主要: 你往往不是一个人在开发, 而且你的合作伙伴不可能把所有源码给你编译. 所以一个解决方案就是他编译生成.so给你, 再给你个.h文件, 告诉你有哪些函数.对于这些函数, 你只需要知道功能而不需要知道实现细节. .so文件是依靠c/cpp编译而成的, c/cpp语言的重要性不言而喻, 历史地位也是不可撼动的, 而且一些本来已经写好的库, 没必要说因为要写Android就换成java重新实现一遍. 所以需要让Android去支持那些已有的库. java源码反编译一下很容易拿到的, 当然可以加固apk, 会好一点. 而编译生成.so之后, c的源码就很难看到了. ndk环境配置 有个比较头痛的事情叫做配环境 下载ndk mac下下载ndk win下下载ndk 配置ndk路径 mac下配置ndk路径 win下配置ndk路径 配置ndk环境变量 mac: 用vim打开.bash_profile, 在最后加入ndk所在路径. vim .bash_profile mac下添加ndk路径 更新配置文件并测试ndk-build指令 更新配置并测试 win: win下配置ndk环境变量 加入到PATH大家庭 打开PowerShell测试一下 打开PowerShell测试一下 终于可以开始使用NDK了, 或者你可以管它叫JNI ndk上手 在包目录下创建HellJNI类, 并写入必要代码 mac下 win下 public class HelloJNI { //一个加法函数, 用c实现 public native int AddC (int a, int b); static { //加载库, 注意库名的一致性 System.loadLibrary("HelloC"); } } 使用javah命令生成头文件, 注意! 这是重点, 要背!(滑稽脸)然后新建一个同名c/cpp. mac: mac下生成头文件 生成后目录一栏 生成后目录一栏 win: 使用javah命令生成头文件 一览 实现c函数, 并编译生成.so 拷贝.h文件中生成的函数, 在c/cpp中实现它. /* * Class: com_so_myapplication_HelloJNI * Method: AddC * Signature: (II)I */ JNIEXPORT jint JNICALL Java_com_so_myapplication_HelloJNI_AddC (JNIEnv *, jobject, jint, jint); #include "com_so_myapplication_HelloJNI.h" JNIEXPORT jint JNICALL Java_com_so_myapplication_HelloJNI_AddC (JNIEnv * env, jobject obj, jint a, jint b){ return a + b; } 在jni目录下创建Android.mk和Application.mk文件并写入内容, 重点! Android.mk内容如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := HelloC LOCAL_SRC_FILES := com_so_myapplication_HelloJNI.c LOCAL_SRC_FILES += util.c include $(BUILD_SHARED_LIBRARY) 有2个要点: LOCAL_MODULE的名称要和之前System.loadLibrary("HelloC");中的名称一致; Win下需要再加一个空的util.c文件进行编译, 否则会报错, 不信可以试试(手动滑稽), mac/linux下无需. Application.mk内容如下: APP_ABI := all #APP_ABI := armeabi armeabi-v7a x86 mips arm64-v8a mips64 x86_64 有2个要点: 我知道这样不太专业, 不过这个ABI问题牵扯太多, 暂不细说, 主要是和不同cpu有关. armeabi似乎已被淘汰. 配置build.gradle, 重中之重! 先是build.gradle一览: android { compileSdkVersion 26 buildToolsVersion "26.0.3" sourceSets { main { jniLibs.srcDirs = ['libs'] } } defaultConfig { applicationId "com.so.myapplication" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" ndk { moduleName "HelloC" //System.loadLibrary("HelloC"); } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } ndk需要配置, 注意名字匹配! ndk { moduleName "HelloC" //System.loadLibrary("HelloC"); } sourceSets配置 sourceSets { main { jniLibs.srcDirs = ['libs'] } } 在gradle.properties中加上一句 android.useDeprecatedNdk=true 然后就是ndk-build了, 再查看是否生成成功! mac下ndk-build win下ndk-build 一览 你可以在这个项目中使用这个由c实现的加法函数了, 但是我们有更酷的事情要做, 那就是在另外的项目中用这个函数. 其他项目使用.so 这件事其实没有很难, 基本靠两步. 第一步就是将前一个项目生成的libs目录下的全部内容拷贝到AndroidStudio自带的libs目录下 一览 第二步就是创建一个和前一个生成libs目录的项目相同的包和类, 类中写入的内容也是一样的.顺带加下build.gradle中的sourceSets, 不记得位置, 参考之前的build.gradle一览. 一览 public class HelloJNI { public native int AddC (int a, int b); static { System.loadLibrary("HelloC"); } } sourceSets { main { jniLibs.srcDirs = ['libs'] } } 最后测试下效果, 这段代码我就不解释了, 这看不懂也就告别手表了! public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv_testc = (TextView) findViewById(R.id.tv_testc); tv_testc.setText("add: " + new HelloJNI().AddC(1, 2)); } } 测试结果 最后 完结散花! 喜欢记得点赞或者关注我哦, 有问题和意见可以评论区~~

优秀的个人博客,低调大师

快速生成Plugman中的"lib-file"、"source-file"的xml内容

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/inforstack/article/details/78755362 目录结果: 工具类: package com.inforstack.plugman; import java.io.File; public class Plugin { //插件的相对目录 private static String basePath = "src/android/demo"; //插件的绝对目录 private static String path = "D:\\work\\cordova\\plugin\\demo\\src\\android\\demo"; public static void main(String[] args) { getFile(path); } private static void getFile(String path) { // 获取路径所在的文件列表 File dirFile = new File(path); // 获取文件列表 File[] array = dirFile.listFiles(); for (File file : array) { if (file.isFile()) { toXML(file.getName(), file.getPath()); } else if (file.isDirectory()) { getFile(file.getPath()); } } } private static void toXML(String fileName, String filePath) { if (fileName.indexOf(".java") != -1 || fileName.indexOf(".xml") != -1 || fileName.indexOf(".png") != -1) { String newFilePath = filePath.replace(path, ""); String newDirPath = newFilePath.replace("\\" + fileName, ""); newDirPath = newDirPath.substring(1, newDirPath.length()); String xml = String.format("<source-file src=\"%s%s\" target-dir=\"%s\" />", basePath,newFilePath, newDirPath); xml = xml.replace("\\", "/"); System.out.println(xml); } else if (fileName.indexOf(".jar") != -1) { String newFilePath = filePath.replace(path, ""); String xml = String.format("<lib-file src=\"%s%s\"/>", basePath,newFilePath); xml = xml.replace("\\", "/"); System.out.println(xml); } } } 结果: <lib-file src="src/android/demo/libs/MobCommons-2016.1222.1756.jar"/> <lib-file src="src/android/demo/libs/MobTools-2016.1222.1756.jar"/> <source-file src="src/android/demo/res/values/ssdk_instapaper_strings.xml" target-dir="res/values" /> <source-file src="src/android/demo/src/cn/sharesdk/onekeyshare/CustomerLogo.java" target-dir="src/cn/sharesdk/onekeyshare" /> <source-file src="src/android/demo/src/cn/sharesdk/onekeyshare/themes/classic/ClassicTheme.java" target-dir="src/cn/sharesdk/onekeyshare/themes/classic" /> <source-file src="src/android/demo/src/cn/sharesdk/onekeyshare/themes/classic/land/EditPageLand.java" target-dir="src/cn/sharesdk/onekeyshare/themes/classic/land" /> <source-file src="src/android/demo/src/cn/sharesdk/onekeyshare/themes/classic/port/EditPagePort.java" target-dir="src/cn/sharesdk/onekeyshare/themes/classic/port" />

优秀的个人博客,低调大师

用Kibana和logstash快速搭建实时日志查询、收集与分析系统

Logstash是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索),您可以使用它。说到搜索,logstash带有一个web界面,搜索和展示所有日志。 kibana 也是一个开源和免费的工具,他可以帮助您汇总、分析和搜索重要数据日志并提供友好的web界 面。他可以为 Logstash 和 ElasticSearch 提供的日志分析的 Web 界面 。 1.Kibana介绍 Kibana是一个基于浏览器页面的Elasticsearch前端展示工具。Kibana全部使用HTML语言和Javascript编写的。 2.安装配置Kibana wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.2.zip unzip kibana-3.1.2.zip mv kibana-3.1.2/* /data/app_platform/kibana/ #配置样本 grep -v "#" /home/haoren/data/kibana-5.0.2-linux-x86_64/config/kibana.yml server.port: 15601 server.host: "0.0.0.0" elasticsearch.url: "http://222.192.73.12:19200" 配置Nginx虚拟机主机 /data/app_platform/nginx/conf/conf.d/kibana.conf server { listen 80; server_name kibana.xxxxx.com; access_log /data/app_data/nginx/logs/kibana.log main; client_max_body_size 5m; index index.html index.htm; autoindex on; root /data/app_platform/kibana; location / { index index.html index.htm; } } 更改/data/app_platform/kibana/config.js中的Elasticsearch的配置信息 elasticsearch: "http://kibana.xxx.com:9200", 3.导入一些测试数据 在导入测试数据之前,创建一些索引。 $ curl -XPUT http://localhost:9200/shakespeare -d ' > { > "mappings" : { > "_default_" : { > "properties" : { > "speaker" : {"type": "string", "index" : "not_analyzed" }, > "play_name" : {"type": "string", "index" : "not_analyzed" }, > "line_id" : { "type" : "integer" }, > "speech_number" : { "type" : "integer" } > } > } > } > } > '; 索引创建完后,导入测试数据 Kibana 是一个为 Logstash 和 ElasticSearch 提供的日志分析的 Web 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。 说到这里,我们看看 kibana 和 logstash到底能为我们做些什么呢?下面是kibana的界面 简单来讲他具体的工作流程就是 logstash agent 监控并过滤日志,将过滤后的日志内容发给redis(这里的redis只处理队列不做存储),logstash index将日志收集在一起交给 全文搜索服务ElasticSearch 可以用ElasticSearch进行自定义搜索 通过Kibana 来结合自定义搜索进行页面展示,下图是 Kibana官网上的流程图 好了 让我们一步步的把这套环境搭建起来吧,先看看都需要安装什么软件包 #安装样本 rpm -qa |grep ruby libselinux-ruby-2.0.94-5.3.el6.x86_64 ruby-irb-1.8.7.374-4.el6_6.x86_64 ruby-rdoc-1.8.7.374-4.el6_6.x86_64 ruby-libs-1.8.7.374-4.el6_6.x86_64 rubygems-1.3.7-5.el6.noarch ruby-1.8.7.374-4.el6_6.x86_64 ruby 运行Kibana 必须, rubygems 安装ruby扩展必须 bundler 功能类似于yum JDK 运行java程序必须 redis 用来处理日志队列 logstash 收集、过滤日志 ElasticSearch 全文搜索服务(logstash集成了一个) kibana 页面展示 这里有三台服务器 192.168.233.128 logstash index,ElasticSearch,kibana,JDK 192.168.233.129 logstash agent,JDK 192.168.233.130 redis 首先到 logstash index服务器上面,logstash分为 index和aget ,agent负责监控、过滤日志,index负责收集日志并将日志交给ElasticSearch 做搜索 此外logstash 的收集方式分为 standalone 和 centralized。 standalone 是所有功能都在一个服务器上面,自发自收, centralized 就是集中收集,一台服务器接收所有shipper(个人理解就是logstash agent)的日志。 其实 logstash本身不分 什么 shipper 和 collector ,只不过就是配置文件不同而已,我们这次按照集中的方式来测试 在 logstash index上安装基础的软件环境 [192.168.233.128 root@nodec:~] # cd /soft/ [192.168.233.128 root@nodec:/soft] # wget http://down1.chinaunix.net/distfiles/jdk-6u13-dlj-linux-i586.bin 从oracle下载实在是太慢了,从CU下载会快一些,如果需要最新版本请访问这里 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html [192.168.233.128 root@nodec:/soft] # sh jdk-6u13-dlj-linux-i586.bin 输入yes 便开始安装了 安装完成后设置一下 JAVA_HOME [192.168.233.128 root@nodec:/soft/Kibana-0.2.0] #vim /etc/profile export JAVA_HOME=/usr/java export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH 安装ruby 就比较简单了(Kibana需要ruby 1.8.7以上版本) [192.168.233.128 root@nodec:/soft] #yum install ruby rubygems ..... 安装内容省略 安装完成后用 rubygems 来安装bundler [192.168.233.128 root@nodec:/soft] #/usr/bin/gem install bundler ..... ok 这样基本的环境就已经有了,下面就是安装kibana 和 logstash 其实logstash 就是一个java脚本,不需要安装... 下载即用 [192.168.233.128 root@nodec:/soft] # wget http://logstash.objects.dreamhost.com/release/logstash-1.1.0-monolithic.jar 现在看看 这个脚本应该怎么去执行 [192.168.233.128 root@nodec:/soft] # java -jar /soft/logstash-1.1.0-monolithic.jar -h No such command "-h" Available commands: -v -V --version agent web test 显然没有 -h 参数,不过列出了能用的参数,但是logstash的参数可不止这些, java -jar /soft/logstash-1.1.0-monolithic.jar agent --help 这些是在agent模式下的命令参数 -f, --config CONFIGFILE Load the logstash config from a specific file, directory, or a wildcard. If given a directory or wildcard, config files will be read in order lexigraphically. -e CONFIGSTRING Use the given string as the configuration data. Same syntax as the config file. If not input is specified, 'stdin { type => stdin }' is default. If no output is specified, 'stdout { debug => true }}' is default. -w, --filterworks COUNT Run COUNT filter workers (default: 1) --watchdog-timeout TIMEOUT Set watchdog timeout value. -l, --log FILE Log to a given path. Default is to log to stdout -v Increase verbosity. There are multiple levels of verbosity available with '-vv' currently being the highest --pluginpath PLUGIN_PATH A colon-delimted path to find other logstash plugins in java -jar /soft/logstash-1.1.0-monolithic.jar web --help 下面的是在web界面的参数 --log FILE Log to a given path. Default is stdout. --address ADDRESS Address on which to start webserver. Default is 0.0.0.0. --port PORT Port on which to start webserver. Default is 9292. -B, --elasticsearch-bind-host ADDRESS Address on which to bind elastic search node. -b, --backend URL The backend URL to use. Default is elasticsearch:/// (assumes multicast discovery). You can specify elasticsearch://[host][:port]/[clustername] 如果上面的这些命令都能执行正常的话就表示 logstash可以使用了,但要让他启动还需要一个配置文件 [192.168.233.128 root@nodec:/soft] # vim redis.conf input { redis { host => '192.168.233.130' data_type => 'list' port => "6379" key => 'logstash:redis' type => 'redis-input' } } output { elasticsearch { embedded => true } } 解释一下 logstash的配置文件由 input filter output 等几个基本的部分组成, 顾名思义 input 就是在那收集数据,output就是输出到哪,filter代表一个过滤规则意思是什么内容 会被收集。 上面这段是让 logstash 去192.168.233.130 这个redis服务器上去收集日志 redis端口为6379,key是 logstash:redis 类型为 redis-input ,(注意:这几个值必须跟logstash agent的output 所对应), 收集完成后输出到 elasticsearch ,embedded => true 的意思是使用logstash 内嵌的 elasticsearch。如果有独立的elasticsearch服务器,需要将 这条改为 host => 'elasticsearch的ip' port => 端口 好了,这个简单的配置文件可以让logstash开始启动了 [192.168.233.128 root@nodec:/soft] # java -jar /soft/logstash-1.1.0-monolithic.jar agent -f /soft/redis.conf -- web --backend elasticsearch:///?local & [1] 5205 ...这里要等待约5秒钟... 为什么?去问开发者吧 [192.168.233.128 root@nodec:/soft] # I, [2013-03-19T03:23:10.749000 #5205] INFO -- : Using beta plugin 'redis'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status {"timestamp":"2013-03-19T03:23:10.732000 -0700","message":"Using beta plugin 'redis'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status ","level":"info"} file:/soft/logstash-1.1.0-monolithic.jar!/gems/rack-1.3.4/lib/rack/backports/uri/common_192.rb:53 warning: already initialized constant WFKV_ Mizuno 0.5.0 (Jetty 8.0.y.z-SNAPSHOT) listening on 0.0.0.0:9292 解释一下 上面的命令 agent 代理模式 -f 指定配置文件 --web 其实是个分隔符等于又启动了一个命令,后面的参数就是开启一个web页面默认端口是9292,这个命令如果拆成两个就是这个样子 java -jar /soft/logstash-1.1.0-monolithic.jar agent -f /soft/redis.conf & java -jar /soft/logstash-1.1.0-monolithic.jar web --backend elasticsearch:///?local & (其实如果用kibana来做web界面的话这一步完全可以省掉了) 好了,看到9292 端口启动就代表 启动成功了,检查一下 [192.168.233.128 root@nodec:/soft] # lsof -i:9292 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME java 5205 root 465u IPv4 130805 TCP *:armtechdaemon (LISTEN) 其实logstash还启动了一个端口9200,因为启动了内嵌的 elasticsearch,这个9200是 elasticsearch在监听 [192.168.233.128 root@nodec:/soft] # lsof -i:9200 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME java 5205 root 160u IPv4 130682 TCP *:wap-wsp (LISTEN) 现在可以通过浏览器访问一下 http://192.168.233.128:9292 看看logstash是的页面是个什么样子 能搜索因为现在还没有数据,其实这个时候 http://192.168.233.128:9200 也是可以访问的, 很多开发自己写代码来调用elasticsearch 来实现他们自己的需要,这里就不多说了 192.168.233.128 这台logstash index的操作暂时告一段落,下面开始配置logstash的agent 登录到 服务器 192.168.233.129 安装基本软件包和logstash [192.168.233.129 root@noded:~] # cd /soft/ [192.168.233.129 root@noded:/soft] # wget http://down1.chinaunix.net/distfiles/jdk-6u13-dlj-linux-i586.bin [192.168.233.129 root@noded:/soft] # sh jdk-6u13-dlj-linux-i586.bin 设置 JAVA_HOME [192.168.233.129 root@noded:/soft] #vim /etc/profile export JAVA_HOME=/usr/java export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH [192.168.233.129 root@noded:/soft] #yum install ruby 192.168.233.129 root@noded:/soft] # wget http://logstash.objects.dreamhost.com/release/logstash-1.1.0-monolithic.jar [192.168.233.129 root@noded:/soft] # vim redis.conf input { file { type => "producer" path => "/soft/apache.log" } file { type => "php-log" path => "/soft/php.log" } } filter { grep { match => [ "@message", "mysql|GET|error" ] } } output { redis { host => '192.168.233.130' data_type => 'list' key => 'logstash:redis' } } 大概说一下这个配置文件 input 里的file就是要监视的文件了 这里我监视了两个文件,如果这两个文件有追加的内容就会通过下面的output设置发给 redis服务器 filter 里的grep 意思就是 grep... 后面这段就是 日志内容里面只要有匹配 mysql或GET或error的内容就会被过滤出来,发送到 logstash index 以上就是一个比较简单的配置文件了,让我们启动他 [192.168.233.129 root@noded:/soft] # java -jar /soft/logstash-1.1.0-monolithic.jar agent -f /soft/redis.conf & I, [2013-03-19T19:45:35.762000 #2721] INFO -- : Using beta plugin 'file'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status {"timestamp":"2013-03-19T19:45:35.752000 -0700","message":"Using beta plugin 'file'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status ","level":"info"} I, [2013-03-19T19:45:35.778000 #2721] INFO -- : Using beta plugin 'file'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status {"timestamp":"2013-03-19T19:45:35.778000 -0700","message":"Using beta plugin 'file'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status ","level":"info"} I, [2013-03-19T19:45:35.804000 #2721] INFO -- : Using beta plugin 'grep'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status {"timestamp":"2013-03-19T19:45:35.803000 -0700","message":"Using beta plugin 'grep'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status ","level":"info"} I, [2013-03-19T19:45:35.854000 #2721] INFO -- : Using beta plugin 'redis'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status {"timestamp":"2013-03-19T19:45:35.853000 -0700","message":"Using beta plugin 'redis'. For more information about plugin statuses, see http://logstash.net/docs/1.1.0/plugin-status ","level":"info"} 只要没有 warning 和 error就算是正常启动了 启动之前请确定 192.168.233.130的 redis服务器已经启动,不然会报错 下面登录到 192.168.233.130 上看看 redis服务的状态 [192.168.233.130 root@nodea:/data/redis/etc] # lsof -i:6379 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME redis-ser 2732 root 4u IPv4 7946 TCP *:6379 (LISTEN) redis-ser 2732 root 5u IPv4 7963 TCP localhost.localdomain:6379->localhost.localdomain:19214 (ESTABLISHED) java 2733 root 9u IPv4 7959 TCP localhost.localdomain:19214->localhost.localdomain:6379 (ESTABLISHED) 状态正常,端口处于监听状态,我用的是最简单的 配置, [192.168.233.130 root@nodea:/data/redis/etc] #vim redis.conf #this is the config file for redis pidfile /var/run/redis.pid port 6379 timeout 0 loglevel verbose logfile /data/redis/log/redis.log dbfilename dump.rdb dir /data/redis/db/ vm-swap-file /tmp/redis.swap activerehashing yes 启动命令如下 [192.168.233.130 root@nodea:/data/redis/etc] #redis-server /data/redis/etc/redis.conf & 下载安装就比较简单了 [192.168.233.130 root@nodea:/soft] # wget http://redis.googlecode.com/files/redis-2.4.14.tar.gz [192.168.233.130 root@nodea:/data/redis/etc] #make –j 24 [192.168.233.130 root@nodea:/data/redis/etc] #make install 配置文件里的那几个路径要提前建好 最后我们回到 logstash agent 上面测试一下 [192.168.233.129 root@noded:/soft] # echo GET12313 >> apache.log [192.168.233.129 root@noded:/soft] # echo errorabcd >> apache.log ok 到 http://192.168.233.128:9292 去搜索一下 刚才的两个内容 嗯,就是这样了,我现在找个php的错误日志给他追加到php.log文件里 [192.168.233.129 root@noded:/soft] # cat php-error.log >> php.log 在看看 logstash的页面 搜索一下 error OK,最后就是 Kibana了 ,我把Kibana装在了 logstash index上面 下载地址为http://kibana.org/intro.html [192.168.233.128 root@nodec:/soft] # tar xf Kibana-0.2.0.tar.gz [192.168.233.128 root@nodec:/soft] # cd Kibana-0.2.0 [192.168.233.128 root@nodec:/soft/Kibana-0.2.0] #bundle install 直接安装就好了,非常简单,因为之前咱们已经安装好了 bundle 编辑配置文件,指定 elasticsearch 的位置 [192.168.233.128 root@nodec:/soft/Kibana-0.2.0] # vim KibanaConfig.rb ..... Elasticsearch = "localhost:9200" KibanaPort = 5601 KibanaHost = '0.0.0.0' ..... 主要是这几个参数 启动的话需要ruby [192.168.233.128 root@nodec:/soft/Kibana-0.2.0] #/usr/bin/ruby kibana.rb & [192.168.233.128 root@nodec:/soft/Kibana-0.2.0] # == Sinatra/1.3.5 has taken the stage on 5601 for development with backup from Thin >> Thin web server (v1.5.0 codename Knife) >> Maximum connections set to 1024 >> Listening on 0.0.0.0:5601, CTRL+C to stop 如果ruby的东西都不缺的话,启动会很顺利,ok 现在看看5601端口的状态 [192.168.233.128 root@nodec:/soft/Kibana-0.2.0] # lsof -i:5601 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME ruby 3116 root 5u IPv4 28947 TCP *:esmagent (LISTEN) 访问一下 试试看 http://192.168.233.128:5601 尝试搜索一下php的错误日志,比如mysql ELK Stack 是Elasticsearch、Logstash、Kibana三个开源软件的组合,在实时数据检索和分析场合,三者通常是配合共用的。 可参考:https://www.elastic.co/products 二、Elasticstack重要组件 Elasticsearch: 准实时索引 Logtash: 收集数据,配置使用 Ruby DSL Kibana 展示数据,查询聚合,生成报表 Kafka 消息队列,做为日志接入的缓冲区 三、Elasticstack工作流程 简要说明: 1)日志机器上部署logstash服务,用于监控并收集日志,然后,将收集到的日志发送到broker上。 2)Indexer会将这些日志收集到一起,统一发送到Elasticsearch上进行存储。 3)最后Kibana会将需要的数据进行展示,可以进行自定义搜索 四、环境准备 系统:centos 7.2 JDK: 1.8.0_111 filebeat: 5.1.2 logstash: 5.1.2 elasticsearch: 5.1.2 (注:ELK stack 5.1以上版本JDK必须是1.8以上) kibana: 5.1.2 X-Pack:5.1 kafka: 2.11-0.10.1.0 测试服务器准备: 主机名称:node01 IP:192.168.2.14 职责:主机节点以及数据节点、kafka/logstash 主机名称:node02 IP: 192.168.2.15 职责:主机节点以及数据节点、kibana 主机名称:node03 IP: 192.168.2.17 职责:主机节点以及数据节点、Elasticstack-head插件 主机名称:test IP: 192.168.2.70 职责:客户端 注:分配内存建议大于2G 测试服务器设置: 配置hosts(/etc/hosts) 192.168.2.14 node01 192.168.2.15 node02 192.168.2.17 node03 关闭防火墙&Sellinux 配置yum源: #yum -y install epel-release 时间同步: #rpm -qa |grep chrony 配置时间同步源: # vi /etc/chrony.conf # Please consider joining the pool (http://www.pool.ntp.org/join.html). 0.rhel.pool.ntp.org iburst server 1.rhel.pool.ntp.org iburst server 10.100.2.5 iburst 重启时间同步服务:#systemctl restart chronyd.service node01和node02安装配置JDK: #yum install java-1.8.0-openjdkjava-1.8.0-openjdk-devel #安装openjdk 1)标准方式配置环境变量: vim /etc/profile 将下面的三行粘贴到 /etc/profile中: export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el7_3.x86_64 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 2)保存关闭后,执行:source /etc/profile#让设置立即生效。 [root@~]# echo $JAVA_HOME [root@ ~]# echo $CLASSPATH [root@ ~]# echo $PATH 测试是否安装配置成功 # java -version<br>openjdk version "1.8.0_121" OpenJDK Runtime Environment (build 1.8.0_121-b13)<br>OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) 3)下载相应的组件到/home/soft <span style="font-size:18px;"> #wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.2.zip<br> #wgethttps://artifacts.elastic.co/downloads/kibana/kibana-5.1.2-linux-x86_64.tar.gz<br> #wget https://artifacts.elastic.co/downloads/logstash/logstash-5.1.2.zip<br> #wgethttp://apache.mirrors.lucidnetworks.net/kafka/0.10.1.0/kafka_2.11-0.10.1.0.tgz<br></span> 五、node01节点安装部署elasticsearch 1、创建elk用户、组 [root@node01 soft]groupadd elk [root@node01 soft]useradd -g elk elk 2、elasticsearch解压至/usr/local/目录下 [root@node01 soft]#unzip elasticsearch-5.1.2.zip -d /usr/local/ 3、创建data/db和data/logs分别存储数据文件和日志文件 [root@node01 soft]# mkdir -pv /data/{db,logs} 4、授权data/db和data/logs、/usr/local/elasticsearch-5.1.2文件夹elk用户及用户组读取权限 [root@node01 soft]chown elk:elk /usr/local/elasticsearch-5.1.2 -R [root@node01 soft]chown elk:elk /data/{db,logs} -R 5、编辑/usr/local/elasticsearch-5.1.2/config/elasticsearch.yml 修改为如下参数: [root@node01 config]# vim elasticsearch.yml cluster.name: ELKstack-5 node.name: node01 path.data: /data/db path.logs: /data/logs bootstrap.memory_lock: true network.host: 0.0.0.0 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.2.14","192.168.2.15","192.168.2.17"] discovery.zen.minimum_master_nodes: 2 xpack.security.enabled: false #关闭es认证 与kibana对应,不然后面安装x-pack需要用户名密码验证 注: cluster.name: ELKstack-5 #集群的名字(可任意取名称) node.name: node01 #换个节点名字 network.host: 0.0.0.0 #监听地址,0.0.0.0表示任意机器可以访问 http.port: 9200 #可默认 http.cors.enabled: true #head插件可以访问es http.cors.allow-origin: "*" discovery.zen.ping.unicast.hosts: 集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点 discovery.zen.minimum_master_nodes: 选举一个Master需要多少个节点(最少候选节点数),一般设置成 N/2 + 1,N是集群中节点的数量 xpack.security.enabled: false #关闭es认证 与kibana对应,禁用了认证功能,如果启用了认证,访问时需要指定用户名密码 6、根据elk运行环境,需要修改以下参数(修改参数以后建议重启机器) 1)[root@node01 config]#vim /etc/security/limits.conf#修改限制参数,允许elk用户访问mlockall # allow user 'elk mlockall elk soft memlock unlimited elk hard memlock unlimited * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096 2)[root@node01 config]#vim /etc/security/limits.d/20-nproc.conf#修改可打开的文件描述符的最大数(软限制) 修改如下内容: * soft nproc 4096 #修改为 * soft nproc 2048 3)[root@node01 config]#vim /etc/sysctl.conf #限制一个进程可以拥有的VMA(虚拟内存区域)的数量 添加下面配置: vm.max_map_count=655360 [root@node01 config]#sysctl -p #刷新修改参数使其生效 4)修改jvm空间分配,因为elasticsearch5.x默认分配jvm空间大小为2g [root@node01 elasticsearch-5.1.2]#vim config/jvm.options -Xms2g -Xmx2g 修改为 [root@node01 elasticsearch-5.1.2]#vim config/jvm.options -Xms512m -Xmx512m 不然会报以下错误: OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x000000008a660000, 1973026816, 0) failed; error='Cannot allocate memory' (errno=12) # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 1973026816 bytes for committing reserved memory. # An error report file with more information is saved as: # /usr/local/elasticsearch-5.1.2/hs_err_pid11986.log 5)启动elasticsearch服务,注:elasticsearch默认不允许root用户启动服务,切换至普通用户启动 [root@node01 elasticsearch-5.1.2] #su - elk [elk@node01 elasticsearch-5.1.2]$cd /usr/local/elasticsearch-5.1.2 [elk@node01 elasticsearch-5.1.2]$nohup ./bin/elasticsearch & [elk@node01 elasticsearch-5.1.2]$./elasticsearch -d #ElasticSearch后端启动命令 注:停止服务(ps -ef |grep elasticsearch 、kill PID) 6)启动后查看进程是否监听端口9200/9300,并且浏览器访问http://192.168.2.14:9200/,是否正常输出es集群信息等 [root@node01 ~]# ss -tlnp |grep '9200' LISTEN 0 128 :::9200 :::* users:(("java",pid=2288,fd=113) [root@node01 ~]# curlhttp://192.168.2.14:9200 { "name" : "node01", "cluster_name" : "ELKstack-5", "cluster_uuid" : "jZ53M8nuRgyAKqgQCDG4Rw", "version" : {<br> "number" : "5.1.2", "build_hash" : "c8c4c16", "build_date" : "2017-01-11T20:18:39.146Z", "build_snapshot" : false, "lucene_version" : "6.3.0"<br> }, "tagline" : "You Know, for Search" } 六、类似node01节点安装elasticsearch部署node02、node03节点 1、安装部署node02节点elasticsearch 1)编辑/usr/local/elasticsearch-5.1.2/config/elasticsearch.yml修改为如下参数: [root@node02 config]# vim elasticsearch.yml<br>cluster.name: ELKstack-5 node.name: node02 path.data: /data/db path.logs: /data/logs bootstrap.memory_lock: true network.host: 0.0.0.0 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.2.14","192.168.2.15","192.168.2.17"] discovery.zen.minimum_master_nodes: 2 xpack.security.enabled: false #关闭es认证 与kibana对应 注:其他配置部署同node01 2、安装部署node03节点elasticsearch 1)编辑/usr/local/elasticsearch-5.1.2/config/elasticsearch.yml修改为如下参数: [root@node02 config]# vim elasticsearch.yml cluster.name: ELKstack-5 node.name: node03 path.data: /data/db path.logs: /data/logs bootstrap.memory_lock: true network.host: 0.0.0.0 http.port: 9200<br>discovery.zen.ping.unicast.hosts: ["192.168.2.14","192.168.2.15","192.168.2.17"] discovery.zen.minimum_master_nodes: 2 xpack.security.enabled: false #关闭es认证 与kibana对应 注:其他配置部署同node01 3、3个节点(node01,node02,node03)启动后,查看集群是否正常,节点是否正常 常用查询命令如下: 查看集群状态:curl -XGET http://localhost:9200/_cat/health?v 查看集群节点:curl -XGET http://localhost:9200/_cat/nodes?v 查询索引列表:curl -XGET http://localhost:9200/_cat/indices?v 创建索引:curl -XPUT http://localhost:9200/customer?pretty 查询索引:curl -XGET http://localhost:9200/customer/external/1?pretty 删除索引:curl -XDELETE http://localhost:9200/customer?pretty [root@node01 ~]# curl -XGEThttp://localhost:9200/_cat/health?v<br> epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 1486384674 20:37:54 ELKstack-5 green 3 3 0 0 0 0 0 0 - 100.0% [root@node01 ~]# curl -XGEThttp://localhost:9200/_cat/nodes?v<br> ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 192.168.2.17 22 94 3 0.58 0.55 0.27 mdi * node03 192.168.2.15 22 93 0 0.59 0.60 0.29 mdi - node02 192.168.2.14 22 93 1 0.85 0.77 0.37 mdi - node01 七、node3(192.168.2.17)节点上安装head插件(由于elasticsearch5.0版本变化较大,目前elasticsearch5.0 暂时不支持直接安装) 1、在从github上面下载代码,因此先要安装git,授权文件和目录(777) [root@node03 local]# yum install git [root@node03 local]# git clone git://github.com/mobz/elasticsearch-head.git [root@node03 local]# chmod 777 -R elasticsearch-head/* 2、下载Node.js,并解压,配置进环境变量 [root@node03 soft]# wgethttps://npm.taobao.org/mirrors/node/latest-v4.x/node-v4.6.1-linux-x64.tar.gz<br> [root@node03 soft]# tar -xvf node-v4.6.1-linux-x64.tar.gz #解压至当前目录 [root@node03 soft]#vim /etc/profile 添加如下: export PATH=/home/soft/node-v4.6.1-linux-x64/bin:$PATH [root@node03 soft]#source /etc/profile #使配置文件生效。 3、在/usr/local/elasticsearch-head/目录下,进行npm install 使用node.js安装 [root@node03 elasticsearch-head]# npm install -g cnpm --registry=https://registry.npm.taobao.org<br> [root@node03 elasticsearch-head]# npm install grunt --save-dev 4、修改目录/usr/local/elasticsearch-head/Gruntfile.js connect: { server: { options: { port: 9100, hostname: '0.0.0.0', base: '.', keepalive: true } } 增加hostname属性,设置为*或'0.0.0.0' 5、修改/usr/local/elasticsearch-5.1.2/config/elasticsearch.yml配置文件,增加一下配置,重新启动ES服务 # 以下两个为允许跨域,主要是5.1版本的head插件和以往安装的不一样 http.cors.enabled: true<br>http.cors.allow-origin: "*" 6、修改目录/usr/local/elasticsearch/plugins/head/_site/Gruntfile.js connect: { server: { options: { port: 9100, hostname: '0.0.0.0', base: '.', keepalive: true } } 增加hostname属性,设置为*或'0.0.0.0' 7、修改/usr/local/elasticsearch-head/_site/app.js连接地址: 修改head的连接地址: this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";<br></span> 把localhost修改为es的服务器地址,如: this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.2.17:9200";<br></span> 8、修改/usr/local/elasticsearch-5.1.2/config/elasticsearch.yml配置文件,增加一下配置,重新启动ES服务 # 以下两个为允许跨域,主要是5.1版本的head插件和以往安装的不一样 http.cors.enabled: true<br>http.cors.allow-origin: "*" 9、解决依赖并启动服务 执行npm install下载依赖的包: [root@node03 elasticsearch-head]#npm install [root@node03 elasticsearch-head]#./node_modules/grunt/bin/grunt serverb & #后台启动服务 测试访问:http://192.168.2.17:9100/ 八、node2(192.168.2.15)节点上安装部署kibana 1、kibana解压至/usr/local/目录下 1 [root@node02 soft]#tar -xvf kibana-5.1.2-linux-x86_64.tar.gz -C /usr/local/ 2、修改/usr/local/kibana-5.1.2-linux-x86_64/config/kibana.yml配置文件,如下:并启动kibana服务 1 [root@node02 soft]#vim /usr/local/kibana-5.1.2-linux-x86_64/config/kibana.yml server.port: 5601 server.host: "192.168.2.15" elasticsearch_url: "http://192.168.2.15:9200"<br> xpack.security.enabled: false #关闭认证,为后面kibana增加x-pack组件免去用户名密码认证 [root@node02 kibana-5.1.2-linux-x86_64]#bin/kibana > /var/log/kibana 九、配置客户端test节点(192.168.2.70) 1、安装配置JDK(同node01~node03,这里不再阐述) 2、拷贝logstash至客户端,并解压至/usr/local/目录下 [root@node02 config]# scp /home/soft/logstash-5.1.2.zip root@192.168.2.70:/home/soft/ [root@test soft]#unzip logstash-5.1.2.zip -d /usr/local/ 3、编辑logstash服务管理脚本(配置路径可根据实际情况修改) [root@test logstash-5.1.2]# mkdir logs etc #创建目录logs,etc [root@test logstash-5.1.2]# vim /etc/init.d/logstash [root@test logstash-5.1.2]# chmod +x /etc/init.d/logstash #添加权限 脚本如下: 1 #!/bin/bash<br>#chkconfig: 2345 55 24 #description: logstash service manager #auto: Maoqiu Guo FILE='/usr/local/logstash-5.1.2/etc/*.conf' #logstash配置文件 LOGBIN='/usr/local/logstash-5.1.2/bin/logstash agent --verbose --config' #指定logstash配置文件的命令 LOCK='/usr/local/logstash-5.1.2/locks' #用锁文件配合服务启动与关闭 LOGLOG='--log /usr/local/logstash-5.1.2/logs/stdou.log' #日志 START() { if [ -f $LOCK ];then echo -e "Logstash is already \033[32mrunning\033[0m, do nothing." else echo -e "Start logstash service.\033[32mdone\033[m" nohup ${LOGBIN} ${FILE} ${LOGLOG} & touch $LOCK fi } STOP() { if [ ! -f $LOCK ];then echo -e "Logstash is already stop, do nothing." else<br> echo -e "Stop logstash serivce \033[32mdone\033[m" rm -rf $LOCK ps -ef | greplogstash | grep -v "grep" | awk '{print $2}' | xargskill -s 9 >/dev/null fi } STATUS() { psaux | greplogstash | grep -v "grep" >/dev/null if [ -f $LOCK ] && [ $? -eq 0 ]; then echo -e "Logstash is: \033[32mrunning\033[0m..." else echo -e "Logstash is: \033[31mstopped\033[0m..." fi } TEST(){ ${LOGBIN} ${FILE} --configtest } case "$1" in start) START ;; stop) STOP ;; status) STATUS ;; restart) STOP sleep 2 START ;; test) TEST ;; *) echo "Usage: /etc/init.d/logstash (test|start|stop|status|restart)" ;; esac 4、Logstash 向es集群写数据,并测试 1)、在/usr/local/logstash-5.1.2/etc/目录下编写一个logstash配置文件logstash.conf [root@test etc]# cat logstash.conf input { #数据的输入从标准输入<br> stdin {} } output { #数据的输出我们指向了es集群 elasticsearch { hosts => ["192.168.2.14:9200","192.168.2.15:9200",192.168.2.17:9200"]#es主机的ip及端口 } } [root@test etc]#/usr/local/logstash-5.1.2/bin/logstash -f logstash.conf -t#查看配置是否正常 Sending Logstash's logs to /usr/local/logstash-5.1.2/logs which is now configured via log4j2.properties Configuration OK 2)测试数据ES,修改logstash.conf配置文件,把messages输出到日志中,启动logstash服务 [root@test etc]#cat logstash.conf input {#这里的输入使用的文件,即日志文件messsages file { path => "/var/log/messages"#这是日志文件的绝对路径 start_position => "beginning"#这个表示从messages的第一行读取,即文件开始处 } } output {#输出到es elasticsearch { hosts => ["192.168.2.14:9200","192.168.2.15:9200",192.168.2.17:9200"] index => "messages-%{+YYYY-MM}"#这里将按照这个索引格式来创建索引 } } [root@test etc]#/usr/local/logstash-5.1.2/bin/logstash -f logstash.conf或 [root@test etc]#/etc/init.d/logstash start 3)验证插件head和kibana是否从ES集群接收到数据并展示 head插件看到相关索引http://192.168.2.17:9100/ 九、安装部署Kafka消息队列 1、Kafka是一个分布式、可分区、可复制的消息系统, 在Kafka集群中,没有『中心主节点』的概念,集群中所有的服务器都是对等的,因此可以在不做任何配置更改的情况下对服务器进行添加和删除,同样的消息生产者和消费都也能做到随意重启和机器的上下线。 2、Kafka相关概念 kafka核心组件工作流程 Consumer:用于从Broker中取出/消费Message Producer:用于往Broker中发送/生产Message Broker:Kafka中使用Broker来接受Producer和Consumer的请求,并把Message持久化到本地磁盘。每个Cluster当中会选举出一个Broker来担任Controller,负责处理Partition的Leader选举,协调Partition迁移等工作 以上组件在分布式环境下均可以是多个,支持故障转移。同时ZooKeeper仅和broker和consumer相关。broker的设计是无状态的,消费的状态信息依靠消费者自己维护,通过一个offset偏移量。client和server之间通信采用TCP协议。 发布消息通常有两种模式:队列模式(queuing)和发布-订阅模式(publish-subscribe)。队列模式中,consumers 可以同时从服务端读取消息,每个消息只被其中一个 consumer 读到;发布-订阅模式中消息被广播到所有的 consumer 中。更常见的是,每个 topic 都有若干数量的 consumer 组,每个组都是一个逻辑上的『订阅者』,为了容错和更好的稳定性,每个组由若干 consumer 组成。这其实就是一个发布-订阅模式,只不过订阅者是个组而不是单个 consumer。 3、kafka的Topic与Partition工作流程 消息是按照主题来提交到Partition当中的。Partition当中的消息是有序的,consumer从一个有序的分区消息队列中顺序获取消息。相关名次定义如下: Topic:用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上 Partition:是Kafka中横向扩展和一切并行化的基础,每个Topic都至少被切分为1个Partition offset:消息在Partition中的编号,编号顺序不跨Partition 分区目的:Kafka中采用分区的设计有几个目的。一是可以处理更多的消息,不受单台服务器的限制。Topic拥有多个分区意味着它可以不受限的处理更多的数据。第二,分区可以作为并行处理的单元 offset:由消费者控制offset,因此分区本身所在broker是无状态的。消费者可以自由控制offset,很灵活 同个分区内有序消费:每一个分区都是一个顺序的、不可变的消息队列, 并且可以持续的添加。分区中的消息都被分配了一个序列号,称之为偏移量(offset),在每个分区中此偏移量都是唯一的 4、node01节点(192.168.2.14)上安装部署kafka(这里测试zookeeper没有集群,实际生产环境建议使用集群) 注:安装配置JDK环境这里省略,类同node01等节点 1)kafka解压至/usr/local/目录下,并创建链接kafka [root@node01 soft]# tar -xvf kafka_2.11-0.10.1.0.tgz -C /usr/local/ [root@node01 soft]# cd /usr/local/ [root@node01 local]# ln -sv kafka_2.11-0.10.1.0 kafka 2)创建zookeeper存储目录,修改/usr/local/kafka/config/目录下zookeeper.propertie配置文件 [root@node01 local]# mkdir /data/zookeeper [root@node01 local]#vim /usr/local/kafka/config/zookeeper.propertie 修改配置如下: dataDir=/data/zookeeper # the port at which the clients will connect tickTime=2000 #维持心跳的时间间隔 initLimit=20 syncLimit=10 注:如果zookeeper集群的话,必须标识再配置文件server.2,server.*不同名称并且在/data/zookeeper目录下创建myid文件,里面的内容为数字,用于标识主机,如果这个文件没有的话,zookeeper是没法启动的 如: [root@kafka1 ~]# echo 2 > /data/zookeeper/myid 3)修改kafka配置/usr/local/kafka/config/目录下server.properties文件 broker.id=0 # 唯一,填数字,如果是集群该值必须不同如:2、3、4 listeners=PLAINTEXT://:9092 #监听端口 advertised.listeners=PLAINTEXT://192.168.2.14:9092 # 唯一,填服务器IP log.dir=/data/kafka-logs # 该目录可以不用提前创建,在启动时自己会创建 zookeeper.connect=192.168.2.14:2181 #这个就是zookeeper的ip及端口 num.partitions=16 # 需要配置较大 分片影响读写速度 log.dirs=/data/kafka-logs # 数据目录也要单独配置磁盘较大的地方 log.retention.hours=168 # 时间按需求保留过期时间 避免磁盘满 4)启动kafka和zookeeper服务(先要启动zookeeper再启动kafka,如果是zookeeper集群如是) [root@kafka1 ~]# /usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties & #zookeeper启动命令 注:/usr/local/kafka/bin/zookeeper-server-stop.sh #暂停服务 [root@node01 config]# ss -tlnp |grep '2181' #启动正常 LISTEN 0 50 :::2181 :::* users:(("java",pid=3118,fd=88)) [root@node01 config]# nohup /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties & #kafka启动的命令 或 #/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties > /dev/null & 注:/usr/local/kafka/bin/kafka-server-stop.sh #暂停服务 5)kafka创建一个主题 [root@node01 kafka]#bin/kafka-topics.sh --create --zookeeper 192.168.2.14:2181 --replication-factor 1 --partitions 1 --topic linuxtest #注意:factor大小不能超过broker数 [root@node01 kafka]# bin/kafka-topics.sh --list --zookeeper 192.168.2.14:2181 #查看主题 linuxtest [root@node01 kafka]#bin/kafka-topics.sh --describe --zookeeper 192.168.2.14:2181 --topic linuxtest<br>Topic:linuxtestPartitionCount:1ReplicationFactor:1Configs: Topic: linuxtestPartition: 0Leader: 0Replicas: 0Isr: 0 6)发送消息,这里使用的是生产者角色 [root@node01 kafka]#bin/kafka-console-producer.sh --broker-list 192.168.2.14:9092 --topic linuxtest This is a messages welcometo kafka 7)接收消息,这里使用的是消费者角色 [root@node01 kafka]#bin/kafka-console-consumer.sh --zookeeper 192.168.2.14:2181 --topic linuxtest --from-beginning This is a messages welcometo kafka 5、修改客户端test节点logstash.conf配置文件,输出改到kafka上面,将数据写入到kafka中,重启logstash服务 [root@test etc]# cat logstash.conf<br>input { #这里的输入还是定义的是从日志文件输入 file { type => "message" path => "/var/log/messages" start_position => "beginning" } } output { #stdout { codec => rubydebug } #这是标准输出到终端,可以用于调试看有没有输出,注意输出的方向可以有多个 kafka { #输出到kafka bootstrap_servers => "192.168.2.14:9092" #他们就是生产者 topic_id => "linux-messages" #这个将作为主题的名称,将会自动创建 compression_type => "snappy" #压缩类型 } } [root@test etc]#/usr/local/logstash-5.1.2/bin/logstash -f logstash.conf > /dev/null & 6、从kafka中读取数据后输出到ES机器,node01安装部署Logstash,安装步骤不再赘述;注意这里的日志主题名称“linuxtest”,并启动服务 [root@node01 etc]#more logstash.conf input { kafka { zk_connect => "192.168.2.14:2181" #消费者们 topic_id => "linuxtest" codec => plain reset_beginning => false consumer_threads => 5 decorate_events => true } } output { elasticsearch { hosts => ["192.168.2.14:9200","192.168.2.15:9200","192.168.2.17:9200"] index => "linux-messages-%{+YYYY-MM}" } } [root@node01 etc]#/usr/local/logstash/bin/logstash -f logstash.conf > /dev/null &#启动服务 7、验证在test客户端上写入测试内容 [root@webserver1etc]# echo "test-linux-messages到es集群!!!" >> /var/log/messages<br>#启动logstash,让其读取messages中的内容 十、安装部署X-Pack(需付费X-Pack License(可注册1年免费 License)) 1、x-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,虽然x-pack被设计为一个无缝的工作,但是你可以轻松的启用或者关闭一些功能。 注:以下为license 注册信息 curl -XPUT -u elastic:password 'http://<host>:<port>/_xpack/license' -d @license.json @license.json 申请得到的json文件,复制文件中的所有内容,粘贴在此。 如果提示需要acknowledge,则设置为true curl -XPUT -u elastic:password 'http://<host>:<port>/_xpack/license?acknowledge=true' -d @license.json 查看安装结果信息 curl -XGET -uelastic:password 'http://<host>:<port>/_license' 不同版本功能 https://www.elastic.co/subscriptions X-Pack监控组件使您能够通过Kibana轻松监控Elasticsearch。 您可以实时查看集群运行状况和性能,以及分析过去的集群,索引和节点指标。 此外,您可以监控Kibana本身的性能。在群集上安装X-Pack时,监视代理会在每个节点上运行,以从Elasticsearch收集索引指标。 通过在Kibana中安装X-Pack,您可以通过一组专用仪表板查看监视数据。 x-pack安装之后有一个超级用户elastic ,其默认的密码是changeme,拥有对所有索引和数据的控制权,可以使用该用户创建和修改其他用户,当然这里可以通过kibana的web界面进行用户和用户组的管理。 X-pack的elk之间的数据传递保护,如:安装完x-pack之后,我们就可以用我们所创建的用户来保护elk之间的数据传递. 如下: 1)kibana<——>elasticsearch 在kibana.yml文件中配置: elasticsearch.username: “elastic” elasticsearch.password: “changeme” 2)logstash<——>elasticsearch 在自己写的配置文件中定义 input { stdin{} beats{ port => 5044 } } output { elasticsearch { hosts => ["http://localhost:9200"] user => elastic #必须有对应的用户/密码 password => changeme } stdout{ codec=>rubydebug } } 注:这里如果不进行相关配置的话,elk之间的数据传递就会出现问题 2、在各个ES集群节点/usr/local/elasticsearch-5.1.2/目录下以及kibana(本示例kibana在node02上)的/usr/local/kibana-5.1.2-linux-x86_64/ 目录下安装X-Pack,并重启Kibana 1 [root@node01 elasticsearch-5.1.2]# bin/elasticsearch-plugin install x-pack [root@node02 elasticsearch-5.1.2]# bin/elasticsearch-plugin install x-pack [root@node03 elasticsearch-5.1.2]# bin/elasticsearch-plugin install x-pack [root@node02 kibana-5.1.2-linux-x86_64]# bin/kibana-plugin install x-pack [root@node02 kibana-5.1.2-linux-x86_64]# bin/kibana > /var/log/kibana.log 2>&1 & #kill进程后启动服务 注:卸载x-pack组件,#bin/elasticsearch-plugin remove x-pack 页面访问:http://192.168.2.15:5601,可以查看多了Monitoring选项,更多资料请参考官网 官方文档:https://www.elastic.co/guide/index.html elasticsearch 权威指南:http://www.learnes.net/ ELK stack 权威指南:http://kibana.logstash.es/content/logstash/ ELK 开发指南:https://endymecy.gitbooks.io/elasticsearch-guide-chinese/content/index.html **************************************************************************************************** 常见问题总结: #Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12) 由于elasticsearch5.x默认分配jvm空间大小为2g,修改jvm空间分配 # vim config/jvm.options -Xms2g -Xmx2g 修改为 # vim config/jvm.options -Xms512m -Xmx512m #max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536] ulimit -SHn 65536 vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 * soft nproc 65536 * hard nproc 65536 * soft nofile 65536 * hard nofile 65536 * soft nproc 65536 * hard nproc 65536 * soft nofile 65536 * hard nofile 65536 #max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048] 修改 /etc/security/limits.d/90-nproc.conf * soft nproc 1024 * soft nproc 2048 #max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 修改/etc/sysctl.conf配置文件, cat /etc/sysctl.conf | grep vm.max_map_count vm.max_map_count=262144 如果不存在则添加 echo "vm.max_map_count=262144" >>/etc/sysctl.conf #具体实例配置 192.168.10.67 ll -rt /home/haoren/data/filebeat-5.0.2-linux-x86_64/ drwxr-xr-x 2 haoren haoren 4096 11-24 18:02 scripts -rw-r--r-- 1 haoren haoren 4196 11-24 18:02 filebeat.yml.bak -rw-r--r-- 1 haoren haoren 1482 11-24 18:02 filebeat.template.json -rw-r--r-- 1 haoren haoren 1873 11-24 18:02 filebeat.template-es2x.json -rw-r--r-- 1 haoren haoren 31735 11-24 18:02 filebeat.full.yml -rwxr-xr-x 1 haoren haoren 14790666 11-24 18:02 filebeat -rwxr-xr-x 1 haoren haoren 1184 02-08 14:47run.sh -rw-r--r-- 1 haoren haoren 723 02-08 20:13filebeat.yml drwxr-xr-x 2 haoren haoren 4096 02-08 20:13 logs drwxr-xr-x 2 haoren haoren 4096 02-08 20:53 data cat /home/haoren/data/filebeat-5.0.2-linux-x86_64/filebeat.yml filebeat.prospectors: - input_type: log paths: - /log/billserver.log #- /home/haoren/data/filebeat-5.0.2-linux-x86_64/test.log encoding: gbk symlinks: true include_lines: ['\[.*?统计\]','\[.*?结算\]'] document_type: billserver fields_under_root: true fields: host: 192.168.10.67 processors: - drop_fields: #fields: ["beat.hostname", "beat.name", "beat.version", "input_type", "beat"] fields: ["input_type", "beat", "offset", "source"] output.redis: enabled: true hosts: ["192.168.10.18"] password: "A8841c09BAD52E63067C4DA" port: 26379 datatype: list key: "filebeat" db: 0 output.file: enabled: false path: "/tmp/filebeat" output.console: enabled: false #启动filebeat cat /home/haoren/data/filebeat-5.0.2-linux-x86_64/run.sh #!/bin/bash #/home/haoren/data/filebeat-5.0.2-linux-x86_64 if [ $# -eq 0 ]; then echo "error no param, please input param example 'runfilebeat.sh start'" exit fi function stopserver() { echo "stopserver filebeat" pid1=`ps ax | grep "filebeat" | grep "\/filebeat$" | awk '{print $1}'` #pid1=`ps ax | grep "filebeat" | awk '{print $1}'` for pid in ${pid1};do echo "stopping " $pid kill $pid sleep 10 kill -9 $pid sleep 10 echo "$pid stop finish" done echo "stopserver end" } function startserver() { echo "startserver filebeat" cd /home/haoren/data/filebeat-5.0.2-linux-x86_64 /home/haoren/data/filebeat-5.0.2-linux-x86_64/filebeat & sleep 10 pid1=`ps ax | grep "filebeat" | grep -v "grep" | wc -l` if [ $pid1 -eq 0 ]; then echo "failed start filebeat -d" else echo "start filebeat -d successs" fi echo "start server end" exit } case $1 in stop) stopserver 0 ;; start) startserver 0 ;; reboot) stopserver 0 sleep 1 startserver 0 ;; *) stopserver 0 sleep 1 startserver 0 ;; esac ll -rt /home/haoren/data/logstash-5.0.2/ -rw-rw-r-- 1 haoren haoren 149 11-24 18:22 NOTICE.TXT -rw-rw-r-- 1 haoren haoren 589 11-24 18:22 LICENSE -rw-rw-r-- 1 haoren haoren 20837 11-24 18:22 Gemfile.jruby-1.9.lock -rw-rw-r-- 1 haoren haoren 2249 11-24 18:22 CONTRIBUTORS -rw-rw-r-- 1 haoren haoren 111731 11-24 18:22 CHANGELOG.md -rw-rw-r-- 1 haoren haoren 3686 11-24 18:26 Gemfile drwxrwxr-x 3 haoren haoren 4096 12-01 14:15 logstash-core-plugin-api drwxrwxr-x 3 haoren haoren 4096 12-01 14:15 logstash-core-event-java drwxrwxr-x 5 haoren haoren 4096 12-01 14:15 logstash-core drwxrwxr-x 5 haoren haoren 4096 12-01 14:15 lib drwxrwxr-x 2 haoren haoren 4096 12-01 14:15 bin drwxrwxr-x 4 haoren haoren 4096 12-01 14:15 vendor -rw-rw-r-- 1 haoren haoren 342 12-01 15:34test.txt drwxrwxr-x 3 haoren haoren 4096 12-01 15:43 data -rw-r--r-- 1 haoren haoren 2559 12-01 15:52test.conf -rw-r--r-- 1 haoren haoren 2570 12-01 17:11 activityserver2.conf -rw-r--r-- 1 haoren haoren 2618 12-20 12:44 activityserver.conf -rwxr-xr-x 1 haoren haoren 80 02-09 14:04logstash.sh drwxrwxr-x 2 haoren haoren 4096 02-22 16:28 config drwxrwxr-x 2 haoren haoren 4096 02-22 18:07 logs -rw-r--r-- 1 haoren haoren 2154 02-22 18:51billserver.conf 启动/home/haoren/data/logstash-5.0.2/logstash.sh #!/bin/bash /home/haoren/data/logstash-5.0.2/bin/logstash -f billserver.conf & cat /home/haoren/data/logstash-5.0.2/billserver.conf input { file { path => "/log/billserver.log" codec => plain { charset => "GBK" } #start_position => "beginning" #sincedb_path => "/dev/null" type => "billserver" } } filter { if ([message] =~ "\[人民币结算\]"){ mutate {replace => { "type" => "dubijiesuan" }} grok { #170208-10:00:28 Bill[40268] INFO: [人民币结算]时间(1486519228),用户ID(30581009),原来人民币(12567),现在人民币(16567),人民币操作(1),增加(4000),操作类型(19),操作详情(2),操作数量(0).描述:通用人民币操作 #170208-10:00:01 Bill[40268] INFO: [人民币结算]时间(1486519201),用户ID(22327945),原来人民币(2572),现在人民币(2532),人民币操作(2),扣除(40),操作类型(19),操作详情(15),操作数量(0).描述:通用人民币操作 match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) Bill\[\d+\] INFO: \[人民币结算\]时间\(%{NUMBER:time:int}\),用户ID\(%{NUMBER:userid:int}\),原来人民币\(%{NUMBER:oldcoin:int}\),现在人民币\(%{NUMBER:currentcoin:int}\),人民币操作\(%{NUMBER:coinop:int}\),%{DATA:sop}\(%{NUMBER:coinnum:int}\),操作类型\(%{NUMBER:optype:int}\),操作详情\(%{NUMBER:opdetail:int}\),操作数量\(%{NUMBER:opnum:int}\).描述:%{DATA:sinfo}"] } } else{ drop{} } date { match => ["datetime", "yyMMdd-HH:mm:ss"] #timezone => ["Asia/Hong_Kong"] #remove_field => ["time"] } ruby { code => "event.timestamp.time.localtime" } mutate { #some pc no host replace => { "host" => "192.168.10.67" } } } output { #stdout { # codec => plain { # charset => "UTF-8" # #charset => "GBK" # } #} #file { # path => "/tmp/logstash.log" # codec => json { # charset => "UTF-8" # } #} redis { host => ["192.168.10.18"] port => 26379 data_type => "list" key => "logstash" password => "A8841c09BAD52E63067C4DA" codec => json { charset => "UTF-8" } } } #192.168.10.18上的配置 ll -rt /home/haoren/data/logstash-5.0.2/ -rw-rw-r-- 1 haoren haoren 149 11月 24 10:22 NOTICE.TXT -rw-rw-r-- 1 haoren haoren 589 11月 24 10:22 LICENSE -rw-rw-r-- 1 haoren haoren 20837 11月 24 10:22 Gemfile.jruby-1.9.lock -rw-rw-r-- 1 haoren haoren 2249 11月 24 10:22 CONTRIBUTORS -rw-rw-r-- 1 haoren haoren 111731 11月 24 10:22 CHANGELOG.md drwxrwxr-x 2 haoren haoren 4096 11月 24 10:22 data -rw-rw-r-- 1 haoren haoren 3686 11月 24 10:26 Gemfile drwxrwxr-x 2 haoren haoren 4096 11月 30 07:34 bin drwxrwxr-x 5 haoren haoren 4096 11月 30 07:34 lib drwxrwxr-x 5 haoren haoren 4096 11月 30 07:34 logstash-core drwxrwxr-x 3 haoren haoren 4096 11月 30 07:34 logstash-core-plugin-api drwxrwxr-x 3 haoren haoren 4096 11月 30 07:34 logstash-core-event-java drwxrwxr-x 4 haoren haoren 4096 11月 30 07:34 vendor -rwxrwxr-x 1 haoren haoren 78 11月 30 09:40logstash.sh drwxrwxr-x 2 haoren haoren 4096 12月 1 14:25 config -rwxrwxr-x 1 haoren haoren 78 12月 6 10:33 filebeat.sh -rw-r--r-- 1 haoren haoren 2534 12月 9 13:06 filebeat.bak -rw-rw-r-- 1 haoren haoren 555 12月 20 08:27logstash.conf -rw-r--r-- 1 haoren haoren 3457 12月 20 08:28 filebeat.conf.bak -rw-r--r-- 1 haoren haoren 6163 1月 11 08:20 filebeat.conf.20170112.bak -rw-r--r-- 1 haoren haoren 5130 1月 11 08:20 filebeat.conf.20170111.bak -rw-r--r-- 1 haoren haoren 292 1月 11 13:31filebeat.txt -rw-rw-r-- 1 haoren haoren 2636 1月 12 03:47 filebeat20170112.txt -rw-rw-r-- 1 haoren haoren 2636 1月 12 03:47 filebeat.json -rw-r--r-- 1 haoren haoren 7385 1月 12 03:57 filebeat.20170112 -rw-r--r-- 1 haoren haoren 7390 1月 18 02:31 filebeat.conf.2070118.bak -rw-r--r-- 1 haoren haoren 7853 2月 8 12:16 filebeat.conf.20170208.bak -rw-r--r-- 1 haoren haoren 9011 2月 8 12:16filebeat.conf -rwxrwxr-x 1 haoren haoren 528 3月 7 10:48 Del-logstash-log.sh drwxrwxr-x 2 haoren haoren 4096 3月 11 16:08 logs 启动/home/haoren/data/logstash-5.0.2/logstash.sh #!/bin/bash /home/haoren/data/logstash-5.0.2/bin/logstash -f logstash.conf & cat /home/haoren/data/logstash-5.0.2/logstash.conf input { redis { host => ["192.168.10.18"] port => 26379 password => "A8841c09BAD52E63067C4DA" data_type => "list" key => "logstash" codec => json { charset => "UTF-8" } } } filter { ruby { code=>"event.set('daytag',event.timestamp.time.localtime.strftime('%Y.%m.%d'))" } } output { elasticsearch { hosts => ["127.0.0.1:19200"] index => "%{type}-%{daytag}" #index => "%{type}-%{+yyyy.MM.dd}" user => "logstashserver" password => "A950C0FB2D833E42C1AC59210CD5CDF8" } } 启动 /home/haoren/data/logstash-5.0.2/filebeat.sh #!/bin/bash /home/haoren/data/logstash-5.0.2/bin/logstash -f filebeat.conf & cat /home/haoren/data/logstash-5.0.2/filebeat.conf input { redis { host => ["192.168.10.18"] port => 26379 password => "A8841c09BAD52E63067C4DA" data_type => "list" key => "filebeat" codec => json { charset => "UTF-8" } } #file { # path => "/home/haoren/data/logstash-5.0.2/filebeat.txt" # codec => plain { # charset => "GBK" # } # start_position => "beginning" # sincedb_path => "/dev/null" # type => "pchannelserver" #} #file { # path => "/home/haoren/data/logstash-5.0.2/filebeat.json" # codec => json { # charset => "UTF-8" # } # start_position => "beginning" # sincedb_path => "/dev/null" # type => "pchannelserver" #} } filter { if( [type] == "sessionserver" ){ if( [message] =~ "登陆统计"){ mutate {replace => { "type" => "userlogin" }} grok { #161206-16:00:00 SS[4306] TRACE: [登陆统计]收到角色(82559870)登陆(PC)IP(124.239.95.209)MAC(52229449286)机器ID(454070640)渠道(0)gameid(6)端口(3889)登陆类型(1) match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) SS\[\d+\].*?TRACE: \[登陆统计\]收到角色\(%{NUMBER:userid:int}\)登陆\(%{DATA:sclient}\)IP\(%{DATA:sip}\)MAC\(%{DATA:smac}\)机器ID\(%{NUMBER:mid:int}\)渠道\(%{NUMBER:apkid:int}\)gameid\(%{NUMBER:gameid:int}\)端口\(%{NUMBER:port:int}\)登陆类型\(%{NUMBER:logintype:int}\)"] } } else if ([message] =~ "注册统计"){ mutate {replace => { "type" => "userreg" }} grok{ #161205-15:33:22 SS[4306] TRACE: [注册统计]用户(87475178)注册(Android)渠道(8)账号(_wx_omj_avq_nz8obsk6yy5dsmfrlfmk) match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) SS\[\d+\].*?TRACE: \[注册统计\]用户\(%{NUMBER:userid:int}\)注册\(%{DATA:sclient}\)渠道\(%{NUMBER:apkid:int}\)账号\(%{DATA:saccount}\)" ] } } #else{ # drop{} #} } else if( [type] == "activityserver" ){ if( [message] =~ "用户注册渠道奖励统计"){ mutate {replace => { "type" => "actvityregreward" }} grok { #161212-10:17:29 ActivityServer[17702] INFO: [UserRegisterReward.cpp:90] [用户注册渠道奖励统计]用户(87582819)客户端(0)注册渠道(1001)机器码(476931654)奖励包裹(77)个数(100)当日奖励(100)上限(1000000) match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) ActivityServer\[\d+\].*?INFO: .*?\[用户注册渠道奖励统计\]用户\(%{NUMBER:userid:int}\)客户端\(%{NUMBER:client:int}\)注册渠道\(%{NUMBER:apkid:int}\)机器码\(%{NUMBER:mid:int}\)奖励包裹\(%{NUMBER:packid:int}\)个数\(%{NUMBER:num:int}\)当日奖励\(%{NUMBER:todaynum:int}\)上限\(%{NUMBER:maxnum:int}\)\)"] } } else if( [message] =~ "充值礼包统计"){ mutate {replace => { "type" => "activityrechargebag" }} grok { #161220-17:02:53 ActivityServer[17700] INFO: [ActivityRechargeBag.cpp:559] [充值礼包统计]用户(60163778)获得(8800)礼包类型(2)用户获得( 1029:1)商户获得( 1062:688) match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) ActivityServer\[\d+\].*?INFO: \[.*?\] \[充值礼包统计\]用户\(%{NUMBER:userid:int}\)获得\(%{NUMBER:pid:int}\)礼包类型\(%{NUMBER:ptype:int}\)用户获得\(%{DATA:userget}\)商户获得\(%{DATA:singerget}\)"] } } else if( [message] =~ "16年购物统计"){ mutate {replace => { "type" => "activitymodules" }} grok { #161220-17:05:31 ActivityServer[17702] INFO: [ActivityModules.cpp:837][2016双12] [16年购物统计]用户(84795176)购物平台(65780103)商户(65780103)个数(20)礼物(92)价值(0)原分数(385399)增加分数(20)现分数(385419)淘汰(0)新旧(0) match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) ActivityServer\[\d+\] INFO: \[.*?\]\[2016双12\] \[16年购物统计\]用户\(%{NUMBER:userid:int}\)购物平台\(%{NUMBER:channelid:int}\)商户\(%{NUMBER:singerid:int}\)个数\(%{NUMBER:num:int}\)礼物\(%{NUMBER:itemid:int}\)价值\(%{NUMBER:coin:int}\)原分数\(%{NUMBER:oldscore:int}\)增加分数\(%{NUMBER:addscore:int}\)现分数\(%{NUMBER:nowscore:int}\)淘汰\(%{NUMBER:out:int}\)新旧\(%{NUMBER:isnew:int}\)"] } } } else if( [type] == "vchannelserver" ){ if( [message] =~ "进出购物平台统计"){ mutate {replace => { "type" => "vchannelin" }} grok { #170109-12:59:39 VChannelServer[15000] INFO: [Channel.cpp:414] [进出购物平台统计]用户(22016998)(进入)购物平台(3998186)端(0)渠道(0)IMState(6)机器ID(246418457)商户(87261227)游客(0) #170109-12:59:40 VChannelServer[15000] INFO: [Channel.cpp:414] [进出购物平台统计]用户(83735196)(离开)购物平台(4029779)端(3)渠道(0)IMState(13)机器ID(0)商户(0)游客(0) #170118-09:59:58 VChannelServer[15001] INFO: [Channel.cpp:417] [进出购物平台统计]用户(87455625)(进入)购物平台(3830989)端(3)渠道(2017)IMState(13)机器ID(0)商户(65256549)游客(0)游戏id(0) #170118-09:59:59 VChannelServer[15001] INFO: [Channel.cpp:417] [进出购物平台统计]用户(3015482583)(离开)购物平台(3830989)端(0)渠道(0)IMState(13)机器ID(0)商户(65256549)游客(1)游戏id(0) match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) VChannelServer\[\d+\] INFO: \[.*?\] \[进出购物平台统计\]用户\(%{NUMBER:userid:int}\)\(%{DATA:sop}\)购物平台\(%{NUMBER:channelid:int}\)端\(%{NUMBER:client:int}\)渠道\(%{NUMBER:apkid:int}\)IMState\(%{NUMBER:imstate:int}\)机器ID\(%{NUMBER:mid:int}\)商户\(%{NUMBER:singerid:int}\)游客\(%{NUMBER:istemp:int}\)游戏id\(%{NUMBER:gameid:int}\)"] } } } else if( [type] == "pchannelserver" ){ if( [message] =~ "进出购物平台统计"){ mutate {replace => { "type" => "pchannelin" }} grok { #170111-00:00:17 PChannelServer[18701] INFO: [进出购物平台统计]用户(88464974)(进入)购物平台(86972527)端(0)渠道(0)IMState(6)机器ID(0)商户(86972527)游客(0) #170111-00:00:43 PChannelServer[18701] INFO: [进出购物平台统计]用户(88464904)(退出)购物平台(86972527)端(0)渠道(0)IMState(6)机器ID(0)商户(86972527)游客(0) match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) PChannelServer\[\d+\] INFO: \[进出购物平台统计\]用户\(%{NUMBER:userid:int}\)\(%{DATA:sop}\)购物平台\(%{NUMBER:channelid:int}\)端\(%{NUMBER:client:int}\)渠道\(%{NUMBER:apkid:int}\)IMState\(%{NUMBER:imstate:int}\)机器ID\(%{NUMBER:mid:int}\)商户\(%{NUMBER:singerid:int}\)游客\(%{NUMBER:istemp:int}\)"] } } } else if( [type] == "billserver" ){ if( [message] =~ "人民币统计"){ mutate {replace => { "type" => "dubijiesuan" }} grok { #170208-10:00:28 Bill[40268] INFO: [人民币结算]时间(1486519228),用户ID(30581009),原来人民币(12567),现在人民币(16567),人民币操作(1),增加(4000),操作类型(19),操作详情(2),操作数量(0).描述:通用人民币操作 #170208-10:00:01 Bill[40268] INFO: [人民币结算]时间(1486519201),用户ID(22327945),原来人民币(2572),现在人民币(2532),人民币操作(2),扣除(40),操作类型(19),操作详情(15),操作数量(0).描述:通用人民币操作 match => [ "message", "(?<datetime>(?>\d{6}-\d\d:\d\d:\d\d)) Bill\[\d+\] INFO: \[人民币结算\]时间\(%{NUMBER:time:int}\),用户ID\(%{NUMBER:userid:int}\),原来人民币\(%{NUMBER:oldcoin:int}\),现在人民币\(%{NUMBER:currentcoin:int}\),人民币操作\(%{NUMBER:coinop:int}\),%{DATA:sop}\(%{NUMBER:coinnum:int}\),操作类型\(%{NUMBER:optype:int}\),操作详情\(%{NUMBER:opdetail:int}\),操作数量\(%{NUMBER:opnum:int}\).描述:%{DATA:sinfo}"] } } } else{ drop{} } date { match => ["datetime", "yyMMdd-HH:mm:ss"] } ruby { code => "event.timestamp.time.localtime" } ruby { code => "event.set('daytag',event.timestamp.time.localtime.strftime('%Y.%m.%d'))" remove_field => ["tags"] } } output { #stdout { # codec => plain { # charset => "UTF-8" # #charset => "GBK" # } #} #file { # path => "/tmp/logstash.log" # codec => json { # charset => "UTF-8" # } #} elasticsearch { hosts => ["127.0.0.1:19200"] index => "%{type}-%{daytag}" #index => "%{type}-%{+yyyy.MM.dd}" user => "logstashserver" password => "A950C0FB2D833E42C1AC59210CD5CDF8" } } ll /home/haoren/data/elasticsearch-5.0.2/ -rw-r--r-- 1 haoren haoren 9108 11月 24 10:05 README.textile -rw-r--r-- 1 haoren haoren 150 11月 24 10:05 NOTICE.txt -rw-r--r-- 1 haoren haoren 11358 11月 24 10:05 LICENSE.txt drwxr-xr-x 2 haoren haoren 4096 11月 24 10:10 plugins drwxr-xr-x 2 haoren haoren 4096 11月 24 10:10 lib drwxr-xr-x 12 haoren haoren 4096 11月 24 10:10 modules drwxrwxr-x 3 haoren haoren 4096 12月 1 03:18 data -rwxrwxr-x 1 haoren haoren 114 12月 1 03:30elasticsearch.sh -rw------- 1 haoren haoren 2197468100 12月 20 13:24 java_pid15072.hprof drwxr-xr-x 2 haoren haoren 4096 2月 9 03:58 bin drwxr-xr-x 3 haoren haoren 4096 3月 1 07:58 config drwxrwxr-x 2 haoren haoren 4096 3月 11 16:00 logs cat /home/haoren/data/elasticsearch-5.0.2/elasticsearch.sh #!/bin/bash cd /home/haoren/data/elasticsearch-5.0.2/ /home/haoren/data/elasticsearch-5.0.2/bin/elasticsearch -d grep -v "#" /home/haoren/data/elasticsearch-5.0.2/config/jvm.options -Xms4g -Xmx4g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -server -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError grep -v "#" /home/haoren/data/elasticsearch-5.0.2/config/elasticsearch.yml cluster.name: es-5.0-haoren node.name: node-18 network.host: 0.0.0.0 http.port: 19200 http.cors.enabled: true http.cors.allow-origin: "*" cat /home/haoren/data/elasticsearch-5.0.2/config/log4j2.properties status = error # log action execution errors for easier debugging logger.action.name = org.elasticsearch.action logger.action.level = debug appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n appender.rolling.type = RollingFile appender.rolling.name = rolling appender.rolling.fileName = ${sys:es.logs}.log appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n appender.rolling.filePattern = ${sys:es.logs}-%d{yyyy-MM-dd}.log appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true rootLogger.level = info rootLogger.appenderRef.console.ref = console rootLogger.appenderRef.rolling.ref = rolling appender.deprecation_rolling.type = RollingFile appender.deprecation_rolling.name = deprecation_rolling appender.deprecation_rolling.fileName = ${sys:es.logs}_deprecation.log appender.deprecation_rolling.layout.type = PatternLayout appender.deprecation_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n appender.deprecation_rolling.filePattern = ${sys:es.logs}_deprecation-%i.log.gz appender.deprecation_rolling.policies.type = Policies appender.deprecation_rolling.policies.size.type = SizeBasedTriggeringPolicy appender.deprecation_rolling.policies.size.size = 1GB appender.deprecation_rolling.strategy.type = DefaultRolloverStrategy appender.deprecation_rolling.strategy.max = 4 logger.deprecation.name = org.elasticsearch.deprecation logger.deprecation.level = warn logger.deprecation.appenderRef.deprecation_rolling.ref = deprecation_rolling logger.deprecation.additivity = false appender.index_search_slowlog_rolling.type = RollingFile appender.index_search_slowlog_rolling.name = index_search_slowlog_rolling appender.index_search_slowlog_rolling.fileName = ${sys:es.logs}_index_search_slowlog.log appender.index_search_slowlog_rolling.layout.type = PatternLayout appender.index_search_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs}_index_search_slowlog-%d{yyyy-MM-dd}.log appender.index_search_slowlog_rolling.policies.type = Policies appender.index_search_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy appender.index_search_slowlog_rolling.policies.time.interval = 1 appender.index_search_slowlog_rolling.policies.time.modulate = true logger.index_search_slowlog_rolling.name = index.search.slowlog logger.index_search_slowlog_rolling.level = trace logger.index_search_slowlog_rolling.appenderRef.index_search_slowlog_rolling.ref = index_search_slowlog_rolling logger.index_search_slowlog_rolling.additivity = false appender.index_indexing_slowlog_rolling.type = RollingFile appender.index_indexing_slowlog_rolling.name = index_indexing_slowlog_rolling appender.index_indexing_slowlog_rolling.fileName = ${sys:es.logs}_index_indexing_slowlog.log appender.index_indexing_slowlog_rolling.layout.type = PatternLayout appender.index_indexing_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n appender.index_indexing_slowlog_rolling.filePattern = ${sys:es.logs}_index_indexing_slowlog-%d{yyyy-MM-dd}.log appender.index_indexing_slowlog_rolling.policies.type = Policies appender.index_indexing_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy appender.index_indexing_slowlog_rolling.policies.time.interval = 1 appender.index_indexing_slowlog_rolling.policies.time.modulate = true logger.index_indexing_slowlog.name = index.indexing.slowlog.index logger.index_indexing_slowlog.level = trace logger.index_indexing_slowlog.appenderRef.index_indexing_slowlog_rolling.ref = index_indexing_slowlog_rolling logger.index_indexing_slowlog.additivity = false ll -rt /home/haoren/data/kibana-5.0.2-linux-x86_64/ drwxrwxr-x 2 haoren haoren 4096 11月 24 10:16 webpackShims drwxrwxr-x 9 haoren haoren 4096 11月 24 10:16 src -rw-rw-r-- 1 haoren haoren 4962 11月 24 10:16 README.txt drwxrwxr-x 2 haoren haoren 4096 11月 24 10:16 plugins -rw-rw-r-- 1 haoren haoren 701 11月 24 10:16 package.json drwxrwxr-x 3 haoren haoren 4096 11月 24 10:16 optimize drwxrwxr-x 472 haoren haoren 20480 11月 24 10:16 node_modules drwxrwxr-x 6 haoren haoren 4096 11月 24 10:16 node -rw-rw-r-- 1 haoren haoren 562 11月 24 10:16 LICENSE.txt drwxrwxr-x 2 haoren haoren 4096 11月 24 10:16 bin drwxrwxr-x 2 haoren haoren 4096 12月 1 03:44 data -rwxrwxr-x 1 haoren haoren 123 12月 1 06:07kibana.sh drwxrwxr-x 2 haoren haoren 4096 2月 8 12:25 config 启动/home/haoren/data/kibana-5.0.2-linux-x86_64/kibana.sh #!/bin/bash cd /home/haoren/data/kibana-5.0.2-linux-x86_64 /home/haoren/data/kibana-5.0.2-linux-x86_64/bin/kibana serve & cat /home/haoren/data/kibana-5.0.2-linux-x86_64/config/kibana.yml server.port: 15602 server.host: "0.0.0.0" elasticsearch.url: "http://222.192.63.12:19200" 本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1905497,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册