命令行日志查看神器:lnav

lnav, 不需要服务端,不需要设置,仍然功能强大到没有朋友。 速度与性能 lnav是一个可以运行在终端上的日志分析工具。功能非常强大,如果grep和tail等命令无法满足你的需求,或许你可以尝试一下lnav。 lnav的官方仓库是https://github.com/tstack/lnav,在mac上可以使用 brew install lnav 命令安装这个命令。 在我的4C8G的Macbook Pro上,打开一个2.8G的日志文件到渲染出现,需要花费约40s,平均每秒载入超过70MB。载入日志和渲染时,使用了接近100%的CPU。渲染完毕,使用1.2G的内存空间。 总之呢,这个工具载入日志的速度很快。但是最好不要再生产环境上使用这个命令载入过大的日志文件,否则可能造成系统资源消耗太大的问题。 在载入2.8G的日志文件后(3200多万行),过滤时显得非常卡顿,但是查看日志并不卡顿。 在lnav的搜索关键字,下次打开其他日志时,lnav会自动搜索这个关键词。这是它的Session记录功能,可以使用Ctrl+R重置Session。 lnav的特点 语法高亮 各种过滤条件 多关键词过滤 各种快捷跳转 自带统计和可视化功能,比如使用条形图展示单位时间内的报错和日志数量 自动日志格式检查。支持很多种日志格式 能够按照时间去过滤日志 TAB自动补全 实时操作 支持SQL语法查日志 支持文件导出成其他格式 支持直接打开tar.gz等压缩后的日志文件 支持很多快捷键 x下面是按天的日志统计,灰色是普通日志,黄色是告警日志,红色的错误日志。三种颜色叠加的长度就是总日志。时间跨度单位也是可以调节的。最大跨度是一天,最短跨度是1秒。 仍然是日志格式 自动日志格式检测 系统日志 Web服务器访问日志 报错日志 等等 过滤 可以设置多个过滤规则 时间线过滤 精确时间的日志 上个小时,下个小时 上一分钟,下一分钟 能够按照时间去追踪日志 按照时间周期统计 统计每秒出现的错误,告警和总日志的量 语法高亮 Tab键自动补全 参考 https://lnav.readthedocs.io/en/latest/ 如果你更喜欢GUI工具,那也可以试试https://github.com/nickbnf/glogg 后记 最近因为工作需要,每天都会去排查很多的日志文件。我也曾想过装ELK之类的工具,但是我收到是文件。日志文件要转存到ELK中也要花功夫。另外ELK也是非常耗费资源的。ELK部署到一半我就果断放弃了。 与其南辕北辙,不如回归本质。找些命令行的小工具直接分析日志文件。

2020-03-13 21:48:40 · 1 min · Eddie Wang

如何烧肉才好吃

1. 选肉 **猪肉,肥瘦相间的五花肉才最好吃。**精瘦肉吃起来会太柴,太肥的肉会显得太腻。五花肉则刚刚好,不柴也不腻。 2. 炒干 烧好的猪肉中如果有生水的味道,则口感不好,而且会显得肉不够熟。 3. 具体步骤 五花肉洗净,切片。放入干净的炒锅中,然后开火烧 将五花肉的水分烧干,并且冒油,肉面发黄 放入姜葱蒜,小米椒,加入生抽,料酒,食盐爆炒。如果猪油比较少,则可以放入适量食用油 然后可以按需加入蔬菜。例如花菜、或者芹菜、或者小青椒 炒到蔬菜9成熟,然后出锅

2020-02-26 20:37:52 · 1 min · Eddie Wang

我的数据可视化处理过程

数据规整 我的数据来源一般都是来自于日志文件,不同的日志文件格式可能都不相同。所以第一步就是把数据抽取出来,并且格式化。 一般情况下我会用grep或者awk进行初步的整理。如果shell脚本处理不太方便,通常我会写个js脚本。 Node.js的readline可以实现按行取出。处理过后的输出依然是写文件。 const readline = require('readline') const fs = require('fs') const dayjs = require('dayjs') const fileName = 'data.log' const batch = dayjs().format('MMDDHHmmss') const dist = fs.createWriteStream(`${fileName}.out`) const rl = readline.createInterface({ input: fs.createReadStream(fileName) }) rl.on('line', handlerLine) function handlerLine (line) { let info = line.split(' ') let time = dayjs(`2020-${info[0]} ${info[1]}`).valueOf() let log = `rtpproxy,tag=b${batch} socket=${info[2]},mem=${info[3]} ${time}000000\n` console.log(log) dist.write(log) } 输出的文件格式如下,至于为什么是这种格式,且看下文分晓。 rtpproxy,tag=b0216014954 socket=691,mem=3106936 1581477499000000000 rtpproxy,tag=b0216014954 socket=615,mem=3109328 1581477648000000000 rtpproxy,tag=b0216014954 socket=669,mem=3113764 1581477901000000000 rtpproxy,tag=b0216014954 socket=701,mem=3114820 1581477961000000000 数据导入 以前我都会把数据规整后的输出写成一个JSON文件,然后写html页面,引入Echarts库,进行数据可视化。 但是这种方式过于繁琐,每次都要写个Echars的Options。 所以我想,如果把数据写入influxdb,然后用grafana去做可视化,那岂不是十分方便。 所以,我们要把数据导入influxdb。 启动influxdb grafana 下面是一个Makefile, 用来启动容器。 make create-network 用来创建两个容器的网络,这样grafana就可以通过容器名访问influxdb了。 make run-influxdb 启动influxdb,其中8086端口是influxdb对外提供服务的端口 make run-grafana 启动grafana, 其中3000端口是grafana对外提供服务的端口 run-influxdb: docker run -d -p 8083:8083 -p 8086:8086 --network b2 --name influxdb influxdb:latest run-grafana: docker run -d --name grafana --network b2 -p 3000:3000 grafana/grafana create-network: docker network create -d bridge --ip-range=192.168.1.0/24 --gateway=192.168.1.1 --subnet=192.168.1.0/24 b2 接着你打开localhost:3000端口,输入默认的用户名密码 admin/amdin来登录 ...

