前言

文件系统当中如果某些文件不见了,有什么办法判断是删除了还是自己不见了,这个就需要去日志里面定位了,通常情况下是去翻日志,而日志是会进行压缩的,并且查找起来非常的不方便,还有可能并没有开启

这个时候就需要日志系统了,最近正好看到一篇最佳日志实践(v2.0),一篇非常好的文章,本篇日志属于文章里面所提到的统计日志,统计客户端做了什么操作

对于日志系统来说,很重要的一点,能够很方便的进行查询,这就需要对日志信息进行一些处理了,怎么处理就是设计问题,要求就是不多不少

结构

其中graylog配置部分在这篇使用日志系统graylog获取Ceph集群状态,根据这篇的操作,配置出12201的udp监听端口即可,剩余部分就是本篇中的配置

配置

集群的配置

需要对MDS的配置进行debug_ms=1,在/etc/ceph/ceph.conf当中添加下面配置

[mds.lab8106]
debug_ms=1
hostname=lab8106

这个地方集群的文件操作日志是记录在message里面的1级别的,所以把mds的debug_ms开到1

日志长这个样子:

2017-07-13 11:26:23.703624 7fc3128c3700  1 -- 192.168.8.106:6804/3280969928 <== client.14180 192.168.8.106:0/1092795882 2384 ==== client_request(client.14180:2346 mkdir #1/ppop 2017-07-13 11:26:23.702532 caller_uid=0, caller_gid=0{}) v2 ==== 170+0+0 (843685338 0 0) 0x5645ec243600 con 0x5645ec247000

下面会对这个日志进行提取

下载logstash

https://artifacts.elastic.co/downloads/logstash/logstash-5.5.0.rpm
[root@lab8106 ~]# rpm -ivh logstash-5.5.0.rpm

修改启动进程为root权限

修改/etc/systemd/system/logstash.service文件当中的

User=root
Group=root

因为logstash需要本地文件的读取权限,这里是为了方便直接给的root权限,方便使用,如果对权限要求比较严的环境,就给文件

创建一个配置文件

vim /etc/logstash/conf.d/logstash.conf

添加下面的配置文件,这个配置文件包含的内容比较多,会在后面详细的介绍下处理过程

input {
file {
path => "/var/log/ceph/ceph-mds.*.log"
}
} filter {
grok {
match =>{"message" => "%{TIMESTAMP_ISO8601:logtime} %{BASE16FLOAT} %{BASE10NUM} -- %{HOSTPORT:mdsip}%{NOTSPACE} <== %{NOTSPACE:clientid} %{IP:clientip}%{NOTSPACE} %{INT} ==== client_request\(%{NOTSPACE} %{WORD:do} %{NOTSPACE:where} %{TIMES
TAMP_ISO8601:dotime}%{GREEDYDATA}"}
overwrite => ["message"]
remove_field =>["logtime"]
} if ![dotime] {
drop {}
}
if [do] == "mkdir" {
mutate {
replace => { "do" => "创建目录"}
}
}
if [do] == "create" {
mutate {
replace => { "do" => "创建文件"}
}
}
if [do] == "unlink" {
mutate {
replace => { "do" => "删除文件"}
}
}
if [do] == "rmdir" {
mutate {
replace => { "do" => "删除目录"}
}
}
if [do] == "rename" {
mutate {
replace => { "do" => "重命名"}
}
}
if [do] == "symlink" {
mutate {
replace => { "do" => "链接"}
}
}
if [do] == "unlink"{
mutate {
replace => { "do" => "删除链接"}
}
}
mutate {
replace => { "message" => "time:%{dotime} ClientIp:%{clientip} ClintId:%{clientid} MdsIp: %{mdsip} do:%{do} where:%{where}"}
}
date {
match => [ "dotime", "yyyy-MM-dd HH:mm:ss.SSSSSS"]
target => "@timestamp"
}
} output {
gelf {
host => "192.168.8.106"
} stdout { codec => json_lines}
}

处理后的日志是这个样子:

{"path":"/var/log/ceph/ceph-mds.lab8106.log","@timestamp":"2017-07-13T04:01:01.251Z","clientid":"client.14180","clientip":"192.168.8.106","@version":"1","host":"lab8106","where":"#1/test1","do":"创建目录","message":"time:2017-07-13 12:01:01.251358 ClientIp:192.168.8.106 ClintId:client.14180 MdsIp: 192.168.8.106:6804 do:创建目录 where:#1/test1","mdsip":"192.168.8.106:6804","dotime":"2017-07-13 12:01:01.251358"}

是一个json形式的,可以根据自己的需要增加减少字段,这些信息都会传递到graylog当中

解析配置文件

logstash配置文件的结构包括三个大模块:

  • input
  • filter
  • output

input是文件的来源,也就是我们需要解析的日志,filter是处理日志的模块,output是输出的模块,这里我们需要使用的是gelf的输出模式,在本地进行调试的时候,可以开启stdout来进行调试

采用grok进行正则匹配,这个里面的匹配正则可以用 http://grokconstructor.appspot.com/do/construction 这个进行正则表达式的验证和书写,可以一步步的进行匹配,还是很方便的工具

output输出gelf的信息流

grok内部解析

  • remove_field可以用来删除无用的字段
  • if ![dotime] 这个是用来过滤消息的,如果没拿到这个值,也就是没匹配上的时候,就把消息丢弃
  • 使用mutate replace模块来进行字段的替换,将固定操作转换为中文
  • 使用mutate replace模块来重写message,根据自己定义的格式进行输出
  • 使用date 模块进行@timestamp的重写,将日志内的时间写入到这个里面

查询插件

/usr/share/logstash/bin/logstash-plugin list

logstash-output-gelf默认没有安装的,需要安装一下

/usr/share/logstash/bin/logstash-plugin install logstash-output-gelf

这个安装可能有点慢,稍微多等一下

调试方式的启动

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf

如果调试完毕了后就用系统命令启动

[root@lab8106 ~]# systemctl restart logstash

通过graylog系统就可以很方便的看到日志里面节获取的内容了

总结

对于一套系统来说,日志系统是一个很重要的组成部分,可以更好的掌握系统内部的运行情况,并不是说出了问题再去找日志,这个日志的需求来源其实很简单

哪个客户端对着哪个MDS做了一个什么操作

然后就可以用这个搜索引擎去进行相关的搜索了,可以查询一段时间创建了多少文件,是不是删除了哪个文件

本次实践的难点在于logstash对日志的相关解析的操作,掌握了方法以后,对于其他日志的提取也可以用类似的方法,提取自己需要的信息,然后进行整合,输出到一个系统当中,剩下的就是在界面上获取信息

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-07-13

Cephfs 操作输出到日志查询系统的更多相关文章

  1. Python Django项目日志查询系统

    该项目适合中小型公司日志查询工作.大型公司可以使用elk等.该系统其实就是调用了absible命令去查日志,然后把输出的信息输到页面查看. 日志查询系统 维护手册 作者:陈土锋 日期:2020年6月1 ...

  2. ELK入门级介绍--打造实时日志查询系统

    这几天一直在研究ElasticSearch,在网上看到一篇好的文章和大家分享. ELK平台介绍 在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段: 以下内容来自:http://baidu.b ...

  3. Kibana+Logstash+Elasticsearch 日志查询系统

    搭建该平台的目的就是为了运维.研发很方便的进行日志的查询.Kibana一个免费的web壳:Logstash集成各种收集日志插件,还是一个比较优秀的正则切割日志工具:Elasticsearch一个开源的 ...

  4. 阿里云 oss实时日志查询

    实时日志查询 更新时间:2019-01-29 10:31:49 编辑 · 本页目录 开启实时日志查询 查询实时日志 参考文档 用户在访问 OSS 的过程中,会产生大量的访问日志.实时日志查询功能将 O ...

  5. Log4j 输出的日志中时间比系统时间少了8小时的解决方法,log4j日志文件重复输出

    1. 第一个问题:时间少了8小时 Log4j 输出的日志中,时间比系统时间少了8小时,但是 eclipse 控制台输出的日志的时间却是对的. log4j配置如下: #all logger output ...

  6. Es+kafka搭建日志存储查询系统(设计)

    现在使用的比较常用的日志分析系统有Splunk和Elk,Splunk功能齐全,处理能力强,但是是商用项目,而且收费高.Elk则是Splunk项目的一个开源实现,Elk是ElasticSearch(Es ...

  7. flume分布式日志收集系统操作

    1.flume是分布式的日志收集系统,把收集来的数据传送到目的地去. 2.flume里面有个核心概念,叫做agent.agent是一个java进程,运行在日志收集节点. 3.agent里面包含3个核心 ...

  8. ELK+kafka构建日志收集系统

    ELK+kafka构建日志收集系统   原文  http://lx.wxqrcode.com/index.php/post/101.html   背景: 最近线上上了ELK,但是只用了一台Redis在 ...

  9. ELK日志分析系统的应用

    收集和分析日志是应用开发中至关重要的一环,互联网大规模.分布式的特性决定了日志的源头越来越分散, 产生的速度越来越快,传统的手段和工具显得日益力不从心.在规模化场景下,grep.awk 无法快速发挥作 ...

随机推荐

  1. 非科班8k,靠这套知识体系收入暴涨100%!

    我是18年毕业,非科班,毕业即进入互联网行业.坐标深圳,java程序员,当时到手薪资8k左右. bat等大厂月薪薪资动辄20k,25k,还不包括"签字费",福利和奖金.当然,薪资也 ...

  2. oh my zsh 安装

    date: "2020-10-18T12:36:00+08:00" title: "oh my zsh 安装" tags: ["zsh",& ...

  3. win8怎样才能启用administrator登录 别的用户也是如此

    但是你可以用命令调出administrator账户打开C盘,打开windows文件夹,再打开system32文件夹,找到cmd.exe右键点击选择以管理员身份运行 在里面输入net user admi ...

  4. Python可迭代对象和迭代器对象

    可迭代对象iterable: 对象字面意思:Python中一切皆对象.一个实实在在存在的值. 可迭代:更新迭代.迭代是一个重复的过程,每次重复是基于上一次的结果而继续的,每次都有新的内容. 可迭代对象 ...

  5. OpenCV开发笔记(七十一):红胖子8分钟带你深入级联分类器训练

    前言   红胖子,来也!  做图像处理,经常头痛的是明明分离出来了(非颜色的),分为几块区域,那怎么知道这几块区域到底哪一块是我们需要的,那么这部分就涉及到需要识别了.  识别可以自己写模板匹配.特征 ...

  6. Linux基础命令列表

    命令列表 A alias apt apt-get arp -n -s arping ab B bc basename bash -n -x bzip2 bunzip2 bzcat blkid brct ...

  7. 循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

    在很多应用中,往往都涉及到记录用户所在省份.城市.区县或者街道等信息,一般我们可以通过联动的Select或者类似的界面组件进行展示,或者使用Element中的el-cascader界面组件进行展示,而 ...

  8. 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)

    1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...

  9. python中拿不到字典value值得问题解决

    在python项目的练习中,根据字典的key值get不到value值,如图所示: 最后,将user = self.allUsers.get(cardNum)改成user = self.allUsers ...

  10. Triple的使用

    public Triple<Long, Long, Double> getCarRunSummary(String did, Date startDate, Date endDate) { ...