做一下基本关于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封装的更多相关文章

  1. 这可能是php世界中最好的日志库——monolog

    由于一些历史原因,php中并没有内建的日志接口,故长期以来也没一个功能完备并且应用广泛的日志库.在我的工作生涯中,如果系统需要记录一些应用日志的话,基本上就是封装一个日志类,然后把一些要记录的字段写入 ...

  2. monolog 应该是世界上最好的日志插件了

    引入 composer require monolog/monolog 官网 https://github.com/Seldaek/monolog 创建工具类 <?php /** * Creat ...

  3. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  5. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  6. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  7. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  8. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  9. 封装集合(Encapsulate Collection)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...

随机推荐

  1. sudo提权,ansible批量给所有主机创建系统账户,授权

    sudo(superuser or another do)让普通用户可以以超级管理员或其他人的身份执行命令. sudo基本流程如下: 1.管理员需要先授权(修改/etc/sudoers文件) 2.普通 ...

  2. 【小程序】---- 封装Echarts公共组件,遍历图表实现多个饼图

    一.问题描述: 在小程序的项目中,封装公共的饼图组件,并在需要的页面引入使用.要求一个页面中有多个饼图,动态渲染不同的数据. 二.效果实现: 1. 查看——小程序使用Echarts的方式 2. 封装饼 ...

  3. [剑指Offer]55-题目一:二叉树的深度 题目二:平衡二叉树

    题目一 题目 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 题解 递归. 代码 class TreeNode { int v ...

  4. [程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)

    问题描述 如题. 例:输入两个字符串 str1="1AB234",str2="1234EF" ,应输出最长公共子串"234". 解题思路 状 ...

  5. adb命令—monkey篇

    monkey 目录 monkey 1.Monkey介绍 2.Monkey是用来做什么的 3.Monkey程序介绍 下面就是一些Monkey命令了 1.Monkey介绍 顾名思义,Monkey就是猴子, ...

  6. 【译】Visual Studio 2019 的 Local Process with Kubernetes

    今天,我们自豪地宣布 Local Process with Kubernetes 的预览版已加入到 Visual Studio 2019 16.7 Preview 2 中.  Local Proces ...

  7. 云计算openstack——高可以负载均衡(14)

    一.云平台概要 1.本openstack云平台使用开源软件Openstack Ocata版…… 2.OpenStack 部署环境中,各节点可以分为几类: Cloud Controller Node ( ...

  8. Istio 运维实战系列(2):让人头大的『无头服务』-上

    本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些经验,以及在使用 Istio 过程中可能遇到的一些常见问题的解决方法. 什么是『无头服 ...

  9. 关于swagger

    转自https://blog.csdn.net/sanyaoxu_2/article/details/80555328 1:认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述. ...

  10. MyBatis常用实现方式

    MyBatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动.创建连接.创建 statement 等繁杂的过程 ...