- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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/
我的数据库中有两张表,一张用于 field ,另一张用于预订。我需要的是一个查询来选择所有未预订的 field 。见下文: 餐 table 预订具有以下字段: bk_id venue_id 作为(预订
嗨,我是编码新手,我有一些培训项目,其中包括从 HTML 表单输入 MySQL 数据库。它就像你玩过的游戏的日志。第一个日期输入是您开始游戏的时间,第二个日期输入是您完成游戏的时间。但我需要检查器或类
我是这个 sql 编码的新手,我正在尝试学习新的东西。因此,我创建了一个交货表,其中包含一些属性,如商品代码、交货日期、交货数量。所以如何从同一张表中获取第一个交货日期(最小日期)和交货数量以及最晚交
我从支付网关返回了这个日期 2014-05-15T08:40:52+01:00 我得到 2014-05-15T08:40:52 但我无法识别时区 +01:00 的含义 我的位置时区是 UTC−06:0
我快要疯了,请帮忙。 我有一列包含日期时间值。 我需要找到每天的最小值和最大值。 数据看起来像这样 2012-11-23 05:49:26.000 2012-11-23 07:55:43.000
我从 json 数据中获取日期为 2015 年 4 月 15 日晚上 10:15我只想在 html 页面中显示 json 响应数据的时间,例如 10:15 PM这里我放了我的js函数和html代码 J
是否有 javascript 库或其他机制允许我将 .NET 日期/时间格式字符串(即 yyyy-MM-dd HH:mm:ss)传递给 javascript函数并让它相应地解析提供的日期时间值?我一直
我正在使用以下代码以正确的格式获取当前的 UTC 时间,但客户返回并要求时间戳现在使用 EST 而不是 UTC。我搜索了 Google 和 stackoverflow,但找不到适用于我现有代码的答案。
我有以下日期的平均温度数据。我想找到连续至少 5 天低于或高于 0 摄氏度的开始日期。 date_short mean.temp 1 2018-05-18 17.54 2 2018-05-19
它可以在其他网络浏览器中使用,但 IE11 返回无效日期。 为了调试我使用了下面的代码。 console.log('before - ' + date.value); date.value = new
我在 Excel 中有一个数据的 Web 提取,其中日期列带有/Date(1388624400000)/。我需要在 Excel 中将其转换为日期。 最佳答案 能够从 here 中推断出它. 假设字符串
嗨,我的 Schmema 有一个带有 ISO 日期的字段: ISODate("2015-04-30T14:47:46.501Z") Paypal 在成功付款后以该形式返回日期对象: Time/Date
我的 table : CREATE TABLE `tbdata` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `PatientID` INT(10) NOT
我正在 Ubuntu 服务器 12.04 中编写一个 shell 脚本,它应该比较日志文件中的一些数据。在日志文件中,日期以以下格式给出: [Mon Apr 08 15:02:54 2013] 如您所
我想使用 GROUP BY WITH ROLLUP 创建一个表并获取总行数而不是 null。 $sql ="SELECT IF(YEAR(transaktioner.datum
我正在创建博客文章,在成功迁移我的博客文件后,当我转到我网站的博客页面时返回一个错误(无法解析其余部分:':“Ymd”'来自'post.date|date: "Ymd"') 我似乎无法确定这是语法错误
我正在尝试获取要插入到 CAML 查询中的月份范围,即:2010-09-01 和 2010-09-30。 我使用以下代码生成这两个值: var month = "10/2010"; var month
如何将代码document.write("直到指定日期")更改为writeMessage(date)中的日期?此外,writeMessage(date) 中的日期未正确显示(仅显示年份)。感谢您帮助解
我在 Windows (XP) 和 Linux 上都尝试过 utime()。在 Windows 上我得到一个 EACCES 错误,在 Linux 上我没有得到任何错误(但时间没有改变)。我的 utim
我正在尝试计算发生在同一日期的值的总和(在 XYZmin 中)。 我的数据看起来像这样, bar <- structure(list(date = structure(c(15622, 15622,
我是一名优秀的程序员,十分优秀!