ELK实现接口调用统计

ELK实现接口调用统计

具体思路

  1. 设置打印日志格式
    日志格式:当前系统名称-调用类-调用方法
    各个字段间用空格分割,便于es分词切分
  2. 使用logstash过滤器grok对固定格式的日期进行分词存储点击获取Grok 正则表达式相关语法
    使用正则表达式对上述固定格式日志进行切分
    过滤正则表达式为:
    %{DATA:current_system} %{DATA:current_class} %{DATA:current_method}
  3. 使用es查询过滤出需要的数据
    可以使用系统名称、方法名称在es存储的数据中使用count操作,即可获取相关接口调用次数
  4. 实现以上功能,需要配置logstash-sample.conf,样例如下:
 input {
  tcp {
    mode => "server"
    host => "localhost"
    port => 4560
    type => "tcp"
    codec => json_lines
  }
}
input {
  kafka {
    bootstrap_servers=> "localhost:9092"
    # group_id =>"es"
    topics =>"applog"
    consumer_threads =>1
    decorate_events =>true
    type => "kafka"
  }
}
filter{
  grok {
    match => {"message" => "%{DATA:current_system} %{DATA:current_class} %{DATA:current_method} "}
    overwrite => ["message"]
  }
  if[type] == "tcp" {
    mutate {
      add_tag => ["tcp1"]
    }
  }  
  if [type] == "kafka" {
     mutate {
       add_tag => ["kafka1"]
     }
  }
}
output {
  if "tcp1" in [tags]{
    elasticsearch {
      hosts => "localhost:9200"
      #index => "data_sharing_indicators008"
      index => "%{[appname]}"
      # template => "D:\bigdata\logstash-7.3.2\template"
      # template_overwrite => "true"
    }
  }
}
output {
  if "kafka1" in [tags]{
    elasticsearch {
      hosts => "localhost:9200"
      index => "data_sharing_indicators007"
      # index => "kafka_%{[appname]}"
      # template => "D:\bigdata\logstash-7.3.2\template"
      # template_overwrite => "true"
    }
  }
}

5.注意点
自定义的日志输出字段,不能与已有的系统日志输出字段重名,类似关键字的用法

"%{DATA:current_system} %{DATA:current_class} %{DATA:current_method} "

<think>好的,用户想了解如何记录和查看API接口调用的日志。首先,我需要回忆之前提供的引用内容,特别是引用3,里面提到了在调用接口前后打印日志,捕获异常,记录入参和出参。这些都是关键点。 用户的问题分为两部分:记录和查看日志。先从记录开始。根据引用3中的例子,应该在调用API接口的前后使用日志记录入参和出参,这样可以方便排查问题。例如在Java中使用try-catch块,在调用前后用log.info记录,异常时用log.error记录错误信息。同时,还要注意捕获Throwable而不仅仅是Exception,确保所有错误都能被捕获。 接下来是日志存储和查看。用户可能需要将日志持久化,比如存入文件或数据库。引用1提到调用userInterfaceInfoService.save将记录保存到数据库,这可以用于记录每次调用的详细信息。另外,引用2提到API的调用是通过发送请求到特定URL,所以可能需要记录请求的URL、参数、响应状态码等。 然后,关于查看日志,需要考虑日志管理系统,比如ELKElasticsearch, Logstash, Kibana)或者云服务提供的日志功能。实时监控和报警也是重要部分,可以在系统出现大量错误时及时通知开发人员。 可能还需要考虑日志的格式化和分类,比如按服务模块或接口名称分类,方便过滤和查找。同时,高并发下的日志处理要注意性能,避免日志记录成为瓶颈,可以采用异步写入或批量写入的方式。 用户可能需要具体的实现步骤或代码示例。例如在Java中使用AOP统一处理日志,或者在Python中使用装饰器记录接口调用。此外,日志的轮转和归档策略也很重要,防止日志文件过大。 最后,生成相关问题时,要覆盖日志记录的最佳实践、工具推荐、性能优化、错误排查方法等,帮助用户全面了解如何处理API接口的日志。</think>### 如何记录和查看API接口调用的日志 #### 一、日志记录的核心要素 1. **基础信息捕获** - 调用时间戳:`System.currentTimeMillis()` - 接口名称:如`/api/weather` - 请求唯一标识:UUID或雪花算法生成 - 客户端IP和服务端IP 2. **入参/出参记录** 在调用前后分别记录请求参数和响应结果,示例如下: ```java log.info("调用开始 | 接口={} 入参={}", "userService.test", JSON.toJSONString(params)); Response res = apiService.call(params); log.info("调用结束 | 接口={} 耗时={}ms 出参={}", "userService.test", System.currentTimeMillis()-startTime, res.getCode()); ``` 3. **异常处理标准化** 使用`try-catch`捕获`Throwable`并记录堆栈信息: ```python try: response = requests.post(url, json=data) response.raise_for_status() except Exception as e: logger.error(f"API调用异常 | URL={url} 错误={str(e)} 堆栈={traceback.format_exc()}") ``` #### 二、存储方案对比 | 存储方式 | 优点 | 缺点 | 适用场景 | |---------|------|------|---------| | 文件存储 | 实现简单,无需额外依赖 | 检索效率低,难做统计分析 | 低频调用场景 | | 数据库 | 支持复杂查询,可持久化 | 高频写入可能成为性能瓶颈 | 需要审计功能的系统 | | ELK栈 | 支持全文检索,可视化分析 | 需要维护ES集群 | 中大型分布式系统 | | 日志服务(如AWS CloudWatch) | 免运维,自动扩展 | 产生云服务费用 | 云原生架构 | #### 三、实现方案示例(Java Spring Boot) 1. **AOP切面统一处理** ```java @Aspect @Component public class ApiLogAspect { @Around("execution(* com.example.api.*.*(..))") public Object logApiCall(ProceedingJoinPoint pjp) throws Throwable { long start = System.currentTimeMillis(); Object[] args = pjp.getArgs(); try { Object result = pjp.proceed(); log.info("调用成功 | 方法={} 耗时={}ms 出参={}", pjp.getSignature().getName(), System.currentTimeMillis()-start, result); return result; } catch (Throwable t) { log.error("调用异常 | 方法={} 入参={} 错误={}", pjp.getSignature().getName(), Arrays.toString(args), t.getMessage()); throw t; } } } ``` 2. **异步日志写入优化** 使用Disruptor或Log4j2异步Appender提升性能: ```xml <!-- log4j2.xml配置 --> <AsyncLogger name="ApiLogger" level="info"> <AppenderRef ref="KafkaAppender"/> </AsyncLogger> ``` #### 四、日志分析实践 1. **错误模式识别** ```bash # 使用ELK的Kibana进行聚合分析 GET /logs-*/_search { "aggs": { "error_codes": { "terms": { "field": "response_code" } } } } ``` 2. **调用链路追踪** 集成SkyWalking或Zipkin实现跨服务追踪: ``` [2023-09-01 12:00:00] TraceID:abc-123 - ServiceA (10ms) ├─ ServiceB (8ms) └─ Database (2ms) ``` #### 五、安全注意事项 1. 敏感数据脱敏处理 ```java public String maskSensitiveData(String original) { return original.replaceAll("(\"password\":\")(.*?)(\")", "$1***$3"); } ``` 2. 日志访问权限控制 - 数据库日志表设置`SELECT`权限限制 - 文件日志设置`600`权限(仅属主可读写)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值