<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>日志系统 on 勇气</title><link>https://courages.us/tag/%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F/</link><description>Recent content in 日志系统 on 勇气</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 03 Oct 2016 23:07:28 +0800</lastBuildDate><atom:link href="https://courages.us/tag/%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F/index.xml" rel="self" type="application/rss+xml"/><item><title>日志系统设计</title><link>https://courages.us/%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/</link><pubDate>Mon, 03 Oct 2016 22:35:33 +0800</pubDate><guid>https://courages.us/%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/</guid><description>&lt;p&gt;日志系统是项目开发/运维当中非常重要的一部分，提供产品使用情况，跟踪调试信息等。以前都是各个项目各自实现日志记录，比如PHP、JAVA各自实现一套，如果要跨项目/服务器进行查询/跟踪/统计，则比较麻烦，比如Web后台–&amp;gt;业务模块–&amp;gt;基础组件，客户端–&amp;gt;公共接口–&amp;gt;业务模块等等。&lt;br&gt;&#10;目前的项目都是将日志写入本地，首先需要定义统一的规范：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;格式&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DateTime | ServerIP | ClientIP | PID | RequestID| Type | Level | Message| Code&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DateTime：记录日志的当前时间戳&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ServerIP：当前服务器IP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ClientIP:客户端IP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PID：进程ID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RequestID：交易号，即请求的唯一标识，使用uniqid(+UserCode)或UUID或，一次请求会有多条日志，，用于关联本次请求内的相关日志&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type：日志类型，比如统计，操作（审计），业务等&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Level：日志等级&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Message：日志内容，当为值为数组或者对象时转为JSON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type为RUNTIME时，表示运行日志，属性：自定义&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type为HTTP时，表示来源请求，属性：Url，Method（Get/Post），Params，RemoteIP，UserAgent，ReferUrl[，Action，Method]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type为REST时，表示外部调用，属性：Type（Http/Https），Url,Port，RequestParams，Response，RunTime；&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type为SQL时，表示SQL执行，属性：Sql，RunTime&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Code：标识码，记录错误码、响应码、统计码、版本、自定义信息，方便统计&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的RequestID由入口处自动产生，用于标识一次请求，关联所产生的所有日志，需要在各个项目之间传递。为了减少日志，Level通常为Info级别，避免产生过多日志。为了方便调试追踪，RequestID和Level也可以在其他参数中指明，比如HTTP头里面附加。&lt;br&gt;&#10;然后是日志收集：客户端收走日志系统，发送给日志系统服务端。&lt;br&gt;&#10;然后分析处理呈现：服务端将接收到的日志，发给处理其他组件分析处理，提供Web界面的查询系统。研发人员，可以错误信息，定位问题；获悉程序运行情况进行调优；大数据分析日志，得出产品使用情况；运维平台则可以进行业务报警。&lt;/p&gt;&#10;&lt;p&gt;日志产生由个语言依照规范自行实现，收集、保持则由&lt;a class="link" href="https://flume.apache.org/" target="_blank" rel="noopener"&#10; &gt;Flume&lt;/a&gt;和&lt;a class="link" href="http://kafka.apache.org/" target="_blank" rel="noopener"&#10; &gt;Kafka&lt;/a&gt;实现。Flume是一个分布式的日志收集、合并、移动系统，能够监控文件变化，将变化部分传输出去。Kafka是一个分布式的发布/订阅的消息流平台，包括Broker，Consumer，Producer都支持分布式，依赖&lt;a class="link" href="https://courages.us/php-zookeeper%e5%88%86%e5%b8%83%e5%bc%8f%e6%9c%8d%e5%8a%a1%e5%bc%80%e5%8f%91/" target="_blank" rel="noopener"&#10; &gt;Zookeeper&lt;/a&gt;实现。&lt;/p&gt;&#10;&lt;p&gt;在PHP上面的实现，一开始使用&lt;a class="link" href="https://logging.apache.org/log4php/" target="_blank" rel="noopener"&#10; &gt;log4php&lt;/a&gt;，看起来很美好，但是性能很差，对业务影响较大。决定再次简化，砍掉不必要的东西（Socket，邮件等等），在C语言开发的PHP日志扩展&lt;a class="link" href="https://github.com/Neeke/SeasLog" target="_blank" rel="noopener"&#10; &gt;SeasLog&lt;/a&gt;基础上在做开发，将日志文件保存在本地。为了减少日志所占用内存，每超过一定的大小的日志即进行保存，否则在最后进行保存，利用了Nginx的fastcgi_finish_request特性。生产上发现，每天产生的文件日志太大了，需要控制日志信息大小、等级，并及时清理。&lt;br&gt;&#10;对于Web后台，还结合FirePHP，将日志直接输出到浏览器，方便边运行变调试。&lt;/p&gt;&#10;&lt;p&gt;参考链接：&lt;br&gt;&#10;&lt;a class="link" href="http://www.bitstech.net/2014/01/07/log-best-practice/" target="_blank" rel="noopener"&#10; &gt;最佳日志实践&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://testing.googleblog.com/2013/06/optimal-logging.html" target="_blank" rel="noopener"&#10; &gt;Optimal Logging&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://neoremind.com/2016/05/flumekafka%E6%94%B6%E9%9B%86docker%E5%AE%B9%E5%99%A8%E5%86%85%E5%88%86%E5%B8%83%E5%BC%8F%E6%97%A5%E5%BF%97%E5%BA%94%E7%94%A8%E5%AE%9E%E8%B7%B5/" target="_blank" rel="noopener"&#10; &gt;Flume+Kafka收集Docker容器内分布式日志应用实践&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://tech.meituan.com/mt-log-system-arch.html" target="_blank" rel="noopener"&#10; &gt;基于Flume的美团日志收集系统(一)架构和设计&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.infoq.com/cn/news/2015/09/BookKeeper-Twitter" target="_blank" rel="noopener"&#10; &gt;Twitter是如何构建高性能分布式日志的&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://dongxicheng.org/search-engine/log-systems/" target="_blank" rel="noopener"&#10; &gt;开源日志系统比较&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://www.infoq.com/cn/articles/kafka-analysis-part-1" target="_blank" rel="noopener"&#10; &gt;Kafka剖析（一）：Kafka背景及架构介绍&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://blog.wilddog.com/?p=862" target="_blank" rel="noopener"&#10; &gt;基于Flume的野狗实时日志系统的演进和优化&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://github.com/EVODelavega/phpkafka" target="_blank" rel="noopener"&#10; &gt;EVODelavega/phpkafka&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://tech.youzan.com/you-zan-tong-ri-zhi-ping-tai-chu-tan/" target="_blank" rel="noopener"&#10; &gt;有赞统一日志平台初探&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://blog.csdn.net/yangbutao/article/details/8741977" target="_blank" rel="noopener"&#10; &gt;RabbitMQ和kafka从几个角度简单的对比&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://segmentfault.com/a/1190000002532284" target="_blank" rel="noopener"&#10; &gt;Flume-ng的原理和使用&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="http://dataunion.org/19045.html" target="_blank" rel="noopener"&#10; &gt;利用flume+kafka+storm+mysql构建大数据实时系统&lt;/a&gt;&lt;/p&gt;&#10;</description></item></channel></rss>