IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> SeasLog基本操作,封装到codeIgniter框架中 -> 正文阅读

[PHP知识库]SeasLog基本操作,封装到codeIgniter框架中

基本操作

日志文件存储地址

log记录目录 = basePath / logger / {fileName}.log
log文件名,以 `年月日` 分文件,如今天是20210118日期,那么 `{fileName}` = `20210118`;
//basePath通过setBasePath设置,未设置为php.ini中设置的根目录
//basePath通过setLogger设置,未设置为php.ini中设置的Logger目录

常用操作函数

SeasLog::setBasePath("/var/www/data/log"); //设置根目录
SeasLog::setLogger("testLogger"); //设置模块


SeasLog::info("This is a Info");  //info级别日志
SeasLog::debug("This is a debug"); //debug级别日志
SeasLog::notice("This is a notice"); //notice级别日志
SeasLog::warning('This waring is {$warning}', ['{$warning}' => 'code fail']); //warning级别日志
SeasLog::error('This is a error'); //error级别日志

还有其他写日志的没有写,总共有8钟日志级别

//这些是定义的常量列表
SEASLOG_DEBUG      "DEBUG"       - debug信息、细粒度信息事件
SEASLOG_INFO       "INFO"        - 重要事件、强调应用程序的运行过程
SEASLOG_NOTICE     "NOTICE"      - 一般重要性事件、执行过程中较INFO级别更为重要的信息
SEASLOG_WARNING    "WARNING"     - 出现了非错误性的异常信息、潜在异常信息、需要关注并且需要修复
SEASLOG_ERROR      "ERROR"       - 运行时出现的错误、不必要立即进行修复、不影响整个逻辑的运行、需要记录并做检测
SEASLOG_CRITICAL   "CRITICAL"    - 紧急情况、需要立刻进行修复、程序组件不可用
SEASLOG_ALERT      "ALERT"       - 必须立即采取行动的紧急事件、需要立即通知相关人员紧急修复
SEASLOG_EMERGENCY  "EMERGENCY"   - 系统不可用

可以使用log()方法快速编写日志

/**
* $level 日志级别,就是上面的常量列表
* $message 写入日志文件的信息
* $params 可以替换$message中的占位符
* $logger 可以设置该日志存储的临时路劲,不会对其他日志文件造成影响
*/
SeasLog::log($level,$message,$params,$logger);

运行结果

其中的参数为 时间 | 日志等级 | php进程id | 生成的uniqid | 时间戳 | 日志信息|

在这里插入图片描述

集成到codeIgniter框架中

这里我将记录日志信息封装成了一个类进行调用,和之前封装的功能类一样放在libraries目录下,但是因为记录日志运用广泛,所以直接在入口文件进行实例化,这样框架全局就都可以使用Logs类记录日志了。

<?php
/**
 * Created by PhpStorm.
 * User: wyq
 * Date: 2022/1/25
 * Time: 20:14
 */

/*
    * SEASLOG_DEBUG      "DEBUG"       - debug信息、细粒度信息事件
    * SEASLOG_INFO       "INFO"        - 重要事件、强调应用程序的运行过程
    * SEASLOG_NOTICE     "NOTICE"  - 一般重要性事件、执行过程中较INFO级别更为重要的信息
    * SEASLOG_WARNING    "WARNING"     - 出现了非错误性的异常信息、潜在异常信息、需要关注并且需要修复
    * SEASLOG_ERROR      "ERROR"       - 运行时出现的错误、不必要立即进行修复、不影响整个逻辑的运行、需要记录并做检测
    * SEASLOG_CRITICAL   "CRITICAL"    - 紧急情况、需要立刻进行修复、程序组件不可用
    * SEASLOG_ALERT      "ALERT"       - 必须立即采取行动的紧急事件、需要立即通知相关人员紧急修复
    * SEASLOG_EMERGENCY  "EMERGENCY"   - 系统不可用
*/

class Logs
{
    public static function init($basePath = "", $logger = "")
    {
        if (class_exists("SeasLog")) {
            if ($basePath) {
                SeasLog::setBasePath($basePath);
            }
            if ($logger) {
                SeasLog::setLogger($logger);
            }
        }
    }

