一.seaslog 简单介绍及使用原因

  它是C 写的PHP扩展,性能很高,使用简单,能满足大部分简单的日志需求。(个人感觉)

其他优势请看--》https://github.com/Neeke/SeasLog, http://www.oschina.net/p/seaslog

缺点:(使用时碰到的坑)

1.如果配置有差错会直接报错,程序不健壮会导致页面直接挂掉,而且由于C写的这种意外报错你很难处理。(建议基本路径和模块路径一定要写对;环境变更时 也要时刻注意)

2. cli模式和CGL 模式下的读写混合的话,会报错,你注意区分下执行用户,即使日志文件是 777,也要区分 (正常坑)

二.安装与装置(比较简单,稍提一下)

  1.下载安装包,https://github.com/Neeke/SeasLog

2. 解压并进入目录,执行phpize,$/path/to/phpize

3.$ ./configure --with-php-config=/path/to/php-config

4.make && make install

  (如有不清楚  http://www.oschina.net/p/seasloghttps://github.com/Neeke/SeasLog,或者 博客下面留言)

三.因为公司使用的YII2 框架,我想要把这个日志系统加入使用,并且可配置化,无论是加入还是移除都比较方便;其次我想要他自动补全,那样开发起来效率高一些。

  1.首先yii2 中的配置文件web.php 总加入日志类的指向:

   说明: 我把我写的seaslog类放在base层,并且配置日志目录,框架的runtime 目录

return [
// ...
'components' => [
'authManager' => [
'class' => 'app\mvc\_base\srv\Seaslog',
       'basePath' => dirname(dirname(__DIR__)) . '/runtime/seaslog'
// 'logPath' => 'default'
],
// ...
],
];

2. 封装日志类

思想:为了配合的方便与查看的清晰,我的每个日志文件与其命名空间对应,这样日志文件对应的产生日志的地方将一目了然(但是进入目录时有点小麻烦);继承yii2 的 object组件,以及修改部分框架的代码以达到自动补全功能;

  

class SeasLog extends Object
{ public $basePath ; //日志存放的目录
public $loggerPath ; // 日志模块下面分模块 public function __construct()
{
parent::__construct();
//todo 初始化工作
} /**
* @desc 通用记录日志的 方法,可以设置级别
* @Author FredGui
* @param $message
* @param string $loggerPath 默认是default, 一般使用调用者的命名空间 目录,php.ini 配置里面 是 defaultLog
* @param $level 总共8个 级别 ,暂且用三个,SEASLOG_INFO,SEASLOG_WARNING,SEASLOG_ERROR,
* SEASLOG_DEBUG,SEASLOG_INFO,SEASLOG_NOTICE,SEASLOG_WARNING,SEASLOG_ERROR,SEASLOG_CRITICAL,SEASLOG_ALERT,SEASLOG_EMERGENCY
*/
public function log($message,$loggerPath = 'default' ,$level = SEASLOG_WARNING ){ try{
$message = (is_array($message) || is_object($message)) ? json_encode($message,JSON_UNESCAPED_UNICODE) : $message;
if(file_exists($this -> basePath ) && is_writable($this -> basePath ) ) {
$this -> setBasePath($this -> basePath); // 设置 日志目录
$this -> setLogger($loggerPath); // moming模块名 即为 命名空间
\SeasLog::log($level, $message, array() ,'');
}else{
// 默认 /var/log/www 日志目录
// 默认 defaultLog 存放日志文件
\SeasLog::log($level, $message, array() ,'');
throw new Exception('日志路径没有读写权限!!',100001);
}
}catch (Exception $e){
// 出现错误异常记录下,存放在 日志路径下的 seaslogError.log
$errorPath = realpath(\Yii::$app->basePath . '/../runtime/seaslog');
// 目录问题
if(!is_dir($errorPath)){
@mkdir($errorPath, 0777, true);
chmod($errorPath, 0777);
if (!is_dir($errorPath)) exit('no write permission');
}
file_put_contents($errorPath .'/seaslogError.log' , 'time:'.date('Y-m-d H:i:s').','.$e->getMessage() . '错误码:' .$e->getCode() ,FILE_APPEND);
}
} /**
* 记录info日志
* @param $message
* @param string $loggerPath
*/
public function info($message, $loggerPath = 'default')
{
$this -> log($message,$loggerPath,SEASLOG_INFO);
}
.....(后续的设置多等级,可以看官网)

    

由此可以得到 如下的日志目录:

进入查看:

最后,我们来完善下,自动补全,像这样

在  path\vendor\yiisoft\yii2\Yii.php 总的$app 总 添加

/**
* @var \yii\base\BaseApplication|\yii\web\WebApplication|\yii\console\ConsoleApplication the application instance
*/
public static $app; 然后 生成对应的 文件到目录 ,空文件就行
比如:BaseApplication.php
<?php
/**
* Created by PhpStorm.
* User: FredGui
* Date: 2016/06/12
* Time: 14:17
*/ namespace yii\base; /**
* Class BaseApplication
* Used for properties that are identical for both WebApplication and ConsoleApplication
*
* @property \app\mvc\_base\srv\SeasLog $seaslog The auth manager for this application. Null is returned if auth manager is not configured. This property is read-only. Extended component. */
abstract class BaseApplication extends Application
{
}
WebApplication.php 和 ConsoleApplication 也是如此。

至此 yii2 中就可以方便的使用seaslog组件了~~~~~

php扩展SeasLog应用于 yii2 组件的更多相关文章

  1. SSD固态盘应用于Ceph集群的四种典型使用场景

    在虚拟化及云计算技术大规模应用于企业数据中心的科技潮流中,存储性能无疑是企业核心应用是否虚拟化.云化的关键指标之一.传统的做法是升级存储设备,但这没解决根本问题,性能和容量不能兼顾,并且解决不好设备利 ...

  2. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  3. PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件

    PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件 简介: 在应用系统软件开发过程中,如果软件由很多对象组成,它的结构仅仅凭借分析很难理清,同时为了有利于软件的开发及重用, ...

  4. 20155301-滕树晨 第二次随笔作业--从现有技能获取的经验应用于JAVA中

    第二次随笔--从现有技能获取的经验应用于JAVA中 你有什么技能比大多人(超过90%以上)更好? 这个想了半天,有一个是我乒乓球还是比较擅长的,在学校里可能比百分之90的人要强,在外面肯定是不如了.再 ...

  5. Git应用于Android项目的入门知识:我的理解

    Git应用于Android项目的基本知识.     常常将git,repo和gerrit三种工具配合起来使用,使Android开发中的部分工作自动化.并适应敏捷项目管理的需要.     repo是Go ...

  6. thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)

    _stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上" ...

  7. @Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。

    @Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationEx ...

  8. JavaScript应用于asp开发场景

    JavaScript应用于asp开发场景 演示代码示例: <%Path="../"%> <!--#include file="../../Inc/Con ...

  9. promise应用于ajax

    promise应用于ajax,可以在本页打开控制台,复制代码试验 var url = 'https://www.cnblogs.com/mvc/blog/news.aspx?blogApp=dkplu ...

随机推荐

  1. Jobject 使用

    obj2 = JObject.Parse(result.Html); JArray _Jarr = _obj["data"]["siteList"].Value ...

  2. 如何用70行Java代码实现深度神经网络算法

    http://www.tuicool.com/articles/MfYjQfV 如何用70行Java代码实现深度神经网络算法 时间 2016-02-18 10:46:17  ITeye 原文  htt ...

  3. ZBUS = MQ + RPC

    http://git.oschina.net/rushmore/zbus http://my.oschina.net/sbz/blog  Readme.md 18.02 KB ZBUS = MQ + ...

  4. SQL复习一(基础知识)

    1.什么是sql SQL(structure query language)是结构化查询语言,它是对关系型数据库的操作语言.它可以应用到所有的数据库中,例如:MySQL.Oracle.SQL serv ...

  5. OPENCV图像特征点检测与FAST检测算法

    前面描述角点检测的时候说到,角点其实也是一种图像特征点,对于一张图像来说,特征点分为三种形式包括边缘,焦点和斑点,在OPENCV中,加上角点检测,总共提供了以下的图像特征点检测方法 FAST SURF ...

  6. NULL、nil、Nil、NSNull的区别

    标志 值 含义 NULL (void *)0 C指针的字面零值 nil (id)0 Objecve-C对象的字面零值 Nil (Class)0 Objecve-C类的字面零值 NSNull [NSNu ...

  7. 【repost】JS中的hook机制

    hook机制也就是钩子机制,由表驱动实现,常用来处理多种特殊情况的处理.我们预定义了一些钩子,在常用的代码逻辑中去适配一些特殊的事件,这样可以让我们少些很多if else语句.举个高考加分的例子,比如 ...

  8. [无关IT]就这样在凌晨写一篇吧~

    由于新浪博客广告实在太嚣张,自己也都是转载,故决定搬家至此,一改只转不写的习惯T^T,争取记录一下自己的小成长~日后有时间把脑子里的小东西一点点写出来~(好可怕的说)... 好了,睡了!各位爷早睡~ ...

  9. Servlet中的过滤器Filter用法

    1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...

  10. iOS强制切换横屏、竖屏

    切换横竖屏最直接的方式是调用device的setOrientation方法.但是从sdk3.0以后,这个方法转为似有API,如果要上AppStore的话,要慎用! if ([[UIDevice cur ...