还在用ES查日志吗,快看看石墨文档 Clickhouse 日志架构玩法

Posted 高可用架构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还在用ES查日志吗,快看看石墨文档 Clickhouse 日志架构玩法相关的知识,希望对你有一定的参考价值。

1 背景

toDateTime(toInt64(_time_)) AS _time_second_,
fromUnixTimestamp64Nano(toInt64(_time_*1000000000),\'Asia/Shanghai\') AS _time_nanosecond_,
_pod_name_,
_namespace_,
_node_name_,
_container_name_,
_cluster_,
_log_agent_,
_node_ip_,
_source_,
_log_ AS _raw_log_,JSONExtractInt(_log_, \'status\') AS status,JSONExtractString(_log_, \'url\') AS url
FROM logger.ingress_stdout_stream where 1=1;

  • 结果表:存储最终的数据

  • create table logger.ingress_stdout
    (
    _time_second_ DateTime,
    _time_nanosecond_ DateTime64(9, \'Asia/Shanghai\'),
    _source_ String,
    _cluster_ String,
    _log_agent_ String,
    _namespace_ String,
    _node_name_ String,
    _node_ip_ String,
    _container_name_ String,
    _pod_name_ String,
    _raw_log_ String,
    status Nullable(Int64),
    url Nullable(String),
    )
    engine = MergeTree PARTITION BY toYYYYMMDD(_time_second_)
    ORDER BY _time_second_
    TTL toDateTime(_time_second_) + INTERVAL 7 DAY
    SETTINGS index_granularity = 8192;
    6 总结流程

  • 日志会通过fluent-bit的规则采集到kafka,在这里我们会将日志采集到两个字段里

  • _time_字段用于存储fluent-bit采集的时间

  • _log_字段用于存放原始日志

  • 通过mogo,在clickhouse里设置了三个表

  • app_stdout_stream:将数据从Kafka采集到Clickhouse的Kafka引擎表

  • app_stdout_view:视图表用于存放mogo设置的索引规则

  • app_stdout:根据app_stdout_view索引解析规则,消费app_stdout_stream里的数据,存放于app_stdout结果表中

  • 最后mogo的UI界面,根据app_stdout的数据,查询日志信息

  • 7 Mogo界面展示

    查询日志界面

    设置日志采集配置界面

    以上文档描述是针对石墨Kubernetes的日志采集,想了解物理机采集日志方案的,可以在下文中找到《Mogo使用文档》的链接,运行docker-compose体验Mogo 全部流程,查询Clickhouse日志。限于篇幅有限,Mogo的日志报警功能,下次再讲解。

    8 资料
  • github地址: https://github.com/shimohq/mogo

  • Mogo文档:https://mogo.shimo.im

  • Mogo使用文档:https://mogo.shimo.im/doc/AV62KU4AABMRQ

  • fluent-bit文档:https://docs.fluentbit.io/

  • K8S日志

  • 6 个 K8S 日志系统建设中的典型问题,你遇到过几个:https://developer.aliyun.com/article/718735

  • 一文看懂 K8S 日志系统设计和实践:https://developer.aliyun.com/article/727594

  • 9 个技巧,解决 K8S 中的日志输出问题:https://developer.aliyun.com/article/747821

  • 直击痛点,详解 K8S 日志采集最佳实践:https://developer.aliyun.com/article/749468?spm=a2c6h.14164896.0.0.24031164UoPfIX

  • Clickhouse

  • Clickhouse官方文档:https://clickhouse.com/

  • Clickhouse作为Kubernetes日志管理解决方案中的存储:http://dockone.io/article/9356

  • Uber 如何使用 ClickHouse 建立快速可靠且与模式无关的日志分析平台?:https://www.infoq.cn/article/l4thjgnr7hxpkgpmw6dz

  • 干货 | 携程ClickHouse日志分析实践:https://mp.weixin.qq.com/s/IjOWAPOJXANRQqRAMWXmaw

  • 为什么我们要从ES迁移到ClickHouse:https://mp.weixin.qq.com/s/l4RgNQPxvdNIqx52LEgBnQ

  • ClickHouse 在日志存储与分析方面作为 ElasticSearch 和 mysql 的替代方案:https://mp.weixin.qq.com/s/nJXorcgi0QfXPCKr_HdUZg

  • 快手、携程等公司转战到 ClickHouse,ES 难道不行了?:https://mp.weixin.qq.com/s/hP0ocT-cBCeIl9n1wL_HBg

  • 日志分析下ES/ClickHouse/Loki比较与思考:https://mp.weixin.qq.com/s/n2I94X6tz2jOABzl1djxYg

  • 参考阅读:


  • 带你彻底击溃跳表原理及其Golang实现!(内含图解)

  • 从0到1:美团端侧CDN容灾解决方案

  • 百度搜索中台新一代内容架构:FaaS化和智能化实战

  • 五人基础架构组如何掌控千万DAU云原生架构

  • 代码质量第4层——健壮的代码!

  • 事件驱动架构在 vivo 内容平台的实践


  • 技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。


    高可用架构
    改变互联网的构建方式

    Python日志模块之你还在用PRINT打印日志吗

     

    import logging
    
    logging.basicConfig(level=logging.DEBUG,
                        format=\'%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s\',
                        datefmt=\'%a, %d %b %Y %H:%M:%S\',
                        filename=\'test.log\',
                        filemode=\'w\')
    
    logging.debug(\'debug level\')
    logging.info(\'info level\')
    logging.warning(\'warning level\')
    logging.error(\'error level\')
    logging.critical(\'critical level\')

     

    我们知道在日常写Python程序的时候开业用print来打印一些日志,当然在小的程序里不用出现什么问题,但是你有没有想过当你的代码量到成千上万行的时候,还是用print来打印,那就是灾难,今天就给大家介绍下python中的日志模块 logging模块。

     

    logging可以分成两部分来讲

    1.logging, 重点在于logging.basicConfig

    2.logger对象,重点在于FileHandler(用于向文件输出)和StreamHandler(用于向控制台输出)

     

    下面看看案例

    方法一logging (注意我们新建py文件的时候,py文件名不要和包的名称一样,就是py文件名字不要建成logging.py, 不然会报错)

    import logging
    logging.debug(\'debug level\')
    logging.info(\'info level\')
    logging.warning(\'warning level\')
    logging.error(\'error level\')
    logging.critical(\'critical level\')

     
    结果:

    WARNING:root:warning level
    ERROR:root:error level
    CRITICAL:root:critical level

     

    我们会发现下面2个没有输出到控制台,这是因为我们python里面的默认日志级别是warning

    logging.debug(\'debug level\')
    logging.info(\'info level\')
     

    下面我们自己设置下日志级别看看,也就是logging模块的重点logging.basicConfig

    import logging

    logging.basicConfig(level=logging.DEBUG,
    format=\'%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s\',
    datefmt=\'%a, %d %b %Y %H:%M:%S\',
    filename=\'test.log\',
    filemode=\'w\')

    logging.debug(\'debug level\')
    logging.info(\'info level\')
    logging.warning(\'warning level\')
    logging.error(\'error level\')
    logging.critical(\'critical level\')
     

    我们会发现控制台没有输出,但是py文件的同路径出现一个test.log的日志文件

     

    或者我们不加filename=\'test.log\'

    import logging

    logging.basicConfig(level=logging.DEBUG,
    format=\'%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s\',
    datefmt=\'%a, %d %b %Y %H:%M:%S\',
    # filename=\'test.log\',
    filemode=\'w\')

    logging.debug(\'debug level\')
    logging.info(\'info level\')
    logging.warning(\'warning level\')
    logging.error(\'error level\')
    logging.critical(\'critical level\')
     

    结果

    Sun, 24 Mar 2019 11:37:26 log.py[line:9] DEBUG debug level
    Sun, 24 Mar 2019 11:37:26 log.py[line:10] INFO info level
    Sun, 24 Mar 2019 11:37:26 log.py[line:11] WARNING warning level
    Sun, 24 Mar 2019 11:37:26 log.py[line:12] ERROR error level
    Sun, 24 Mar 2019 11:37:26 log.py[line:13] CRITICAL critical level
     

     

    控制台完整输出了从debug到critical的日志,而且是按照我们要想的格式

    是不是更赏心悦目了呢

     

    下面是basicConfig的参数介绍,来源于网络截取(https://www.cnblogs.com/yuanchenqi/articles/6766020.html)

    侵权删

     

    logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

    filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。
    datefmt:指定日期时间格式。
    level:设置rootlogger(后边会讲解具体概念)的日志级别
    stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

    format参数中可能用到的格式化串:
    %(name)s Logger的名字
    %(levelno)s 数字形式的日志级别
    %(levelname)s 文本形式的日志级别
    %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s 调用日志输出函数的模块的文件名
    %(module)s 调用日志输出函数的模块名
    %(funcName)s 调用日志输出函数的函数名
    %(lineno)d 调用日志输出函数的语句所在的代码行
    %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
    %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(thread)d 线程ID。可能没有
    %(threadName)s 线程名。可能没有
    %(process)d 进程ID。可能没有
    %(message)s用户输出的消息
     

     

    那说到这里有人是不是就发现了,上面的方式要不就是把日志输出到控制台,要不就是输出到日志文件,那么如果我即想输出到控制台也想输出到文件, 那怎么办呢?那就要用我们今天说的第二种方法 logger对象。

     

     

    2. logger对象,这样就可以同时向文件和控制台打印日志了,解释都在代码里。

     

    import logging

    #固定写法
    # logger = logging.getLogger()
    logger = logging.getLogger(\'mylogger\')

    #设置日志级别
    logger.setLevel(logging.DEBUG)


    # 创建一个FileHandler,用于写入日志文件
    File = logging.FileHandler(\'test.log\')

    # 再创建一个StreamHandler,用于输出到控制台
    consle = logging.StreamHandler()

    #定义输出格式,可以自己定
    formatter = logging.Formatter(\'%(asctime)s - %(name)s - %(levelname)s - %(message)s\')

    #绑定格式和FileHandler,StreamHandler
    File.setFormatter(formatter)
    consle.setFormatter(formatter)

    #logger对象可以添加多个FileHandler和consle对象
    logger.addHandler(File)
    logger.addHandler(consle)


    #输出
    logger.debug(\'logger debug level\')
    logger.info(\'logger info level\')
    logger.warning(\'logger warning level\')
    logger.error(\'logger error level\')
    logger.critical(\'logger critical level\')

     

     

    好了今天的日志模块就介绍这么多吧,至于日志模块也可以通过配置文件来操作,原理其实一样,只是换成文件来存储配置信息。
    ————————————————
    版权声明:本文为CSDN博主「yrg5101」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yrg5101/java/article/details/88825141

     

    以上是关于还在用ES查日志吗,快看看石墨文档 Clickhouse 日志架构玩法的主要内容,如果未能解决你的问题,请参考以下文章

    Python日志模块之你还在用PRINT打印日志吗

    还在用 ClickHouse?事实证明 ES 更强大!

    都 2021 年了,你还在用 Kafka?快试试这个全新平台吧

    还在用笨重的ELK?日志系统新贵Loki 了解一下

    你还在用 Swagger?试试这款 API 工具,开发效率可以快 10 倍,大大提升生产力!...

    你还在用 Swagger?试试这款 API 工具,开发效率可以快 10 倍,大大提升生产力!...