php扩展SeasLog应用于 yii2 组件

一.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组件了~~~~~
时间: 2024-11-05 16:48:33

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

大数据应用于web

python可以应用于web开发,但是与web后端语言不同的是python开发web的话需要自己编写web服务器. 我从网上找了一个例子 import os #Python的标准库中的os模块包含普遍的操作系统功能 import re #引入正则表达式对象 import urllib #用于对URL进行编解码 from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler #导入HTTP处理相关的模块 #自定义处理程序,用于处理HTTP

MVC 无法将带 [] 的索引应用于“System.Dynamic.DynamicObject”类型的表达式

无法将带 [] 的索引应用于“System.Dynamic.DynamicObject”类型的表达式 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法将带 [] 的索引应用于“System.Dynamic.DynamicObject”类型的表达式 解决方法: ViewBag["xxx&q

GPGPU之应用于Mapped Reduced

http://www.cse.ust.hk/gpuqp/Mars.html http://www.cse.ust.hk/gpuqp/ GPGPU之应用于Mapped Reduced,布布扣,bubuko.com

jsWindow 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。 注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。 Window 对象集合 集合 描述 frames[] 返回窗口中所有命

一.JSX简介 JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析. 如下(JS写法) var child1 = React.createElement('li', null, 'First Text Content'); var child2 = React.createElement('li', null, 'Second Text Content'); var

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

_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数.格式为:[email protected]. C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈.对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定).另外,在函数名修饰约定方面也有所不同.  _cd

互信息应用于SNP特征选择的局限

互信息已广泛应用于特征选择问题,但应用在 SNP 选择上还存在着一些局限.第一,互信息只能衡量一个 SNP 组合与表型的相关性, 无法衡量多个 SNP 与表型的相关性.第二, 利用互信息排序 SNP 时,隐含着一个假设,即: SNP 间是相互独立的,不存在着依赖关系.然而事实上,SNP 间存在着广泛的交互作用.因此,互信息排序 SNP 会严重低估交互作用 SNP 的重要性.第三,利用互信息选择 SNP 组合时,任意加入一个新 SNP 都会使互信息值不小于加入前该 SNP 组合的互信息值,限制了不

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

@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常. java public class Student { private Integer age; private String name; @Required public void setAge(Integer age) { this.age = age; } public

Linux路由表的抽象扩展应用于nf_conntrack

思想 标准IP路由查找的过程为我们提供了一个极好的"匹配-动作"的例程. 即匹配到一个路由项.然后将数据包发给该路由项指示的下一跳.假设我们把上面对IP路由查找的过程向上抽象一个层次,就会发现,事实上它还能够有别的用.抽象后的表述为:以数据包的源地址或者目标地址为键值去查询一张表.查到结果项以后运行结果项指示的一个动作.一个结果项为: struct result_node { uint32 network; uint32 netmask; void *action; }; 以上这个思想

yii2组件之多图上传插件FileInput的详细使用

作者:白狼 出处:http://www.manks.top/yii2_multiply_images.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 文件上传也写过几篇文章了,包括最基本的yii2文件上传.异步上传到又拍云以及百度编辑器图片上传的问题,貌似不说点多图上传的就不完美. 今天介绍一款多图上传的插件 FileInput,至于为什么选中了TA作为我们上传的插件,一来这货跟Yii2有一腿,用起来方便:二来嘛