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)
封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...
随机推荐
- Java类加载机制()
Java类加载机制(转载) 概述 在开始正文之前,我们先看两张图 .Java平台的理解?Java最显著的特性?Java是解释执行? 先看一下java程序的执行流程图 再看一下jvm的大致物理结构图 本 ...
- shell数组的用法
在shell里面想获取某个变量的值,使用$符开头,如:$a或者${a}即可. 获取数组长度 arr_length=${#arr_number[*]}或${#arr_number[@]}均可,即形式:$ ...
- 学习 | jQuery移动端页面组件化开发(一)
最近在学习移动端组件化开发web页面,其中有好多小细节,值的去思考. 主要介绍JS的思路,具体的代码就不贴了,主要是想表达出一种思路 总体来说 1.入口文件,在入口文件中导入插件,插件样式,jquer ...
- JVM垃圾回收安全点Safe Point
GC安全点(Safepoint) 程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint) ” Safe Point的选择很重要, ...
- Axios源码深度剖析
Axios源码深度剖析 - XHR篇 axios 是一个基于 Promise 的http请求库,可以用在浏览器和node.js中,目前在github上有 42K 的star数 分析axios - 目录 ...
- CTF-BugKu-WEB-1-20
2020.09.17 全面复习web,给自己定个目标,后天之前结束BugKu-Web,开始逆向. 经验教训 php弱等于用于绕过==,弱等于之前会把等号两边转化为同一类型变量: 全局变量全局变量全局变 ...
- 解Bug之路-记一次对端机器宕机后的tcp行为
解Bug之路-记一次对端机器宕机后的tcp行为 前言 机器一般过质保之后,就会因为各种各样的问题而宕机.而这一次的宕机,让笔者观察到了平常观察不到的tcp在对端宕机情况下的行为.经过详细跟踪分析原因之 ...
- 转载:tensorflow slim模块用法
https://www.cnblogs.com/hellcat/p/8058092.html
- Kafka处理请求的全流程分析
大家好,我是 yes. 这是我的第三篇Kafka源码分析文章,前两篇讲了日志段的读写和二分算法在kafka索引上的应用 今天来讲讲 Kafka Broker端处理请求的全流程,剖析下底层的网络通信是如 ...
- modelviewset views
Python 1.4创建user/serializers.py写序列化器 from rest_ framework import serializers from user .models impor ...