日志分析接口协议的设计与实现

文章摘要

Choice
通过日志信息对RPC服务调用的用户进行监控,提高系统的稳定性。本文简要记录了一下日志分析接口协议的设计与实现.

实现细节

HTTP接口

请求方式: post
请求参数:

  • HTTP header
    Content-Type=application/json (必须)
  • HTTP body

    {
    

    ​ “log_project_name”:”testhttp”,
    ​ “log_message_type”:”request”,
    ​ “log_format”:”default”,
    ​ “log_from”:”172.0.0.1”,
    ​ “log_content”:”2017-06-28 22:39:44,959 [P58,] communicationInfo - {\”cid\”:\”1111\”,\”clientIP\”:\”10.10.10.10\”,\”request\”:\”simpleSearch\”,\”timeAll\”:107,\”respLength\”:55555}”
    ​ }

body中为JSON字符串
JSON参数

log_project_name:项目名称 同一个项目使用同一个名称
log_message_type:日志类型request (请求日志),error(错误日志)
log_format:日志格式default
log_from:日志来源机器每台机器写自己的IP作为一个标示
log_content:根据日志类型发送的日志内容(日志内容格式请见下文)

日志文件

读取日志文件(日志内容格式请见下文)

日志格式

日志格式为两种

日志格式为 request 解析类型为 default 日志为一行

示例:

2017-06-21 22:37:44,959  -  {"cid":"1111","clientIP":"10.10.10.10","request":"simpleSearch","timeAll":107, "respLength":55555}

请求日志内容格式 分为3块

  1. 时间开头格式必须为 yyyy-MM-dd HH:mm:ss,SSS
  2. 分隔符 -
  3. JSON内容

    cid:用户ID
    clientIP:客户端IP
    request:请求业务类型
    timeAll:耗时
    respLength:返回大小

注意:json中字段为必填字段若没有值则使用空字符串

日志格式为 error 解析类型为 default 日志可以为多行

示例

2017-06-19 22:54:58,151  InfoThreadPool requestInfo 
http://www.eastmoney.com/ open error

错误日志内容格式 分为2块

  1. 时间开头格式必须为yyyy-MM-dd HH:mm:ss,SSS
  2. 错误内容
    注意:错误日志读取时,只匹配日志开头是否为此格式的时间,最多读取500行,当行中出现eastmoney关键字时,停止读取。

需求

每一台服务器的访问情况

  • LoginHandler每次登录输出日志
  • 日志内容字段

    cid:用户ID
    clientIP:客户端IP
    request:请求业务类型
    timeAll:耗时
    respLength:返回大小

每个用户所做的操作

  • 调用Handler的doHandle()时输出日志

    cid:用户ID
    clientIP:客户端IP
    request:请求业务类型
    timeAll:耗时
    respLength:返回大小

count_info

机房,服务器类型,服务器ip,服务器端口,用户数,时间,备注
area,server_type,server_ip,server_port,count,time,desc

user_log

用户id,客户端ip,客户端端口,服务器ip,服务器端口,请求id,时间,备注
clientid,remote_server,remote_port,server_ip,server_port,request_id,time,desc

文件名

LIST_10.10.10.10_80-1818-443_sys.2017110620.log

  • request_id为 -1,预留位desc赋值为当前用户数(链接数),每分钟打印一次

    2017-10-30 13:26:00.574 - {“clientid”:””,”remote_server”:””,”remote_port”:””,”server_port”:””,”request_id”:-1,”desc”:”500”}

  • request_id为 -2,预留位desc赋值为链接断线原因

    2017-10-30 13:26:00.574 - {“clientid”:”22000000000”,”remote_server”:”10.10.10.10”,”remote_port”:”30040”,”server_port”:”1818”,”request_id”:-2,”desc”:0}

    1
    2
    3
    4
    5
    6
    7
    public static final byte UNKNOWN = 0;   //未知
    public static final byte WRITE_WAITE_MANY_TIMES = 1; //写等待次数过多
    public static final byte FORCE_NO_CANCEL_REQUEST = 2; //强制去除,客户端没有发送取消请求
    public static final byte CHANNEL_GROUP_CHECK = 3; //ChannelGroup检查关闭
    public static final byte HANDLER_EXCEPTION = 4; //Handler exceptionCaught触发
    public static final byte HANDLER_CLOSED = 5; //Handler Closed触发
    public static final byte CHANNEL_EXCEPTION = 6; //Handler Closed触发
  • 正常打印请求信息

    2017-10-30 13:26:00.574 - {“clientid”:”22000000000”,”remote_server”:”10.10.10.10”,”remote_port”:”30040”,”server_port”:”1818”,”request_id”:16066,”desc”:””}

参考资料

logback的使用和logback.xml详解:http://www.cnblogs.com/warking/p/5710303.html
logback.xml配置:http://blog.csdn.net/qq173684423/article/details/53611906
logback配置详解http://blog.csdn.net/haidage/article/details/6794509