部署Kafka+ZK及其日志采集实战(系统版本:linux_CentOs_7.8) ...

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691


  • 部署ZK
    1. docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
    复制代码
  • 部署Kafka
    1.         docker run -d --name xdclass_kafka \
    2.         -p 9092:9092 \
    3.         -e KAFKA_BROKER_ID=0 \
    4.         --env KAFKA_HEAP_OPTS=-Xmx256M \
    5.         --env KAFKA_HEAP_OPTS=-Xms128M \
    6.         -e KAFKA_ZOOKEEPER_CONNECT=[内网ip]:2181 \
    7.         -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://[外网ip]:9092 \
    8.         -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka:2.13-2.7.0
    复制代码
  • 采用Slf4j采集日志(lombok)


  • 需求

    • 控制台输出访问日志,方便测试
    • 业务数据实际输出到kafka
    • 常用的框架 log4j、logback、self4j等

  • log4j、logback、self4j 之间有啥关系

    • SLF4J(Simple logging Facade for Java) 门面设计模式 |外观设计模式

      • 把不同的日志系统的实现进行了具体的抽象化,提供统一的日志使用接口
      • 具体的日志系统就有log4j,logback等;
      • logback也是log4j的作者完成的,有更好的特性,可以取代log4j的一个日志框架, 是slf4j的原生实现
      • log4j、logback可以单独的使用,也可以绑定slf4j一起使用

    • 编码规范建议不直接用log4j、logback的API,应该用self4j, 日后更换框架所带来的成本就很低



  • 依赖引入
    1. <dependency>
    2.     <groupId>org.projectlombok</groupId>
    3.     <artifactId>lombok</artifactId>
    4. </dependency>
    5. <dependency>
    6.     <groupId>org.springframework.kafka</groupId>
    7.     <artifactId>spring-kafka</artifactId>
    8. </dependency>
    复制代码
  • kafka配置application.properties
    1. #----------kafka配置--------------
    2. spring.kafka.bootstrap-servers=[外网ip]:9092
    3. spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
    4. spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
    复制代码
  • logback.xml配置
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration>
    3.     <property name="LOG_HOME" value="./data/logs/link" />
    4.    
    5.     <appender name="console" >
    6.         <encoder>
    7.             <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern>
    8.         </encoder>
    9.     </appender>
    10.    
    11.     <appender name="rollingFile" >
    12.         <file>${LOG_HOME}/link.log</file>
    13.         <rollingPolicy >
    14.             <fileNamePattern>${LOG_HOME}/link-%d{yyyy-MM-dd}.log</fileNamePattern>
    15.         </rollingPolicy>
    16.         <encoder>
    17.             <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern>
    18.         </encoder>
    19.     </appender>
    20.    
    21.     <logger name="net.xdclass.service.impl.LogServiceImpl"
    22.             level="INFO" additivity="false">
    23.         <appender-ref ref="rollingFile" />
    24.         <appender-ref ref="console" />
    25.     </logger>
    26.     <root level="info" additivity="false">
    27.         <appender-ref ref="console" />
    28.     </root>
    29. </configuration>
    复制代码
  • LogServiceImpl
    1. @Service
    2. @Slf4j
    3. public class LogServiceImpl implements LogService {
    4.        
    5.         // Kafka:topic
    6.     private static final String TOPIC_NAME = "ods_link_visit_topic";
    7.     @Autowired
    8.     private KafkaTemplate kafkaTemplate;
    9.     /**
    10.      * 记录日志
    11.      *
    12.      * @param request
    13.      * @param shortLinkCode
    14.      * @param accountNo
    15.      * @return
    16.      */
    17.     @Override
    18.     public void recodeShortLinkLog(HttpServletRequest request, String shortLinkCode, Long accountNo) {
    19.         // ip、 浏览器信息
    20.         String ip = CommonUtil.getIpAddr(request);
    21.         // 全部请求头
    22.         Map<String, String> headerMap = CommonUtil.getAllRequestHeader(request);
    23.         Map<String,String> availableMap = new HashMap<>();
    24.         availableMap.put("user-agent",headerMap.get("user-agent"));
    25.         availableMap.put("referer",headerMap.get("referer"));
    26.         availableMap.put("accountNo",accountNo.toString());
    27.         LogRecord logRecord = LogRecord.builder()
    28.                 //日志类型
    29.                 .event(LogTypeEnum.SHORT_LINK_TYPE.name())
    30.                 //日志内容
    31.                 .data(availableMap)
    32.                 //客户端ip
    33.                 .ip(ip)
    34.                 // 时间
    35.                 .ts(CommonUtil.getCurrentTimestamp())
    36.                 //业务唯一标识(短链码)
    37.                 .bizId(shortLinkCode).build();
    38.         String jsonLog = JsonUtil.obj2Json(logRecord);
    39.         //打印日志 in 控制台
    40.         log.info(jsonLog);
    41.         // 发送kafka
    42.         kafkaTemplate.send(TOPIC_NAME,jsonLog);
    43.     }
    44. }
    复制代码
  • kafka命令
    1. ```
    2. 创建topic
    3. ./kafka-topics.sh --create --zookeeper 172.17.0.1:2181 --replication-factor 1 --partitions 1 --topic ods_link_visit_topic
    4. 查看topic
    5. ./kafka-topics.sh --list --zookeeper 172.17.0.1:2181
    6. 删除topic
    7. ./kafka-topics.sh --zookeeper 172.17.0.1:2181 --delete --topic ods_link_visit_topic
    8. 消费者消费消息
    9. ./kafka-console-consumer.sh --bootstrap-server 192.168.75.146:9092 --from-beginning --topic ods_link_visit_topic
    10. 生产者发送消息
    11. ./kafka-console-producer.sh --broker-list 192.168.75.146:9092  --topic ods_link_visit_topic
    12. ```
    复制代码
  • 测试
    1. @Controller
    2. @Slf4j
    3. public class LinkApiController {
    4.     @Autowired
    5.     private ShortLinkService shortLinkService;
    6.     @Autowired
    7.     private LogService logService;
    8.     /**
    9.      *
    10.      * @param shortLinkCode
    11.      * @param request
    12.      * @param response
    13.      */
    14.     @GetMapping(path = "/test")
    15.     public void dispatch(HttpServletRequest request, HttpServletResponse response) {
    16.         log.info("短链:{}", shortLinkCode);
    17.         logService.recodeShortLinkLog(request, shortLinkCode, shortLinkVO.getAccountNo());
    18.         
    19.     }
    复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表