基本操作
日志文件存储地址
log记录目录 = basePath / logger / {fileName}.log
log文件名,以 `年月日` 分文件,如今天是2021年01月18日期,那么 `{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还有许多其他强大的功能,后续有用到在继续封装使用。