日志服务的总结

编程

 

一、日志(Log)

日志(Log)是系统在运行过程中变化的一种抽象,其内容为指定对象的某些操作和其操作结果按时间的有序集合。文件日志(LogFile)、事件(Event)、数据库日志(BinLog)、度量(Metric)数据都是日志的不同载体。在文件日志中,每个日志文件由一条或多条日志组成,每条日志描述了一次单独的系统事件,是日志服务中处理的最小数据单元。

二、日志服务

Log Service是针对日志类数据的一站式服务。

1.实时采集与消费(LogHub)

用途:数据清洗(ETL)、流计算(Stream Compute)、监控与报警、 机器学习与迭代计算。

2.查询与实时分析(Search/Analytics)

用途:DevOps/线上运维,日志实时数据分析,安全诊断与分析,运营与客服系统

3.投递数仓(LogShipper)

用途:数据仓库 + 数据分析、审计、推荐系统与用户画像。

三、概念

日志库(Logstore)是日志服务中日志数据的收集、存储和查询单元。每个日志库隶属于一个项目,且每个项目可以创建多个日志库。

分区(Shard每个日志库分若干个分区(Shard),每个分区由MD5左闭右开区间组成,每个区间范围不会相互覆盖,并且所有的区间的范围是MD5整个取值范围。

文件日志(LogFile)、事件(Event)、数据库日志(BinLog)、度量(Metric)数据都是日志的不同载体。

日志服务采用半结构数据模式定义一条日志。该模式中包含主题(Topic)、时间(Time)、内容(Content)、来源(Source)和标签(Tags)五个数据域。

日志组(LogGroup)是一组日志的集合,是API/SDK写入与读取数据的基本单位。一个LogGroup中的数据包含相同Meta(IP、Source等信息)。

通过日志服务API/SDK写入数据时,多条日志会打包成一个LogGroup,以LogGroup为单位发往日志服务。相对于以日志为单位读写数据,LogGroup的读写方式可以最大限度地减少读取与写入次数,提高业务效率。日志组的限制为:5 MB空间。

服务器上有三种日志:操作日志(operation_log)、应用程序日志(application_log)以及访问日志(access_log)

日志框架 Log4j、Log4j2、Logback Appender

对Java应用而言,目前有两种主流的日志采集方案:

Java程序将日志落盘,通过Logtail进行实时采集。

Java程序直接配置日志服务提供的Appender,当程序运行时,实时将日志发往服务端。

四、采集并分析Nginx访问日志

Nginx日志内容

字段

含义

remote_addr

客户端地址

remote_user

客户端用户名

time_local

服务器时间

request

请求内容,包括方法名、地址和http协议

http_host

用户请求时使用的http地址

status

返回的http状态码

request_length

请求大小

body_bytes_sent

返回的大小

http_referer

来源页

http_user_agent

客户端名称

request_time

整体请求延时

upstream_response_time

上游服务的处理延时

 1.使用SQL语句分析Nginx访问日志

统计最近一天的PV数和UV数

select approx_distinct(remote_addr) as uv ,

count(1) as pv ,

date_format(date_trunc("hour", __time__), "%m-%d %H:%i") as time

group by date_format(date_trunc("hour", __time__), "%m-%d %H:%i")

order by time

limit 1000

统计访问IP来源情况

select count(1) as c, 

ip_to_province(remote_addr) as address

group by ip_to_province(remote_addr) limit 10

统计最近一天各种请求方法的占比

select count(1) as pv,

request_method

group by request_method

统计最近一天各种http状态码的占比

select count(1) as pv,

status

group by status

 统计最近一天各种浏览器的占比

select count(1) as pv,

case when http_user_agent like "%Chrome%" then "Chrome"

when http_user_agent like "%Firefox%" then "Firefox"

when http_user_agent like "%Safari%" then "Safari"

else "unKnown" end as http_user_agent

group by http_user_agent

order by pv desc

limit 10

 五、Nginx访问日志诊断及优化

  • 通过每5分钟的平均延时和最大延时,从整体上了解延时情况。

      * | select from_unixtime(__time__ -__time__% 300) as time, 

    avg(request_time) as avg_latency ,

    max(request_time) as max_latency

    group by __time__ -__time__% 300

  • 统计最大延时对应的请求页面。

    知道了最大延时之后,需要明确最大延时对应的请求页面,以方便进一步优化页面响应。

      * | select from_unixtime(__time__ - __time__% 60) , 

    max_by(request_uri,request_time)

    group by __time__ - __time__%60

  • 统计请求延时的分布。

    统计网站的所有请求的延时的分布,把延时分布在十个桶里面,看每个延时区间的请求个数。

    * |select numeric_histogram(10,request_time)
  • 统计最大的十个延时。

    除最大的延时之外,还需要统计最大的十个延时及其对应值。

    统计语句:

    * | select max(request_time,10)
  • 对延时最大的页面调优。

    假如/url2这个页面的访问延时最大,为了对/url2页面进行调优,接下来需要统计/url2这个页面的访问PV、UV、各种method次数、各种status次数、各种浏览器次数、平均延时和最大延时。

       request_uri:"/url2" | select count(1) as pv,

    approx_distinct(remote_addr) as uv,

    histogram(method) as method_pv,

    histogram(status) as status_pv,

    histogram(user_agent) as user_agent_pv,

    avg(request_time) as avg_latency,

    max(request_time) as max_latency

七、Logtail采集原理

Logtail采集日志的流程为:监听文件、读取文件、处理日志、过滤日志、聚合日志和发送数据6个步骤 。Logtail支持极简模式、完整正则模式、分隔符模式、JSON模式、NGINX配置模式 、IIS配置模式、APACHE配置模式等方式收集日志

八、Nginx日志

Nginx日志格式和目录通常在配置文件/etc/nginx/nginx.conf中

配置文件中定义了Nginx日志的打印格式,即main格式:

log_format main  "$remote_addr - $remote_user [$time_local] "$request" "

"$request_time $request_length "

"$status $body_bytes_sent "$http_referer" "

""$http_user_agent"";

声明使用了main这种日志格式和写入的文件名。

access_log /var/logs/nginx/access.log main

日志样例

192.168.1.2 - - [10/Jul/2015:15:51:09 +0800] "GET /ubuntu.iso HTTP/1.0" 0.000 129 404 168 "-" "Wget/1.11.4 Red Hat modified"

字段说明

 

字段名称

含义

remoteaddr

表示客户端IP地址。

remote_user

表示客户端用户名称。

request

表示请求的URL和HTTP协议。

status

表示请求状态。

bodybytessent

表示发送给客户端的字节数,不包括响应头的大小;该变量与Apache模块modlogconfig里的bytes_sent发送给客户端的总字节数相同。

connection

表示连接的序列号。

connection_requests

表示当前通过一个连接获得的请求数量。

msec

表示日志写入的时间。单位为秒,精度是毫秒。

pipe

表示请求是否通过HTTP流水线(pipelined)发送。通过HTTP流水线发送则pipe值为p,否则为.

httpreferer

表示从哪个页面链接访问过来的。

“http_user_agent”

表示客户端浏览器相关信息,前后必须加上双引号。

requestlength

表示请求的长度。包括请求行,请求头和请求正文。

request_time

表示请求处理时间,单位为秒,精度为毫秒。从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。

[$time_local]

表示通用日志格式下的本地时间,前后必须加上中括号。

九、Systemd日志输入源

Systemd是专用于 Linux 操作系统的系统与服务管理器。当作为启动进程(PID=1)运行时,它将作为初始化系统运行,启动并维护各种用户空间的服务。 Systemd统一管理所有Unit的日志(包括内核和应用日志),配置文件一般在/etc/systemd/journald.conf中。

功能

  • 支持设置初始同步位置,后续采集会自动保存checkpoint,应用重启时不影响进程。
  • 支持过滤指定的Unit。
  • 支持采集内核日志。
  • 支持自动解析日志等级。
  • 支持以容器方式采集宿主机上的Journal日志,适用于Docker/Kubernetes场景。

 

 

以上是 日志服务的总结 的全部内容, 来源链接: utcz.com/z/510843.html

回到顶部