程序的足迹--日志篇

日志

     作为一个java开发,我在自己熟悉的范围内聊一下自己对日志的理解以及实践。日志的作用:顾名思义就是记录程序的运行轨迹,记录可能需要用跟踪、排查的点的信息,或者作为另一种数据存储,用来做报表统计之用(比如订单打单量、慢sql等)。

     日志记录的载体可以是多种多样的:数据库、普通文件、索引引擎等。小应用时记录在当前项目所在的磁盘即可,但是项目分模块、跨服务器时,日志的分散将造成问题排查、数据统计的困难,怎么办?这个时候日志就需要统一收集。

     我现在所做的应用便是这样的情况,所以对日志做了统一的收集。通过java界内广泛应用的log4j,实现一个我们自己的appender,将需要的数据异步通过http请求发送给elastic。这个elastic便是一种索引管理引擎,能够分布式保存索引,并提供便捷、高性能的搜索支持。在展现时则通过kibana、grafana等视图,前者偏向于日志内容搜索,后者偏向于日志内容统计。

     在跨服务器、跨应用时还会碰到一个问题,就是同一个请求或任务链路的日志怎么串起来,我们现在的做法,是在请求或者任务之初产生一个id(cluId),在后面的任务、请求传递过程中一直保持这个id,在写日志的时候把这个id也写入,解决了这个问题。

     问题3,当日志请求非常多,来不及写时怎么处理?我们的做法是应用里维护一个队列,将数据维护在leveldb中,在发送出去后再进行清理,这为日志推送提供了流量控制以及容错支持。

     问题4,如果要对现有的日志数据进行加工,以便于统计分析,这个怎么做?我们把问题3的方案改造一下,应用不直接请求elastic,而是请求一个我们提供的服务,在我们提供的服务里对日志信息进行修改,再请求elastic,这就实现了对日志处理的切面抽取;可以统一进行管理。

实践细节

elastic:
版本是2.4.1,使用了4个实例,部署成集群
采用手动指定master的方式:node.master:true
写日志时的文件名加上日志后缀-yyyy-MM-dd,方便运维

我本地实验采用的配置:
discovery.zen.minimum_master_nodes:2 服务器要配置5
gateway.recover_after_nodes:1 在整个集群重启后,只有n个节点启动后才进行初始化恢复
node.max_local_storage_nodes:1 一个服务不允许起多个实例
action.destructive_requires_name:true

猜你喜欢

转载自blog.csdn.net/guzhangyu12345/article/details/78857720