我遇到了更多 Laravel 问题,因为我在理解事物时遇到了问题。
我再次尝试创建一个包来进行我自己的日志记录。在做了一些额外的阅读并浏览了核心代码并尝试了其他方法之后,我得出的结论是我需要做的就是扩展 laravel 日志记录的核心功能,以便它记录到不同的路径自定义格式化程序。
我已经创建了我的包。这是我的服务提供商类:
use Illuminate\Log\LogServiceProvider;
class VmlogServiceProvider extends LogServiceProvider {
/**
* Bootstrap the application events.
*
* @return void
*/
public function boot()
{
App::bind('log', function()
{
return new Vm\Vmlog\Vmlog;
});
parent::boot();
}
}
?>
这是 VmLog 类
<?php namespace Vm\Vmlog;
use App;
use Illuminate\Support\ServiceProvider;
use Log;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
class Vmlog extends \Illuminate\Log\Writer {
protected $path;
protected $formatter;
protected $stream;
protected $rotatingStream;
public function __construct() {
$output = APP_HOST."|%datetime%|%level%|%level_name%|".__METHOD__."|%message%|%context%".PHP_EOL;
$this->path = VM_LOGPATH.APP_VLCODE."/".APP_VLCODE."_".APP_INSTANCE.".log";
$this->formatter = new LineFormatter($output, $dateFormat);
parent::__construct();
}
/**
* Register a file log handler.
*
* @param string $path
* @param string $level
* @return void
*/
public function useFiles($path, $level = 'debug')
{
$level = $this->parseLevel($level);
$this->stream = new StreamHandler($this->path, $level);
$this->stream->setFormatter($this->formatter);
$this->monolog->pushHandler($this->stream);
}
/**
* Register a daily file log handler.
*
* @param string $path
* @param int $days
* @param string $level
* @return void
*/
public function useDailyFiles($path, $days = 0, $level = 'debug')
{
$level = $this->parseLevel($level);
$this->rotatingStream = new RotatingFileHandler($this->path, $days, $level);
$this->rotatingStream->setFormatter($this->formatter);
$this->monolog->pushHandler($this->rotatingStream);
}
}
?>
我已经在 app.php 中注释掉了 LogServiceProvider,并在我的 VmlogServiceProvider 中添加了它。
然而,当我尝试运行时,出现以下错误。
Call to undefined method Illuminate\Support\Facades\Log::useDailyFiles()
我不明白为什么会这样。我已经删除了核心 LogServiceProvider,我已经在它的位置添加了我自己的并正确绑定(bind)它,按照文档(我认为)。我在这里做错了什么?
最佳答案
为什么要在服务提供者中使用 Boot 方法?
您可能打算使用 register方法而不是该服务提供商中的 boot 方法?
看起来您的实现将覆盖默认记录器,而不是创建额外的日志。那是你的意图吗?在这种情况下,请注意您已经使用 boot 方法注册了一个“log”实例,但是 register 方法正在重新执行该工作。 (也许用默认值替换它?我不确定会导致什么行为)。
如果你想添加一个额外的日志,你可以在不需要扩展 Laravel 的服务提供者的情况下做到这一点。
在一个新文件和您自己的命名空间中,创建一个 LogServiceProvider:
<?php namespace Fideloper\Log;
use Illuminate\Support\ServiceProvider;
class LogServiceProvider extends ServiceProvider {
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$logger = new Writer(new \Monolog\Logger('my-custom-log'), $this->app['events']);
$logFile = 'my-custom-log.txt';
$logger->useDailyFiles(storage_path().'/logs/'.$logFile);
$this->app->instance('fideloper.log', $logger);
$this->app->bind('Fideloper\Log\Writer', function($app)
{
return $app->make('fideloper.log');
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return array('fideloper.log');
}
}
然后创建一个新的日志写入器(类似于您所做的):
<?php namespace Fideloper\Log;
use Illuminate\Log\Writer as BaseWriter;
class Writer extends BaseWriter {}
请注意,我没有向我的扩展编写器类添加任何额外功能,但我可以。
此设置的一个缺点是我没有创建或覆盖Log facade 来使用我的新记录器。对 Log::whatever() 的任何调用仍将转到 Laravel 的默认值。我创建了一个新的 Fideloper\Log\Writer 对象,由于 Laravel 能够自动提供类依赖项,它可以正常工作。
$log = App::make('fideloper.log');
// Or get auto-created by laravel by making it a dependency
// in a controller, for example:
<?php
use Fideloper\Log\Writer
class SomeController extends BaseController {
public function __construct(Writer $log)
{
$this->log = $log;
//Later
$this->log->error('SOME CUSTOM ERROR');
}
}
关于php - 扩展 Laravel 核心日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20519960/
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
在许多ruby类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..