Nginx 日志按天分割

nginx 日志分割是比较常见的运维工作,关于这方面的文章也很多,通常无外乎两种做法:

  1. cron定期执行shell脚本对日志文件进行归档。
  2. 使用专门日志归档logrotate。

以上方式与nginx其实没有特别的关系。 从nginx 0.7.6 版本开始,access_log 的路径配置可以包含变量,我们以此进行日志分割。

同时我们基于nginx的 timeiso8601 内嵌变量来获取时间。time_iso8601格式如下:

2018-09-21T16:01:02+02:00

然后使用正则表达式来获取所需时间的数据。

http {
  log_format default_format '$remote_addr - $remote_user [$time_iso8601] "$request" '
      '$status $body_bytes_sent "$http_referer" '
      '"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
      
      
      server {
          listen 443 ssl;
          ... ...
          if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
            set $tttt $1;
          }
          
          access_log /log/blog_access_$tttt.log;
      }
}

主要关注两个地方:

  1. 要在外方法的log_format上添加 $time_iso8601 ,将原来的time_local修改为time_iso8601。
  2. 在单个server中,通过正则表达式截取 $time_iso8601 生成时间戳。

最后插一个话题,你知道 $time_iso8601 为什么叫这个名字吗?

国际标准ISO 8601,是国际标准化组织的日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。目前是2004年12月1日发行的第三版“ISO8601:2004”以替代1998年的第一版“ISO8601:1998”与2000年的第二版“ISO8601:2000”。


GoAccess:轻量级nginx日志分析工具

什么是GoAccess

GoAccess是一个开源的基于终端的快速日志分析器。 Github地址:https://github.com/allinurl/goaccess 官网地址: https://goaccess.io/ 说明文档: https://goaccess.io/man

中国站:https://goaccess.cc/

它既支持命令行界面,也可以输出html界面。

为什么选择 GoAccess

其实一开始我是锚定了 ELK/EFK 技术栈的,因为在公司已经在使用这一套了,效果确实也很好。但自己安装后发现,作为个人开发者,钱少+运维成本高,还是先暂时远离 elastic 这一套技术栈了,goaccess 开箱即用、够用就好。

GoAccess界面

1576306600313

1576306703602

使用

一般来说,我现在使用软件都不会再进行安装了,全部使用容器化方式运行,更好管理。

对goaccess我也是用容器化方式部署。

1 创建目录结构

goaccess/
├── data
│   └── goaccess.conf
├── docker-compose.yml
└── report
    └── a.html
└── logs
    └── a.log
    └── b.log

/goaccess.conf: goaccess 配置文件

/docker-compose.yml: docker-compose 配置

/logs/a.log: 待分析的 nginx 日志文件

/report/index.html: 分析出的报告文件,通过 nginx 访问

2 docker-compose.yml 文件

version: "3.2"
services:
  goaccess:
    image: kelvinblood/goaccess:v201912
    network_mode: bridge
    container_name: goaccess
#    command:
#    - goaccess
#    - --no-global-config
#    - --config-file=/srv/data/goaccess.conf
#    - --num-tests=0
    entrypoint: ["/bin/sh"]
    tty: true
    volumes:
    - ./data:/srv/data
    - ./report:/srv/report
    - ./logs:/srv/logs
    - /etc/localtime:/etc/localtime:ro
    - /etc/timezone:/etc/timezone:ro

有几点需要注意的:

  1. 通过时区设置,使导出的文件与本地时间相同。
  2. 我自己编译了一个 goaccess 版本,主要用于中文输出,在dockerfile中设置了 ENV LANG zh_CN.UTF-8 配置。
  3. 我设置了默认不运行,通过 docker exec 的方式导出分析文件,所以修改了默认的 entrypoint。

3. goaccess配置

在默认的配置文件后增加三行配置:

time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

同时修改 nginx 的日志格式,参考这一篇文章——《Nginx 日志按天分割》 中log_format的部分。

goaccess默认配置文件可在容器中获得,位于/etc/goaccess/goaccess.conf,可以先运行容器后再copy出来:

docker-compose up -d
docker exec -it goaccess /bin/sh
cp /etc/goaccess/goaccess.conf /src/data

1576308588084

最后在配置文件末添加刚才提到的三行配置。

4. 根据日志文件导出分析结果

在这里血衫对日志做了按天分割,你有需求也可以依葫芦画瓢,或者把我日期部分忽略掉即可:

time=`date "+%Y-%m-%d"`

docker exec goaccess goaccess --no-global-config --config-file=/srv/data/goaccess.conf --output=/srv/report/a_$time.html --log-file=/srv/logs/a_$time.log

# 如果没有日期分割,使用以下命令
docker exec goaccess goaccess --no-global-config --config-file=/srv/data/goaccess.conf --output=/srv/report/a.html --log-file=/srv/logs/a.log

# 如果要同时分析多个文件:
docker exec goaccess goaccess --no-global-config --config-file=/srv/data/goaccess.conf --output=/srv/report/a.html -f a.log b.log c.log

结合 Linux 的定时任务,你还可以设计一个自动更新的统计。

参考资料


kubernetes 集群中的5秒 DNS 延迟

这是个讨论了很久的问题,网上也有很多文章讨论出了结果。因为近期也遇上了这样的问题,将问题解决过程记录下来。

一、问题

一个新搭建的环境,在进行系统各项指标测试时,发现dns解析有延迟:

«https://k8smeetup.github.io/docs/tasks/administer-cluster/dns-debugging-resolution/»

运行命令:

kubectl exec -it busybox-check-dns-bjp -n monitor -- nslookup kubernetes.default 10.190.0.10

可以明显看到解析延迟。

添加 time 命令,可以看到dns解析延迟为5s,10s,15s等规律的延迟。

1572926381234