    /**
     * Log constructor.
     * 写日志
     * @param $level 日志级别8个
     * @param string $message 日志记录信息
     * @param array $data 替换$message中的占位符数据
     * @param string $module 指定一个logger来存储日志,只会改变当前存储的日志,不会对下面的日志造成影响
     */
    public static function log($level, $message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")){
            //记录当前请求的uri,便于寻找记录日志的地址
            $msg['url'] = isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:'';
            $msg['msg'] = $message;
            SeasLog::log($level, json_encode($message, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), $data, $module); //中文和斜杠不转义,正常显示。
            if (PHP_SAPI == "cli" OR defined('STDIN')){
                //运行模式是否是cli模式,是的话手动清除缓存
                SeasLog::closeLoggerStream(SEASLOG_CLOSE_LOGGER_STREAM_MOD_ALL);
            }
        }
    }

    /**
     * debug
     * @param string $message
     * @param array $data
     * @param string $module
     */
    public static function debug($message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")) {
            self::log(SEASLOG_DEBUG, $message, $data, $module);
        }
    }

    /**
     * info
     * @param string $message
     * @param array $data
     * @param string $module
     */
    public static function info($message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")) {
            self::log(SEASLOG_INFO, $message, $data, $module);
        }
    }

    /**
     * notice
     * @param string $message
     * @param array $data
     * @param string $module
     */
    public static function notice($message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")) {
            self::log(SEASLOG_NOTICE, $message, $data, $module);
        }
    }

    public static function warning($message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")) {
            self::log(SEASLOG_WARNING, $message, $data, $module);
        }
    }

    /**
     * error
     * @param string $message
     * @param array $data
     * @param string $module
     */
    public static function error($message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")) {
            self::log(SEASLOG_ERROE, $message, $data, $module);
        }
    }

    /**
     * critical
     * @param string $message
     * @param array $data
     * @param string $module
     */
    public static function critical($message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")) {
            self::log(SEASLOG_CRITICAL, $message, $data, $module);
        }
    }

    /**
     * alert
     * @param string $message
     * @param array $data
     * @param string $module
     */
    public static function alert($message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")) {
            self::log(SEASLOG_ALERT, $message, $data, $module);
        }
    }

    /**
     * emergency
     * @param string $message
     * @param array $data
     * @param string $module
     */
    public static function emergency($message = "", $data = [], $module = "")
    {
        if (class_exists("SeasLog")) {
            self::log(SEASLOG_EMERGENCY, $message, $data, $module);
        }
    }
    /**
     * 统计日志信息
     * @param $level 日志等级
     * @param $module 模块名
     * @param $date 日期格式为:Ymd格式
     * @return mixed  返回详细数组
     */
    public static function countLog($level, $module = "default", $date = "")
    {
        if (class_exists("SeasLog")) {
            if (empty($module)) {
                $module = "default";
            }
            SeasLog::setLogger($module);
            return SeasLog::analyzerCount($level, $date);
        }
    }

    /**
     * @param $level 日志等级
     * @param string $module 模块名
     * @param string $date  日期格式为:Ymd格式
     * @return mixed 返回详细数组
     */
    public static function detailLog($level, $module = "default", $date = "")
    {
        if (class_exists("SeasLog")) {
            if (empty($module)) {
                $module = "default";
            }
            SeasLog::setLogger($module);
            return SeasLog::analyzerDetail($level, $date);
        }
    }
}

index.php入口文件加入如下代码,加载框架时就引入Logs功能类

require_once('application' . DIRECTORY_SEPARATOR . 'libraries' . DIRECTORY_SEPARATOR . 'Logs.php');
//定义默认的basePath和Logger目录
Logs::init('/log','default');

在登录操作中加入Logs记录

public function login()
    {
        //获取数据
        $post = $this->input->post();
        //查询是否有该用户名
        $data = $this->users_model->findByUsername($post['username']);
        if ($data) {
            if (encrypt($post['password']) == $data['password']) {
                //记录登录日志
                $sqlData = [
                    'ip' => $_SERVER['SERVER_ADDR'],
                    'init_time' => time(),
                    'user_name' => $post['username'],
                    'uid' => $data['id']
                ];
                $data['init_time'] = time();
                //登录日志
                $this->logger_model->userLoginLog($sqlData);
                //新增代码记录用户登录日志在userLogin模块
                Logs::info("用户{$post['username']}登陆成功",[],'userLogin');
                //用户首次登录成功送一个骰子、以及概率获得一个魔盒
                $res = $this->Activity_service->addDice($data['id'],'Login');
                $data['token'] = $this->Jwt_service->getToken($data['id']);
                if ($res){
                    $data['magicBox'] = $res['magicBox'];
                }
                success($data, '登陆成功!');
            } else {
                fail(501, '密码错误!');
            }
        } else {
            fail(500, '没有该用户!');
        }
    }

运行结果

在这里插入图片描述
后续封装的统计日志函数

//发送邮箱
    public function sendmail()
    {
        $data = $this->input->post();
        $this->form_validation->set_data($data);
        $this->form_validation->set_rules('email', 'email', 'required|valid_email');
        if ($this->form_validation->run() == FALSE) {
            fail('400', '邮箱地址错误!');
        }

        $email = $data['email'];
        //生成随机6位数验证码
        $code = rand_code(6);
        $conn = getRedis();
        $conn->selectDb(0);
        $key = 'emailCode' . $email;
        //上锁,过期时间60s
        $status = $conn->setNx($key, $code);
        $conn->expire($key, 60);
        if (!$status) {
            fail(500, '操作太快啦,验证码还没过期!');
        }
        $Ema = getEmail();
        $title = "用户注册验证码";
        $content = "<h1>邮箱验证码为{$code}</h1>";
        $res = $Ema->sendmail($email, $title, $content);
        $data = [
            'title' => $title,
            'content' => $content,
            'email' => $email,
        ];
        if ($res) {
            Logs::debug($data);
            success($code, 'success');
        }
        Logs::error($data);
        fail($code, "fail");
    }

运行结果
在这里插入图片描述

日志上面几次不一致是因为前面编写的代码有点问题,只有最后三条是正确的信息。

这里就实现了基本的SeasLog记录日志的功能,SeasLog还有许多其他强大的功能,后续有用到在继续封装使用。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 11:40:17  更:2022-01-28 11:41:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 5:17:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计