使用公共类实现 Monolog

2024-04-20

我成功地实现了用于测试目的的 Monolog 记录器。现在我正在尝试在项目中使用它。该项目不使用任何MVC框架。

我正在尝试编写一个公共类文件来包装对 Monolog 实例的访问。

常用类文件: 文件:app_log.php

require 'autoload.php';
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Processor\UidProcessor;
use Monolog\Processor\WebProcessor;
use Monolog\Processor\MemoryUsageProcessor;
use Monolog\Processor\ProcessIdProcessor;
use Monolog\Formatter\LineFormatter;

class app_log {
  public function info(){
    $logger = new Logger('applog');
    $handler = new RotatingFileHandler('useractivity.log', 0, Logger::INFO);
    $handler->setFormatter(new LineFormatter("[%datetime%] %extra.process_id% %channel%.%level_name%: %message% %extra% %context% \n"));
    $logger->pushHandler($handler);
    $logger->pushProcessor(new WebProcessor);
  }  
}

其他文件:users.php

include_once 'app_log.php';
class users extends dbconnector{
    function login(){
      // Some project code. 
      $logger = new app_log();
      $logger->info('User logged successfully');
    }
}

到目前为止,效果很好,我想包括文件名、方法名称、请求参数。但我越来越app_log.php代替文件名users.php方法名称是'info'反而'login'在日志中。

例子:

[2018-06-07 20:55:50] 4410 applog.INFO: User logged successfully {"file":"/var/www/portal/lib/app_log.php","line":59,"class":"app_log","function":"info"} []

你们能帮忙解决这部分吗?


恐怕你的整个设计都是错误的。

而不是实例化一个新的Logger每次需要登录时,您都应该创建一个$logger用作您的应用程序周围的服务。

在不了解有关您的申请的更多信息的情况下(并且必须重写您的申请将使问题太宽泛无论如何),很难猜测如何实现依赖注入 here.

但一个简单而幼稚的方法是:

class users extends dbconnector {

    protected $logger;

    public function _construct(Logger $logger) {
       $this->logger = $logger;
    }

    function login() {
      $this->logger->info('User logged successfully');
    }
}

进而:

$logger  = new Logger('applog');
$handler = new RotatingFileHandler('useractivity.log', 0, Logger::INFO);
$handler->setFormatter(new LineFormatter("[%datetime%] %extra.process_id% %channel%.%level_name%: %message% %extra% %context% \n"));
$logger->pushHandler($handler);
$logger->pushProcessor(new WebProcessor);
$logger->pushProcessor(new IntrospectionProcessor);

$users = new users($logger);

如果你注入那个Logger在需要它的对象中的实例中,您可以直接使用它,而无需创建自己的“包装器”(在您的示例中设计得很糟糕),并且日志文件中的输出将符合您的期望。

请注意,您没有使用IntrospectionProcessor https://github.com/Seldaek/monolog/blob/master/doc/02-handlers-formatters-processors.md#processors,您需要捕获文件名和文件行号。在上面的例子中我也将它推入$logger, the Logger实例。

(还要注意,简单地将此处理器添加到您的代码中并不能解决您的问题,因为调用Logger::info()总是会发生在app_log::info()).

请记住,您需要添加相应的use陈述:use Monolog\Processor\IntrospectionProcessor;

我不知道你的系统的所有细节,也无法为你构建所有的细节,但如果依赖注入对你来说仍然太多,你可以暂时用全局状态方法作弊。

E.g.:

function get_logger() {
   static $logger;

   if ($logger !== null) {
      return $logger;
   }

   $logger  = new Logger('applog');
   $handler = new RotatingFileHandler('useractivity.log', 0, Logger::INFO);
   $handler->setFormatter(new LineFormatter("[%datetime%] %extra.process_id% %channel%.%level_name%: %message% %extra% %context% \n"));
   $logger->pushHandler($handler);
   $logger->pushProcessor(new WebProcessor);
   $logger->pushProcessor(new IntrospectionProcessor);

   return $logger;
}