运行的busybox为 busybox:1.28.4.


梅宏院士:软件定义的未来 ——万物皆可互联,一切均可编程 - CNCC 2017

感谢大会给的这个机会!近几年中,我在不同的场合也做了很多不同的报告,但是这几年都是被动地被拉去讲大数据,后来想想,差点把自己的主业忘了。现在软件很重要,我们每天的生活都离不开软件,可能大多数人每天早上起床的第一件事儿就是打开某个APP。所以我今年给自己订了一个小目标,但凡有机会做报告,我就只讲软件,也是为本行业的人呼吁一下,所以我今天讲的题目很大,软件定义一切。

无处不在的软件

“软件定义一切”并不是我说的,我要是这么说可能把咱们今天在座的很多同行都给得罪了。我是想借这个题目讲一讲软件的三个阶段。第一个题目我想大家都认可,软件已经无处不在,第二个题目是软件定义的时代。我们正在进入一个新的时代,刚刚过去的十九大讲是中华民族复兴的时代,我是从信息技术对人类社会的改造这个角度来谈这个新时代,不同的人从不同的角度也给了这个时代不同的赋名。从基础设施视角来看,这是一个互联网+时代;从计算模式视角来看,这是一个云计算时代;从信息资源视角来看,这是一个大数据时代;从信息应用视角来看,这是智能化时代。我想说在这些里面有一项很重要的技术,那就是软件。某种意义上来说,我们这个时代就是一个软件定义的时代。

梅宏院士:软件定义的未来——万物皆可互联,一切均可编程

软件产业呈持续增长态势。从国内来看,国家工信部公布的2012年到2016年的五年数据中,软件和信息技术服务业始终保持高增长,在电子信息行业的比重也在不断上升。2008年金融危机开始以后,很多行业都在下滑,而信息技术行业还在保持增长,而软件行业的增长又是远远高于信息技术其他的比重。从国际上来看,全球有19个国家软件支出占国内生产总值的比重超过0.5%,其中美国已经超过1%。这个产业规模一直在保持增长。第二个软件从业的人数,2014年全球ICT技术工人约为2900万人,其中专业软件开发人员约1100万人。国家工信部给出的近五年数据中,软件从业人数也在逐年增长,2016年达到576万人。但如果换一个视角,从开源社区来看,比如程序员经常去的一个软件问答网站stack overflow,注册3200万人,其中超过2500万人是多次访问。再比如CSDN,注册用户达2500万,活跃用户超过800万。它们普遍都要比工信部公布的数据高,这说明和软件相关的从业人数有很多。

回顾过去计算机软件发展,我认为大概可以分为三个阶段。第一个是1946到1975中期,是软硬一体化阶段。第二个是1975年以后,软件产品化、产业化阶段;第三个是1995年以后,软件的网络化、服务化阶段。

梅宏院士:软件定义的未来——万物皆可互联,一切均可编程

我想讲一讲这三个阶段的大体特征。在软硬一体化阶段,也就是计算机刚出现的时候,是没有软件的,都是以程序实现的,大体上展现方式的是机器语言,汇编语言。早期应用领域以破解密码,军事领域的计算为主。60年代初期,开始出现“软件”一词,融合程序和文档为一体,作为独立的形态从硬件分离出来,以IBM 360系列机为代表(尽管还是和硬件捆版一起销售),也逐渐形成了计算机学科和程序员行业。它的展性形式是高级程序语言+文档,应用领域主要是商业计算和其他科学计算领域。软件产品化、产业化阶段,以Microsoft和Oracle的出现,标志着软件开始成为一个独立产业。PC的广泛应用和软件产品化催生了人类历史上信息化的第一波浪潮,其主要特征即以单机应用为特征的数字化阶段。紧接着就出现了办公软件,彻底改变了人类传统的办公行为,微软office迄今依然是微软标志性产品之一。九十年代中期开始 ,软件进入网络化,服务化阶段。互联网推动了软件从单机向网络计算环境的延伸,带来了信息化的第二波浪潮 ,其基本特征是以联网应用为特征的网络化阶段。


数据可视化的方法、工具和应用 - 林骥

1. 数据可视化简介

数据可视化,是指用图形的方式来展现数据,从而更加清晰有效地传递信息,主要方法包括图表类型的选择和图表设计的准则。随着互联网的广泛应用,我们的工作和生活等各个方面,每时每刻都在产生大量的数据,也就是所谓的「大数据时代」,发展的趋势是人们越来越喜欢用数据说话。

数据可视化作为一种有效传递信息的手段,被越来越广泛地应用到很多领域。一个比较典型的案例,是淘宝双十一的数据可视化,在一块大屏幕上实时动态展示交易数据,使用的数据可视化工具是阿里云出品的 DataV,体现了阿里巴巴用数据驱动运营的一种探索。

如果想要让数据发挥更大的价值,那么合理地运用数据可视化的方法和工具就显得特别重要。

2. 数据可视化的图表选择

根据数据分析的实际情况,需要有针对性地选择合适的数据可视化方法。但是可视化的图表花样繁多,我们应该如何选择并设计你的图表呢?下面这张图最早是从刘万祥老师的公众号「Excel图表之道」上发现的,原图来自于 http://chart.guide,我做了一点修改。

img

本文将把它拆分为 8 个部分,逐一进行介绍。

(1) 当你需要对不同的类别进行比较时,有很多种图形可供选择,其中条形图是最常见的,垂直瀑布图适合用来比较并分析各个组成部分的变化情况,词云图适用于大量文本的分析和比较。

img

(2) 当你想要直观反映关键业绩指标随时间的变化情况时,用柱形图或曲线图是比较好的选择。建议不要用面积图,因为可视化的目标应该不仅仅只是为了视觉上的好看,准确有效地传递信息更加重要。