账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    最近参加高级php面试,笔记题最后一题必答题老是下面这个日志系统设计问题,有没有高手能够给出完美答案?
    38
    0

    APP有上亿用户使用,为了深刻挖掘用户需求,需要设计一个日志收集系统,用于收集用户日常使用情况,请用你知道的知识设计一套这样的日志收集系统。
    假设,用户每次操作、点击APP都将发起请求。
    请给出系统架构设计图,数据库存储方式,需要的机器量,以及能承载的QPS,尽可能详细的描述此系统中的难点、解决方案。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 夜、孤独 普通会员 1楼

      设计一个日志系统是一个相对复杂且涉及到多个维度的问题,下面我将给出一种相对全面和可扩展的设计方案:

      1. 功能需求: - 记录不同级别的日志(如:DEBUG、INFO、WARN、ERROR、FATAL)。 - 支持多种存储方式(文件、数据库、远程日志服务如Logstash、Sentry等)。 - 能够根据日志级别过滤日志输出。 - 日志格式化,便于阅读和分析,可以包含时间戳、请求ID、来源文件、行号、函数名以及自定义上下文信息等。 - 支持异步记录,不影响主业务流程。

      2. 设计实现:

      接口设计: ```php interface LoggerInterface { public function emergency($message, array $context = []); public function alert($message, array $context = []); public function critical($message, array $context = []); public function error($message, array $context = []); public function warning($message, array $context = []); public function notice($message, array $context = []); public function info($message, array $context = []); public function debug($message, array $context = []);

      public function log($level, $message, array $context = []);
      

      } `` 上述接口中,每个方法对应一个日志级别,并提供一个通用的log`方法用于处理其他自定义级别。

      实现类: ```php class LogHandler { protected $handlers; // 存储各种日志处理器

      public function __construct(array $config)
      {
          foreach ($config as $handlerConfig) {
              $this->handlers[] = $this->createHandler($handlerConfig);
          }
      }
      
      protected function createHandler($config)
      {
          switch ($config['type']) {
              case 'file':
                  return new FileHandler($config['path'], $config['level']);
              case 'database':
                  return new DatabaseHandler($config['dsn'], $config['table'], $config['level']);
              // 其他类型的处理器...
          }
      }
      
      public function log($level, $message, array $context = [])
      {
          foreach ($this->handlers as $handler) {
              if ($handler->isHandling($level)) {
                  $handler->write($level, $message, $context);
              }
          }
      }
      

      }

      // 示例处理器:FileHandler 和 DatabaseHandler `` 在LogHandler中,可以根据配置动态创建并使用不同的日志处理器。对于日志写入操作,遍历所有处理器,如果处理器支持当前日志级别,则调用其write`方法进行日志记录。

      3. 高级特性: - 日志归档与清理:可以设置按照日期或者大小对日志文件进行滚动,超过一定期限或达到一定大小的日志自动清理或归档。 - 分布式追踪:结合traceId,将同一事务的所有操作关联起来,方便问题定位。 - 异步记录:通过队列系统(如RabbitMQ、Redis等)异步处理日志写入,避免阻塞主线程。

      以上只是一个基础设计方案,实际应用中可能还需要考虑更多的因素,例如性能优化、安全性、监控报警等。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部