新浪SAE日志中心的魔改打开方式(使用ThinkPHP)

众所周知,新浪SAE是一家很好很强大的云平台,而ThinkPHP是一个对sae支持很好的,易于上手的框架,然而我研究了ThinkPHP中sae模式的日志实现,发现了一些问题,所以写出来分享一下。下面以ThinkPHP3.2.3版举例,但(截至本文发布前)ThinkPHP5版也有相同的问题。

话不多说,先上代码。ThinkPHP在sae模式下输出日志的实现是这样的:

(ThinkPHP3.2.3版,ThinkPHP\Library\Think\Log\Driver\Sae.class.php

    /**
     * 日志写入接口
     * @access public
     * @param string $log 日志信息
     * @param string $destination  写入目标
     * @return void
     */
    public function write($log,$destination='') {
        static $is_debug=null;
        $now = date($this->config['log_time_format']);
        $logstr="[{$now}] ".$_SERVER['REMOTE_ADDR'].' '.$_SERVER['REQUEST_URI']."\r\n{$log}\r\n";
        if(is_null($is_debug)){
            preg_replace('@(\w+)\=([^;]*)@e', '$appSettings[\'\\1\']="\\2";', $_SERVER['HTTP_APPCOOKIE']);
            $is_debug = in_array($_SERVER['HTTP_APPVERSION'], explode(',', $appSettings['debug'])) ? true : false;
        }
        if($is_debug){
            sae_set_display_errors(false);//记录日志不将日志打印出来
        }
        sae_debug($logstr);
        if($is_debug){
            sae_set_display_errors(true);
        }

    }

那么这样的代码输出的日志是什么样的呢?我们打开sae控制台-应用日志中心-错误日志,看到的是这种场景:

默认日志效果

我们可以看到,这种情况下输出的日志是非常乱的。问题出在哪里呢?我来说明一下:

首先,所有在Log::record()中记录的日志内容,会汇总到一个字符串,最后传给write方法,也就是上文中的代码。通过这个代码我们可以发现问题:

  • 第一个问题,就是sae日志中心对单行日志的长度有限制。我们看上图,日志到了最后一个”第“的位置就截止了,后面的内容都没了。
  • 第二个问题,就是上图中橙色圈中的#015#012。这个是什么呢?观察一下就会发现,这个就是代码中的\r\n。sae日志中心并不支持包含换行符等特殊字符的日志内容,换行只会显示为这个#015#012,令人感到莫名其妙。实际是这样的,SAE这边的日志,都是通过syslog协议传输的,然而syslog协议本身,也是用\n去分割单条日志的,因此,在传输过程中,就需要进行转义了,在rsyslog的配置中,就会直接转义成#xxx的形式,就导致了这种情况。
  • 还有一个小问题,就是上图中蓝色的圈,我们可以看到访问时间和IP被输出了两遍。这是因为sae日志中心默认就会记录访问时间和IP,而ThinkPHP又再次输出了一遍,导致重复。

针对以上问题,我建议用到这个sae日志功能的朋友对代码进行修改:

首先是重复问题,

$now = date($this->config['log_time_format']);
$logstr="[{$now}] ".$_SERVER['REMOTE_ADDR'].' '.$_SERVER['REQUEST_URI']."\r\n{$log}\r\n";

这两行代码改一下,把时间和IP去掉:

$logstr="REQUEST".$_SERVER['REQUEST_URI']."\r\n{$log}";

这样就避免了重复输出时间和IP。

然后是前两个问题,一个简单的改法是:

sae_debug($logstr);

改为

$arr = explode("\r\n", $logstr);
foreach ($arr as $s) {
    sae_debug($s);
}

由于sae对单个请求支持多达1000行日志,所以这样把单行日志拆成多行,既解决了单行长度限制问题,顺便也把不能正常显示的换行符去掉了。

改好之后的效果:

改后效果

可以看到这样一来整齐了很多。

不过这样还不够。再接下来,我要对sae日志中心进行魔改。先上效果图:

魔改效果

这就是最终的魔改效果。

我是怎么做的呢?分两步。第一步,再次修改write方法,为输出的日志添加花边:


$arr = explode("\r\n", $log);
sae_debug("╚════════════════════════════════════════════");
sae_debug('║ REQUEST ['.$_SERVER['REQUEST_URI']."]");
sae_debug("╟────────────────────────────────────────────");
foreach ($arr as $s) {
    if(!empty(trim($s)))
        sae_debug("║ ".$s);
}
sae_debug("╔════════════════════════════════════════════");

第二步,调整网页的css显示效果。我用的是Chrome插件Stylebot。

tbody.showLog.table {
    background-color: #fdf6e3;
}

tbody.showLog.table tr td {
    border-top: 0px;
    padding: 0;
}

tr td img {
    display: none;
}

tr td span {
    color: #000000;
    font-size: 16px;
}

tr td span[title="客户端IP"] {
    color: #b58900;
}

tr td span[title="时区"] {
    color: #008080;
}

tr td span[title="本条日志产生的时刻"] {
    color: #008080;
}

这其中的几点:

  • 一点是去掉日志前面的+号按钮,因为debug日志是并没有LogDetail的,前面有个加号按钮会让人总以为能展开出什么东西,但实际上什么都没有,实在是太让人难受了,所以一定要去掉。
  • 然后就是既然展开不出什么别的东西,那么原有的日志行之间间距就太大了,缩小间距,去掉分割线,也便于展示花边效果。
  • 最后就是配色了,原网页的IP、时间和内容明明有不同的title,显示字体颜色却完全一样,真是浪费。这里我用了类似Solarized Light风格的配色,大家也可以使用自己喜欢的风格。

这里将Stylebot的网址匹配设为sae.sina.com.cn/?service=http&m=applog&level=debug**。注意这种魔改只适用于debug日志,不适用于访问日志(因为访问日志有LogDetail,内容也不能自定义),所以level=debug是要有的。

如此一来魔改就完成了。

魔改后会出现的另一个问题是,日志中心显示的日志是从后往前的,最新的在最上面,而如果下载日志查看的话却是从前往后的,这样一来两种模式的╚╔花边是反的。如果经常需要下载日志查看的话,可以选择不用这种花边。

以上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容