Log不仅对开发者本身很重要,对软件系统乃至产品服务也很重要。每个开发者都接触过logging,所以每个人对logging的理解都会不一样。什么是日志什么是日志?在老码友看来,日志就是带有明确时间戳的信息数据的记录。根据不同的使用场景和角度,日志可以有多种分类方式。对于生成日志的主体,如果是开发者可以有工作或学习日志,如果是代码可以是程序日志。按照应用领域,可以有系统日志和应用日志,还可以进一步细分,比如消息日志、事件日志、数据库日志等等。写日志的方式对于开发者来说,写日志(note)是一个很好的工作习惯。随时把工作或学习中遇到的问题、解决方法、新的经验写下来,日积月累,逐步形成自己的知识体系。作为印象笔记的深度用户,老码农推荐使用印象笔记。当然,有道云笔记等其他工具也有效。开发者自己的日志一般是给自己看的。记录工作或学习日志的方式因人而异,适合自己就好。程序代码中的日志多用于跟踪和记录应用程序中的相关信息。为了方便其他开发者或其他应用程序的使用,一般都基于日志标准。广泛使用的日志记录标准是RFC5424(https://tools.ietf.org/html/rfc5424)中定义的syslog。syslog标准使标准化系统能够生成、过滤、记录和分析日志消息。例如其中定义的日志严重级别如下:Emergency:systemisunusableAlert:actionmustbetakenimmediatelyCritical:criticalconditionsError:errorconditionsWarning:warningconditionsNotice:normalbutsignificantconditionInformational:informationalmessagesDebug:debug-levelmessages在实际应用中,根据应用场景的不同,可能并不完全符合RFC5424.从各种日志工具库中都能看到他们的影子,参考《全栈的技术栈设想》,对于整个栈必备的几种编程语言,Java中的Log4j、Python中的Logging、JavaScript中的log4JS都是不错的选择,可惜,老码友没有用到ObjectiveC中更好的日志库,依然采用将nslog写入文件的方式来记录日志。在C/C++中,他们使用了log4CXX和zlog。在python世界里,有这么一句比较偏执的话,“以日志调试为荣,以单步跟踪为耻”。虽然有矫枉过正的嫌疑,但是充分说明了记录日志的重要性。常见应用中的日志所有成熟的系统都有自己的日志子系统,比如Windows系统日志、Linux系统日志、Docker容器日志等。这里简单回顾一下一些常见的后端服务的日志:Nginx日志、mysql日志和tomcat日志。Nginx日志主要分为两种:访问日志和错误日志。访问日志主要记录客户端每次访问Nginx的请求,格式可以自定义。通过访问日志,可以得到用户的地理来源、重定向来源、使用的终端、某个URL的访问次数等相关信息。错误日志主要记录客户端访问Nginx错误时的日志,格式不支持自定义。通过错误日志,可以得到系统中某个服务或服务器的性能瓶颈。在分析nginx日志的时候,目前资深coder比较喜欢的工具是goaccess。Tomcat下的相关日志文件包括Cataline引擎的日志文件,文件名为catalina.date.log;Tomcat下内部代码抛出的日志,文件名为localhost.date.log;Tomcat下默认的manager应用日志,文件名为manager.date.log;Linux下控制台输出日志默认重定向到catalina.out;通过Servlet.xml配置Access日志,应用使用log4j。properties:${catalina.base}/logs/probe.log等重定向的日志。就分析工具而言,目前资深coder觉得Awstats是个不错的工具。MySQL有以下几种日志:错误日志:记录启动、运行或停止时出现的问题,一般也记录警告信息。通用查询日志:记录建立的客户端连接和执行的语句。慢查询日志:记录所有超过longquerytime秒的查询或者没有使用索引的查询,可以帮助我们定位服务器性能问题。二进制日志:任何引起或可能引起数据库变化的操作,主要用于复制和时间点恢复。中继日志:从主服务器的二进制日志文件复制并保存为日志文件的事件。事务日志:记录InnoDB等支持事务的存储引擎执行事务时产生的日志。MySQL中的日志不仅仅是为了跟踪信息,而是成为业务系统的一部分。就日志分析而言,percona-toolkit是老coder的最爱,尤其是慢查询分析工具pt-query-degist。根据应用中的日志,可以获取系统中更多有价值的信息,可以为自己的日志系统提供资源。日志分析平台可以有一些非常好的工具对单体应用实体进行日志分析,比如上面提到的pt、goaccess等。但是,对于整个应用系统来说,工作流或者任务链中的每一个服务组件都会产生日志,那么如何分析整个业务系统的日志呢?资深码农认为ELK是一个不错的日志分析平台选择。ELK由Elasticsearch、Logstash和Kibana三部分组成:Elasticsearch是一个开源的分布式搜索引擎,其特点是分布式、零配置、自动发现、索引自动分片、索引复制机制、restful风格接口、多数据源、自动搜索负载等。Kibana是一个开源免费的工具,它为Logstash和ElasticSearch提供了日志分析结果的Web可视化界面,聚合、分析和搜索重要的数据日志。Logstash是一个完全开源的工具,可以收集、分析和存储各种日志以供提供。logstash的工作图如下:在ELK方案中,logstash进行日志收集和预处理,ES完成分布式检索,Kibaba可视化最终分析结果。随着需求的变化,基于ELK的变种越来越多,比如引入了Kafka消息队列,加入了Storm实时分析等,让基于日志的应用实现了更大的价值。进一步形成统一的日志平台,逐渐形成业务系统的一部分,比如支持数据的最终一致性等。没想到日志这么丰富多彩,还有很多有趣的问题,比如日志的动态切换配置,日志传输的准实时性,写日志的性能损耗日志等等。综上所述,日志的记录和分析不仅是全栈的必备技能,也是开发者的基本素质。【本文来自专栏作家“老曹”原创文章,作者微信公众号:哦家ArchiSelf,id:wrieless-com】点此阅读更多本作者好文