2020-02-16 14:55:15 · 1 min · Eddie Wang

故障的特征分析方法

特征维度 特征项 集中 无规律 周期性 时间 集中在某个时间点发生 按固定时间间隔发生 空间 集中在某个空间发生 人物 集中在某个人物身上发生

2020-02-14 20:08:17 · 1 min · Eddie Wang

我走过的nginx反向代理的坑

下文的论述都以下面的配置为例子 location ^~ /p/security { rewrite /p/security/(.*) /security/$1 break; proxy_pass http://security:8080; proxy_redirect off; proxy_set_header Host $host; add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Credentials' 'true' always; } 如果dns无法解析,nginx则无法启动 security如果无法解析,那么nginx则无法启动 DNS缓存问题: nginx启动时,如果将security dns解析为1.2.3.4。如果security的ip地址变了。nginx不会自动解析新的ip地址,导致反向代理报错504。 反向代理的DNS缓存问题务必重视 跨域头配置的always 反向代理一般都是希望允许跨域的。如果不加always,那么只会对成功的请求加跨域头,失败的请求则不会。 关于**‘Access-Control-Allow-Origin’ ‘*’,如果后端服务本身就带有这个头,那么如果你在nginx中再添加这个头,就会在浏览器中遇到下面的报错。而解决办法就是不要在nginx中设置这个头。** Access to fetch at 'http://192.168.40.107:31088/p/security/v2/login' from origin 'http://localhost:5000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. 参考链接 http://nginx.org/en/docs/http/ngx_http_headers_module.html http://www.hxs.biz/html/20180425122255.html https://blog.csdn.net/xiojing825/article/details/83383524 https://cloud.tencent.com/developer/article/1470375 https://blog.csdn.net/bbg221/article/details/79886979

2020-02-13 21:21:13 · 1 min · Eddie Wang

kindle阅读器的寿命

2018年1月26日,我在京东上买了一个Kindle Paperwhite, 距离今天,大概已经2年多一点了。 我是一个重度读者,每天都会花上一些时间去阅读。最近两天发现,本来可以连续两周不用充电的kindle。基本上现在是电量以每天50%的速度减少。或许,2年,就是kindle的寿命。 刚开始读书总觉得没有什么进度,后来我就喜欢把每天读书的进度给记录下来。这样做的好处是能够督促我不要偷懒, 我读书有个习惯,每天以至少1%的进度去读一本书,并且我会将进度记录下来。基本上,我每天会读7-8本书的1%。 两年时间内我读过的书,要比我从小学到大学读过的书都要多。

2020-02-04 09:12:29 · 1 min · Eddie Wang

论禹三过家门而不入的真实原因

最早听说“三过家门而不入”,是说禹治水大公无私,路过家门都没有回家。 最近看到史记,发现这句话原本是 禹伤先人父鲧(发音和滚相同)功之不成受诛,乃劳身焦思,居外十三年,过家门不敢入 “三过家门而不入"这个短语中, 与原文少一个“敢”字,少了一个字,含义差距很大。 没有敢字,说明是自己主动的。加上敢字,则会让人思考。禹为什么不敢回家?他在怕什么呢? 这里就需要提到禹的父亲鲧。 鲧治水九年,没有把水治理好。在舜巡视的时候,被赐死在羽山。 舜登用,摄行天子之政,巡狩。行视鲧之治水无状,乃殛(发音和即相同)鲧于羽山以死 所以,如果禹治不好水,你想禹的下场是什么?

2020-01-09 13:43:47 · 1 min · Eddie Wang

进程实战

2019-12-18 09:10:04 · 0 min · Eddie Wang

docker slim

2019-12-14 11:32:27 · 0 min · Eddie Wang

wifi工作模式测试

路由器无线网络的模式有11b only ,11g only, 11n only,11bg mixed,11bgn mixed 11b:就是11M 11g:就是54M 11n:就是150M或者300M only:在此模式下,频道仅使用 802.11b标准mixed:支持混合 802.11b 和 802.11g 装置 修改路由器工作模式后,手机连接wifi,然后用腾讯手机管家对WiFi测速 工作模式 下载速度 11b 200kb/s 11g 400kb/s 11n 1.1MB/s 11bgn mixed 2.06MB/s 所以,选择11bgn是个不错的选择。

2019-12-12 10:11:47 · 1 min · Eddie Wang