Phalcon How to enable more detailed logging? - php

I am getting an error trying to display a new page i setup. It gives a message "Internal error" which is configured in my errors controller:
public function show500Action()
{
\Phalcon\Tag::setTitle('Internal Error - '.SKIN_NAME);
}
Normally my error and access log display errors fine but from time to time it doesnt display anything. I am guessing there might be different levels of error logging but im not sure how to set that.
using
echo "test";
die();
In various parts of the code and managed to narrow down the error to a line:
$user = AdminUser::find(array("order" => "name_admin"));
So i tried this but i still dont get an error
try {
$user = AdminUser::find(array("order" => "name_admin"));
} catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
Even if the try/catch worked im sure there is a way to make it write the error to the log like other logs rather than having to narrow down the error and do a try catch every time
There is a model called AdminUser and the corresponding database table adminUser so i cant figure out where the error is coming from

I had a similar error a couple of weeks back. After querying with a model php would get an error but log absolutely nothing and I was never able to log it in the end.
In my case, it was due to an invalid namespace usage. You could attempt to test if the class exists to check that. If it does not I would say there's an incorrect auto-loading of the model's namespace where your loader registers namespaces and/or the usage call at the top of the script is incorrect.
Hope that helps!

Related

Can I add additional information to a php error log - *only* when it errors?

My php setup currently records errors in the standard php_errorlog file. These errors tell me things like the type of error and the line it occurred on (standard stuff).
I'd like to add more information to this log, but only when an error occurs.
For example, I'd like to create a variable $error_details at the top of my script, into which I'd put things like the id of the user logged in at the time, and the php://input details.
I know I can write error_log($error_details), but this would record every time my script runs. I want it to record only when there is an error.
You can use the error_get_last function.
if (error_get_last()) {
//Error occurred
}
There are several ways to do that control error logs with libraries or self coding with tomuch works.
Monolog - Logging for PHP
Library and nice examples for basic types on Loggy
PHP Error Log Types
PHP provides a variety of error log types for identifying the severity of errors encountered when your application runs.
The error levels indicate if the engine couldn’t parse and compile your PHP statements, or couldn’t access or use a resource needed by your application, all the way down to letting you know if you have a possible typo in a variable name.
Although the error levels are integer values, there are predefined constants for each one.
Using the constants will make your code easier to read and understand and keep it forward-compatible when new error levels are introduced.
Common error levels encountered include:
Check for Predefined Constants
And here nice Tutorials : Ultimate Guide to Logging
Another Way is the base exception
PHP has a base Exception class that is available by default in the language.
The base Exception class is extensible if required.
Example: (assumes directive log_errors = 1).
try{
if(true){
throw new Exception("Something failed", 900);
}
} catch (Exception $e) {
$datetime = new DateTime();
$datetime->setTimezone(new DateTimeZone('UTC'));
$logEntry = $datetime->format('Y/m/d H:i:s') . ‘ ‘ . $e;
// log to default error_log destination
error_log($logEntry);
//Email or notice someone
//OR use fopen(); function and write in to error_log file
}
The example above would produce the following error log entry:
2020/01/05 15:02:24/Something failed/900//var/www/html/index.php/4

When is error checking too much?

During the process of my PHP learning I have been trying to read up on the best practices for error reporting and handling, but statements vary person to person and I have struggled to come up with a clear concise way of handling errors in my applications. I use exceptions on things that could go wrong, but for the most part it is hard for me to understand whether an exception should kill the application and display an error page or just be caught and silently dealt with.
Something that seems to elude me is, is there such thing as too much reporting? Every single time you call a function something could go horribly wrong meaning that if you were to confirm every single function call you would have to fill pages with if statements and work out what effect one failure may have on the rest. Is there a concise document or idea for error reporting that could clear this up for me? Are there best practices? What are the best examples of good error handling?
Currently I do the following:
Add important event results to an array to be logged and emailed to me if a fatal error was to occur
Display abstract/generic errors for fatal errors.
Use exceptions for cases that are likely to fail
Turn on error reporting in a development environment and off for live environment
Validate all user input data
Sanitizing invalid user input
Display concise, informative error messages to users without providing a platform for exploitation.
Exceptions are the only thing that you haven't understood IMHO: exceptions are meant to be out of your control, are meant to be caught be dealt with from outside the scope they are thrown in. The try block has a specific limit: it should contain related actions. For example take a database try catch block:
$array = array();
try {
// connect throws exception on fail
// query throws exception on fail
// fetch results into $array
} catch (...) {
$array[0]['default'] = 'me';
$array[0]['default2'] = ...;
...
}
as you can see I put every database related function inside the try block. If the connection fails the query and the fetching is not performed because they would have no sense without a connection. If the querying fails the fetching is skipped because there would be no sense in fetching no results. And if anything goes wrong, I have an empty $array to deal with: so I can, for example, populate it with default data.
Using exceptions like:
$array = array();
try {
if (!file_exists('file.php')) throw new Exception('file does not exists');
include('file.php');
} catch (Exception $e) {
trigger_error($e->getMessage());
}
makes no sense. It just a longer version of:
if (!file_exists('file.php')) trigger_error('file does not exists');
include('file.php');

Catch database exception in Kohana