您可以将其放入一个文件中require_once,并且在需要访问记录器的每个地方,您都可以简单地执行以下操作:

 get_logger()->info('write to the log!');

这不是我赞同的事情,但是在您对其他 OOP 主题的理解有所进步之前,这是一个糟糕的解决方法。这无非就是一个穷人单例 https://en.wikipedia.org/wiki/Singleton_pattern,这通常是一种应该避免的模式;但这现在可以帮助你..

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用公共类实现 Monolog 的相关文章

  • (Zend Framework > Zend_Config) 如何避免使用 .ini 或 .xml 配置?

    我认为对于高流量项目来说使用 ini 或 xml 文件不是一个好主意 因为每个页面加载都会导致解析 config ini 或 xml 文件 有什么方法可以用常规 php 数组替换使用 ini xml 作为配置吗 现在 php ini 看起来
  • 从 PHP 执行 SQL Server 存储过程

    我尝试从 PHP 调用 SQL Server 存储过程 这是我的存储过程 CREATE procedure dbo tester id NVARCHAR MAX AS BEGIN DECLARE tab TABLE myxml XML IN
  • 从重定向到日志文件的程序输出中删除进度条

    我正在运行一个程序 它会输出进度条 我是这样做的 python train py tee train log The train log看起来像下面这样 这是1号线 Training 这是2号线 000 valid 100 2630 263
  • 如何使用 PHP 创建动态页面标题

    大家好 我想知道是否有人可以帮助解决这个 PHP 问题 是否可以使用 H2 标记中的文本并使用它来动态填充页面标题 我还希望能够使用相同的技术将 H2 文本添加到元描述中 有人可以帮忙吗 如果您的 h2 文本是动态创建的 那么网页的其他部分
  • MySQL 和 PHP:多关键字搜索

    我有一个包含逗号分隔关键字的字符串 例如 keywords keyword1 keyword2 keyword3 我的表架构 名为tbl address是这样的 简化的 id INT 11 PRIMARY KEY AUTO INCREMEN
  • 对需要发送标头的项目进行单元测试

    我目前正在与 PHPUnit 合作 尝试在我正在编写的内容的同时开发测试 但是 我目前正在编写会话管理器 并且在这样做时遇到了问题 Session 处理类的构造函数是 private function construct if header
  • 通过日期选择器过滤查询后检索具有特定值的行数[重复]

    这个问题在这里已经有答案了 目前 我正在使用 CodeIgniter 来检索特定时间范围内的数据 所有这些条目都有一个状态 我想将具有相同状态的所有条目分组并将其显示在各自的标题中 目前 这是我的模型类 其中我有以下条目来返回特定日期范围内
  • 使用 getJSON 未显示 JSON 数据

    document ready function getJSON news php parseInfo function parseInfo data alert data news undefined info html data news
  • 如何在 phpfarm php 安装上安装 pthreads

    记录我为帮助他人所做的努力 并希望得到一些关于我如何做得更好的反馈 命令pecl install pthreads由于我的 php 安装失败ubuntu 13 04盒子没有配置 zts Options 1 ubuntu存储库没有启用zts的
  • 如何在xampp中启用curl

    我面临下面给出的错误 致命错误 在第 11 行调用 E xampp htdocs new functions php 中未定义的函数curl init 我已经做出了改变php ini 我把前面的分号去掉了 extension php cra
  • PHP json_encode 将多个数组编码为一个对象

    我试图在一个 JSON 对象中返回多个数组 但在语法上遇到一些困难 一款 Android 应用程序从多个表接收更新 我希望在一个响应中返回这些更新 目前 这就是我对各种结果集进行编码的方式 json json encode array ta
  • 在 PHP 中计算 Cookie 大小

    我想使用 php 在服务器端读取 cookie 并计算其长度 但找不到任何直接方法来执行此操作 那么如何实现这个任务呢 那这个呢 setcookie user Dino babu kannampuzha time 3600 if isset
  • PHP 和 ASP.Net 可以在 IIS 7.5 中的同一网站中一起运行吗?

    我们网站的一部分是用 PHP 完成的 而我们网站的一部分是用 ASP Net 完成的 我们刚刚使用 Windows Server 2008 R2 设置了一个新的 Web 服务器 其中安装了 IIS 7 5 我知道 IIS 7 支持 PHP
  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • 如何从对应的数组值中获取数组键?

    您可以轻松地通过其键获取数组值 如下所示 value array key 但如果我有该值并且想要它的密钥怎么办 获得它的最佳方式是什么 你可以使用array search https www php net manual en functi
  • 如何理顺 Laravel Blade @extends 的执行顺序?

    In 我尝试找到一种通过引用刀片 include来传递变量的方法 https stackoverflow com questions 25437939 how to pass variables by reference to includ
  • 如何在 MySQL 中使用 INET_ATON 进行通配符搜索 IP 地址?

    我发现这个方法可以使用 INET ATON 将 IP 地址作为整数存储在 MySQL 数据库中 https stackoverflow com a 5133610 4491952 https stackoverflow com a 5133
  • Symfony 4.1 组件 - 依赖注入问题

    我正在用 PHP 重构旧应用程序 我正在尝试使用 Symfony 依赖注入组件将服务注入控制器 或其他服务 但我不知道如何实现这一点 因为 symphony 文档比框架组件更适合使用框架 我已经有了自己的内核 包含所有服务和控制器的容器 控
  • mysqli_connect(): (HY000/2002): 无法建立连接,因为目标机器主动拒绝

    我知道有很多这样的问题 但我没有找到任何解决方案 我尝试过的事情 检查防火墙 重新启动我的电脑和 Apache 服务器 重新启动MYSQL 检查了我的代码 尝试了我所知道的和在互联网上找到的一切 这是我的代码
  • 尝试使用curl进行GET,发送的值允许为空

    我正在尝试使用curl 来执行一个简单的GET 其中包含一个名为redirect uri 的参数 被调用的 php 文件打印出 GET redirect uri 的空字符串 它显示 red 并且似乎没有发送任何内容 执行获取操作的代码 Ge

随机推荐

  • 更新命令行输出,即进度

    我希望能够在命令行上用简单的 PHP 脚本显示进度表 而不是看到 Progress 0 Progress 1 etc 我只想更改号码 并替换以前的号码 就像 git clone 所做的那样Resolving deltas 100 8522
  • 在 Django admin 中使用模型显示表

    我正在尝试创建一个项目管理类型的应用程序 现在我有了如图所示的项目模型 当我保存它时 我可以获得用户名和时间 现在 在下面的同一页面中 我想显示用户可以添加 编辑的表格 就像这张图片中一样 How can i do that 我们要创建数据
  • 在 WP7 Silverlight 应用程序中导航时将复杂对象传递到页面

    我一直在使用NavigationService s Navigate导航到我的 WP7 Silverlight 应用程序中其他页面的方法 NavigationService Navigate new Uri Somepage xaml va
  • 我可以在 AngularJS 中使用一个 ng-app 到另一个 ng-app 中吗

    我有两个 ng app 喜欢 div somexpression div some more expression div div 有什么办法让它发挥作用吗 当我制作嵌套 ng app 时它不起作用 我知道我可以使用两个不同的控制器 但我不
  • 更改django的默认静态目录

    我在 Django 1 6 中遇到了一个问题 我想更改 django 中的默认静态文件目录 我不想让它进来project myapp static but in project static 我阅读了 django 的文档 添加了 STAT
  • PHP 中避免代码注入的最佳方法

    我的网站最近遭到了攻击 在我看来 这是一个无辜的代码 那里没有 SQL 调用 所以我不担心 SQL 注入 但显然 SQL 并不是唯一的注入方式 这个网站有一个解释和一些避免代码注入的例子 http www theserverpages co
  • 无法让 netTcpBinding 请求显示在 Fiddler 中

    我有一个具有两个端点的 WCF 服务 一种使用 basicHttpBinding 另一种使用 netTcpBinding 这是我的配置
  • Ecto 模型 - select 中的子查询

    我需要使用 Ecto 进行 SQL 查询 SELECT users select count 0 from money transactions where from id users id AND created at gt 2016 1
  • Google Maps API v3:单击 DOM 元素时关闭信息窗口

    我是第一次使用 Google 地图 所以我在 CSS Tricks 上查看了一个很好的教程 http css tricks com google maps slider http css tricks com google maps sli
  • 您的 APP_BUILD_SCRIPT 指向未知文件:./jni/Android.mk

    我正在尝试让 ndk gdb 工作 但遇到一些问题 我的项目结构是这样的 trunk indiana Here is the android manifest ubravo java mbravo here is the native co
  • aws 从 lambda 调用步骤函数

    所以我设置了一个步骤函数来调用将发送电子邮件的兰巴 我已经手动测试了它并且它有效 现在我想最初使用新的 lambda 调用此步骤函数 我在网上找到了一些代码并且我已经玩过它 通过了测试并且不会引发任何错误 有谁知道我错过了什么 因为它不起作
  • plt.imshow() 和 plt.show() 没有图像弹出或显示

    我试图通过将 cocoapi 演示脚本复制粘贴到我自己的本地脚本中来重新创建它 而不是在 Jupyter 笔记本上运行它 一切工作正常 并且肯定有图像被读取并且可以显示 因为我已经使用 openCV 的 imshow 函数对其进行了测试 并
  • 更改 Mercurial“默认”父 URL

    假设我有一个 Mercurial 存储库 并且我从默认父 URL 我克隆它的源 中提取数据 现在我想更改默认的父 URL 主机名更改 或者将其复制到另一台计算机等 有没有办法做到这一点 或者我必须从新的 URL 重新克隆 您甚至可以在 hg
  • 由于 MultiReleaseException,jdeps 无法打印模块 deps

    我们有一个基于 JavaFX 的应用程序 它是not模块化 有原因 涉及遗留库 但我们使用构建自定义运行时jdeps and jlink 我们最近重写了该应用程序并添加了一些新的依赖项 并删除了其他依赖项 现在 正在构建应用程序的脚本突然停
  • EFCore 3.1 - 通过 Any 存在查询;查询无法翻译

    我们使用 EFCore 3 1 并尝试通过跨越 2 个属性的 Any 使用 Exists 构建查询 var selectionCriteria someHugeList Select sh gt new sh Id sh StatusCod
  • 改变眼睛图像中特定区域的颜色[Matlab]

    I am trying to change the pupil of the following image This is not a feature extraction or eye detection task I want to
  • 修复 iPhone/iPad/iPod 上的 CSS 悬停问题

    我想修复 iOS 上的悬停效果 更改为触摸事件 但我不知道 让我解释一下 您的页面中有一段文字 div class mm hello world div 风格 mm color 000 padding 15px mm hover backg
  • std::cin 跳过空格

    所以我试图编写一个函数来检查一个单词是否在句子中 通过循环遍历 char 数组并检查相同的 char 字符串 只要句子中没有任何空格 该程序就可以运行 我用谷歌搜索了一下 他们都是同样的建议 cin getline 但无论我如何实现它 它要
  • 创建您自己的 .NET 程序集缓存

    在我正在编写的 net 应用程序中 我需要在本地缓存各个位置的程序集 以便即使原始位置不可用 我的应用程序也可以使用它们 我无法使用 GAC 主要是因为我想要可移植性 而且还因为程序集可能未签名 有谁知道任何支持此功能的 net 代码吗 我
  • 使用公共类实现 Monolog

    我成功地实现了用于测试目的的 Monolog 记录器 现在我正在尝试在项目中使用它 该项目不使用任何MVC框架 我正在尝试编写一个公共类文件来包装对 Monolog 实例的访问 常用类文件 文件 app log php require au