monolog封装
做一下基本关于Monolog的基本介绍:
Monolog是基于PHP的日志类库。
介绍就到这,言归正传
安装
安装最新版本:(composer 还没安装的~:https://www.phpcomposer.com/)
composer require monolog/monolog
要求PHP版本为5.3以上。
以上都是百度都可以进行搜索的废话,这里咱们只是进行复制并且再废话一遍~
接下来的是重点:
<?php
/**
* Created by PhpStorm.
* User: j
* Date: 2019-01-09
* Time: 15:33
*/
namespace common\log;
use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
class Log
{
private static $loggers;
/**
* 日志默认保存路径
* @var string
*/
private static $fileName = '/data/logs/monolog/';
/**
* 日志留存时间
* @var int
*/
private static $maxFiles = 31;
/**
* 日志等级
* @var int
*/
private static $level = Logger::DEBUG;
/**
* 文件读写权限分配
* 0666 保证log日志文件可以被其他用户/进程读写
* @var int
*/
private static $filePermission = 0666;
/**
* monolog日志
* @param $name
* @param $arguments
* @return mixed
*/
public static function __callStatic($name, $arguments)
{
$logger = self::createLogger($name);
$message = empty($arguments[0]) ? '' : $arguments[0];
$context = empty($arguments[1]) ? [] : $arguments[1];
$levelName = empty($arguments[2]) ? $name : $arguments[2];
$backtraceOffset = empty($arguments[3]) ? 0 : intval($arguments[3]);
$level = Logger::toMonologLevel($levelName);
if (!is_int($level)) $level = Logger::INFO;
// $backtrace数组第$idx元素是当前行,第$idx+1元素表示上一层,另外function、class需再往上取一个层次
// PHP7 不会包含'call_user_func'与'call_user_func_array',需减少一层
if (version_compare(PCRE_VERSION, '7.0.0', '>=')) {
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
$idx = 0 + $backtraceOffset;
} else {
$backtrace = debug_backtrace();
$idx = 1 + $backtraceOffset;
}
$trace = basename($backtrace[$idx]['file']) . ":" . $backtrace[$idx]['line'];
if (!empty($backtrace[$idx + 1]['function'])) {
$trace .= '##';
$trace .= $backtrace[$idx + 1]['function'];
}
$message = sprintf('==> LOG: %s -- %s', $message, $trace);
return $logger->addRecord($level, $message, $context);
}
/**
* 创建日志
* @param $name
* @return mixed
*/
private static function createLogger($name)
{
if (empty(self::$loggers[$name])) {
// 根据业务域名与方法名进行日志名称的确定
$category = $_SERVER['SERVER_NAME'];
// 日志文件目录
$fileName = self::$fileName;
// 日志保存时间
$maxFiles = self::$maxFiles;
// 日志等级
$level = self::$level;
// 权限
$filePermission = self::$filePermission;
// 创建日志
$logger = new Logger($category);
// 日志文件相关操作
$handler = new RotatingFileHandler("{$fileName}{$name}.log", $maxFiles, $level, true, $filePermission);
// 日志格式
$formatter = new LineFormatter("%datetime% %channel%:%level_name% %message% %context% %extra%\n", "Y-m-d H:i:s", false, true);
$handler->setFormatter($formatter);
$logger->pushHandler($handler);
self::$loggers[$name] = $logger;
}
return self::$loggers[$name];
}
}
只要把该文件放在项目的目录下,并且保证项目的路由没问题的时候,你就可以打印日志了。
打印有多简单呢,一行即可,还是可以随着你的自定义命名,进行服务器上的对应文件写入~
/**
* 如何使用log日志
*/
public function actionUseLog()
{
// Log是静态方法 引入use common\log\Log;即可以调用
// info是写入的方法名称,这里可以自定义,可以是任何文件名称,这里如果写入info 服务器看到的就是带 info-2019-01-01.log 的文件
// 就是这么简单
// 使用的时候在服务器新建/data/logs/monolog/ 路径的文件夹,并且给与0666以上读写权限即可
Log::info('第一个字段是内容',['KEY'=>'VALUE']);
}
转自 https://www.jianshu.com/p/0aeb8824fe23
monolog封装的更多相关文章
- 这可能是php世界中最好的日志库——monolog
由于一些历史原因,php中并没有内建的日志接口,故长期以来也没一个功能完备并且应用广泛的日志库.在我的工作生涯中,如果系统需要记录一些应用日志的话,基本上就是封装一个日志类,然后把一些要记录的字段写入 ...
- monolog 应该是世界上最好的日志插件了
引入 composer require monolog/monolog 官网 https://github.com/Seldaek/monolog 创建工具类 <?php /** * Creat ...
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- iOS开发之App间账号共享与SDK封装
上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...
- Ajax实现原理,代码封装
都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- 封装集合(Encapsulate Collection)
封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...
随机推荐
- python sha256 键值对参数格式接口测试
# coding=utf-8 import requests import time import uuid import hashlib import hmac import random impo ...
- adb命令装包failure问题
图片摘自CSDN,待验证
- 原生js实现懒加载并节流
像淘宝网站等,页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费.采用懒加载技术,即用户浏览到哪儿,就加载该处的图片.这样节省网络资源.提升用户体验.减少服务器压力. 方法1: ...
- 使用Spring Boot+MyBatis框架做查询操作
一.在你建立的工程下创建 Module 选择Spring initializr创建. 二.在Type处选择: Maven Project(项目的构建工具) 三.创建依赖时勾上web,mybatis,m ...
- 1.KafKa-介绍
- Flutter学习六之实现一个带筛选的列表页面
上期实现了一个网络轮播图的效果,自定义了一个轮播图组件,继承自StatefulWidget,我们知道Flutter中并没有像Android中activity的概念.页面见的跳转是通过路由从一个全屏组件 ...
- Halcon使用骨架法处理激光条并拟合直线
dev_close_window () * 设置颜色 dev_set_color ('green') * 读取图像 read_image (Image, 'images3/1') * 获得图像尺寸 g ...
- Java锁?分布式锁?乐观锁?行锁?
转载自:公众号来源:码农翻身 作者:刘欣 Tomcat的锁 Tomcat是这个系统的核心组成部分, 每当有用户请求过来,Tomcat就会从线程池里找个线程来处理,有的执行登录,有的查看购物车,有的下订 ...
- 趣图:调试bug进行时
扩展阅读 趣图:大神写实,左脚程序继续运行,右脚程序调试 趣图:Bug 多了,总有一个会把你坑了 趣图:领导在旁,只求代码无Bug
- 命令执行漏洞攻击&修复建议
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行系统命令.当黑客能控制这些函 ...