I'm using Kohana 2. I would like to catch a database exception to prevent an error page when no connection to the server can be established.
The error displayed is
system/libraries/drivers/Database/Mysql.php [61]:
mysql_connect() [function.mysql-connect]: Lost connection to MySQL server at
'reading initial communication packet', system error: 110
The database server is not reachable at all at this point.
I'm doing this from a model. I tried both
public function __construct()
{
// load database library into $this->db
try
{
parent::__construct();
}
catch (Exception $e)
{
die('Database error occured');
}
}
as well as
try
{
$hoststatus = $this->db->query('SELECT x FROM y WHERE z;');
}
catch (Exception $e)
{
die('Database error occured');
}
...but none of them seemed to work. It seems as if no exception gets passed on from the main model. Is there another way to catch the database error and use my own error handling?
Kohana 2 does not convert errors into exceptions. You will either need to attach your own error handler, or use error_reporting() to turn off the error (temporarily) then do some kind of handling yourself.
You can catch the exception, but you are probably trying to catch it in the wrong place. The problem with trying to catch that low-level of an exception is that it can be spawned from many different sources.
For example, if you use the database driver for your sessions that exception will be thrown from instantiation of the database driver in the session library (which is instantiated in a call to session which will probably happen before you instantiate any models).
Catching that exception can happen from the model, but it is more likely to happen from another source - in which case you would probably have to extend a few libraries, or be sure you are wrapping a base model parent::__construct call and the session library in a try-catch block.
(I would personally extend the Model library to do that instead of putting it in a base model)
Hope that helps.
I don't know Kohana, but a try .. catch block will not catch normal errors, only Exceptions. Are you sure Kohana throws Exceptions where you expect to receive Exceptions?
Edit based on you comments:
Well, first of all, in a production environment (meaning your live application) you should always disable the displaying of PHP errors to the screen. Displaying of these errors to the screen should only be done in a development environment to inform you, the developer. Visitors of your live application however have no business in knowing/reading PHP errors, as it might disclose sensitive information about your environment. You should however log the errors to a log file.
Furthermore, I just took a quick peek at Kohana, and indeed see that here and there Exceptions are thrown, but it doesn't seem to do this in a consistent manner.
If you want php errors to be treated as Exceptions have a look example #1 in this documentation.

Best possible PHP error class

I am looking for some coding ideas on the following task I am trying to achive.
I have a list of Error Numbers, Description, and User Friendly Description in a document.
Ex:
Error Number, Description, User Friendly Description
-----------------------------------------------------
1, Internal Error, "An Internal Error has occurred. Please try again later".
2, Delete Failed, "Unable to delete an Entry. Please try later".
I want to write a PHP class to store all the above in such a fashion that I can access them later with ease when an error occurs in the code..
Ex: If my code received an error 2, I want to check that error code with the list of error codes in the class, retrieve the description, user friendly description and display it to the user.
I want this to be of minimum overhead. So, don't want to store it in database.
I am using PHP5 with Zend MVC framework. Anybody can help me with the best possible sample code?
Thanks
Write an ini file with the error code and the user friendly text.
write an class which extends Exception which fetches your errorcodes from the ini file. add a method e.g.
public function getUserFriendlyMsg(){}
which returns the string from the ini file.
in your normal code when you have such an error you just need to throw the exception. e.g.
throw new My_Exception('Delete failed',2);
in your e.g. controller:
try{
// your code
}catch(My_Exception $e){
echo $e->getUserFriendlyMsg();
}
Note: you should consider extending your excpetion class to log the failures to a logfile, for this you can introduce servity levels. (see the manual - exception handling)
I like to use a simple custom error handler and custom exception handler that do the following:
If in development mode:
Show the detailed error message
If E_WARNING or worse, output error message into a log file (e.g. using Zend_Log)
If a fatal error, halt execution and show a nice error page with a full backtrace
If in production mode:
Only log error messages
On fatal errors, halt execution and show a nice "an error has occurred" page only.
I like working with errors, so any exception I catch I call a trigger_error() for to do the output and logging.
You can also extend the default Exception class to do the logging and display. You would want to turn any error that occurs into exceptions. Manual errors you would then trigger as exception using throw.
Inspiration:
Kohana's Error Handler (Screenshot here) is the nicest and greatest I've seen to date. It's open source, maybe you can even grab out that part (make sure you read the license first, though.)

Centralized error reporting in PHP

is there a way to handle error reporting in a centralized manner in PHP? I'd like to be notified of all errors raised by my application by email.
What's the best way to achieve this for a whole application?
Thanks
You can use set_error_handler to handle errors at runtime any way you like.
As Kalium mentioned, you'll want to be using set_error_handler, but that only gets you part of the way. You also want to trap uncaught exceptions. For that, use set_exception_handler.
What I do myself is have my code trap errors, and convert those errors to approprate exceptions that I can catch elsewhere. For anything that isn't caught, I use the default exception handler to log and report them, and to display an appropriate error if necessary.
There are 3 types of errors:
System errors, such as warnings or fatal errors raised by PHP. 404 errors are also in this category.
Database errors by a malformed or failed query or database connection.
Logical errors such as when something went wrong in the internal working of your application not related to a server or database. For example if you expected a certain file to be in a given folder, but it wasn't.
The best way to create an ErrorHandler class that handles all three types of errors. For system errors, you would use set_error_handler or read up on one of the online tutorials such as this one.
For database, I suggest using a centralized Database class which handles all the queries. Use something like this:
$result=mysql_query($sql);
if (! $result)
{
$ErrorHandler->dbError(mysql_error(), $sql);
}
For logical errors, such as the error of not finding an expected file or database record, you would call up the same ErrorHandler class and do something like:
if ($logicalError)
{
$ErrorHandler->appError('Something bad happened',__LINE__, __FILE__);
$ErrorHandler->showAppErrorPage();
}
Here the __FILE__ and __LINE__ constants will give exactly the location where this error occurred. Read up on them on the php.net site.
Your ErrorHandler class can log all errors to a log file, email you, or even SMS/Text you on your mobile. It could also be used to redirect the user to an error page.

Categories