PHP 5.6
有什么方法可以定义使用error_log时显示的日期格式?
我用它来记录来自某个脚本的消息和错误。似乎 set_error_handler won't handle all error messages .
在某些示例中,人们直接在 error_log 的参数上添加带有 date 的日期。使用这种方法会导致我在日志文件中出现重复的日期字符串。
我想输出一个 ISO 格式的本地日期时间,但是我在 CLI (php -f script.php) 和 Apache 上添加了日期
ini_set('log_errors', 1);
ini_set('error_log', 'file.log');
error_log('Test');
是这样的:
[14-Feb-2016 18:07:31 America/Mexico_City] Test
请注意,在大多数代码示例中,日期格式通常不包括时区。而且,如果我从控制台运行它,我不会在前面加上日期:
$ php -r 'error_log("Test");'
Test
时区未在运行时或 php.ini 中设置,但已正确表示。我在 php5.6.18 package 上得到了这种行为和从源代码 php5.6.13 编译的。在生产服务器上,脚本通过 CLI 运行,没有安装 apache。
似乎无法自定义与 error_log 一起显示的日期。
按照@fusion3k 的建议,继续使用set_error_handler,我将这个错误处理程序放在一起,它将使用对计算机/人类更友好的格式来格式化日期、消息和错误级别
// set_trigger_error only accepts E_USER_ constants values
define('ERROR', 256); // Before E_USER_ERROR
define('INFO', 512); // Before E_USER_WARNING
define('DEBUG', 1024); // Before E_USER_NOTICE
function errorHandler ($errType, $errStr, $errFile, $errLine, $errContext) {
$displayErrors = ini_get( 'display_errors' );
$logErrors = ini_get( 'log_errors' );
$errorLog = ini_get( 'error_log' );
if( $displayErrors ) echo $errStr.PHP_EOL;
if( $logErrors ) {
$line = "";
switch ($errType) {
case DEBUG:
$type = 'DEBUG';
break;
case INFO:
$type = 'INFO';
break;
case ERROR:
$type = 'ERROR';
$line = " (Line:".$errLine.")";
break;
default:
$type = 'WARN';
$line = " (Line:".$errLine.")";
break;
}
$message = date('Y-m-d H:i:sO').";".$type.";".$errStr.$line;
file_put_contents($errorLog, $message.PHP_EOL, FILE_APPEND);
}
}
set_error_handler('errorHandler');
error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', 'test.log');
trigger_error('Test', DEBUG);
输出
2016-02-15 14:20:05-0600;DEBUG;Test
最佳答案
如果您使用您的自定义错误日志文件,您可以简单地在前面加上您喜欢的日期格式来记录消息。
如果您使用标准的Apache 日志文件,则无法通过php 修改日志格式。
您必须通过 LogFormat 关键字修改 httpd.conf 中的整个 Apache 错误日志格式:用您想要的格式替换现有格式。
Here您可以找到 LogFormat 的完整语法指南。
在你最后的评论之后,我通过互联网搜索并进行了一些测试,然后我意识到我之前的回答是不正确的:没有办法修改 php 中的 error_log() 行为.在我的例子中(我安装了 Apache),error_log() 函数在自定义日志文件(通过 ini_set('error_log')<>even 上输出 Apache 日志格式)。
在你的情况下,我认为 php 使用操作系统日志格式(你确定你没有安装 Apache,即使你不使用它吗?)。
您可以使用 trigger_error() 和 set_error_handler() 一起设置您完全可定制的错误日志格式 — 而不是 error_log() :
function myErrorHandler( $errType, $errStr, $errFile, $errLine, $errContext )
{
$displayErrors = ini_get( 'display_errors' );
$logErrors = ini_get( 'log_errors' );
$errorLog = ini_get( 'error_log' );
if( $displayErrors ) echo $errStr.PHP_EOL;
if( $logErrors )
{
$message = sprintf( '[%s] %s (%s, %s)', date('d-m H:i'), $errStr, $errFile, $errLine );
file_put_contents( $errorLog, $message.PHP_EOL, FILE_APPEND );
}
}
ini_set( 'log_errors', 1 );
ini_set( 'error_log', 'file.log' );
set_error_handler( 'myErrorHandler' );
trigger_error( 'Test' );
在上面的示例中,trigger_error 将在 file.log 中附加一行,如下所示:
[15-02 09:43] Test (Script/File/Path.php, 12)
设置error_handler 所有系统错误都由自定义函数处理。要模拟系统错误,您必须使用 trigger_error() 而不是 error_log()。
为了最大限度地自定义,您可以向 trigger_error 传递附加参数 error_type:
trigger_error( 'Test', E_WARNING );
会产生一个警告级别错误;默认 error_type 值为 E_USER_NOTICE。错误类型是自定义函数中的第一个参数 ($errType),因此在自定义错误处理函数中,您可以根据错误类型修改行为。
在我上面的简单示例中,自定义函数还处理一些 ini 指令,因此您可以将 ini_set 与 set_error_handler 结合使用。请注意,您可以更改自定义函数参数的变量名称,但不能更改顺序,因为这是由内部 php 错误系统定义的。
如果您决定使用 set_error_handler(),请仔细阅读 documentation了解行为和异常。
关于php - 在 error_log 中编辑前置日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35400125/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby常量:Content2而不是content2。Aconstantnamestart
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西: