日志
laravel中的日志是基于monolog而封装的。laravel在它上面做了几个事情:
- 把monolog中的addInfo等函数简化成为了info这样的函数
- 增加了useFiles和useDailyFiles两个参数,使得做日志管理和切割变的容易了
- 如果要调用monolog的方法需要调用callMonolog函数
好了,看下下面几个需求怎么实现:
将不同的日志信息存放到不同的日志中去
这个需求很普遍的,比如调用订单的日志,需要记录到order.log,获取店铺信息的记录需要记录到shop.log中去。可以这么做:
1 2 3 4 5 6 |
<span class="php"><span class="hljs-meta" style="color:#2B91AF;"><?php</span> <span class="hljs-keyword" style="color:#0000FF;">use</span> <span class="hljs-title" style="color:#A31515;">Monolog</span>\<span class="hljs-title" style="color:#A31515;">Logger</span>; <span class="hljs-keyword" style="color:#0000FF;">use</span> <span class="hljs-title" style="color:#A31515;">Monolog</span>\<span class="hljs-title" style="color:#A31515;">Handler</span>\<span class="hljs-title" style="color:#A31515;">StreamHandler</span>; <span class="hljs-keyword" style="color:#0000FF;">use</span> <span class="hljs-title" style="color:#A31515;">Illuminate</span>\<span class="hljs-title" style="color:#A31515;">Log</span>\<span class="hljs-title" style="color:#A31515;">Writer</span>; <span class="hljs-class"><span class="hljs-keyword" style="color:#0000FF;">class</span> <span class="hljs-title" style="color:#A31515;">BLogger</span> </span>{ <span class="hljs-comment" style="color:green;">// 所有的LOG都要求在这里注册</span> <span class="hljs-keyword" style="color:#0000FF;">const</span> LOG_ERROR = <span class="hljs-string" style="color:#A31515;">'error'</span>; <span class="hljs-keyword" style="color:#0000FF;">private</span> <span class="hljs-keyword" style="color:#0000FF;">static</span> $loggers = <span class="hljs-keyword" style="color:#0000FF;">array</span>(); <span class="hljs-comment" style="color:green;">// 获取一个实例</span> <span class="hljs-keyword" style="color:#0000FF;">public</span> <span class="hljs-keyword" style="color:#0000FF;">static</span> <span class="hljs-function"><span class="hljs-keyword" style="color:#0000FF;">function</span> <span class="hljs-title" style="color:#A31515;">getLogger</span><span class="hljs-params">($type = self::LOG_ERROR, $day = <span class="hljs-number">30</span>)</span> </span>{ <span class="hljs-keyword" style="color:#0000FF;">if</span> (<span class="hljs-keyword" style="color:#0000FF;">empty</span>(<span class="hljs-keyword" style="color:#0000FF;">self</span>::$loggers[$type])) { <span class="hljs-keyword" style="color:#0000FF;">self</span>::$loggers[$type] = <span class="hljs-keyword" style="color:#0000FF;">new</span> Writer(<span class="hljs-keyword" style="color:#0000FF;">new</span> Logger($type)); <span class="hljs-keyword" style="color:#0000FF;">self</span>::$loggers[$type]->useDailyFiles(storage_path().<span class="hljs-string" style="color:#A31515;">'/logs/'</span>. $type .<span class="hljs-string" style="color:#A31515;">'.log'</span>, $day); } $log = <span class="hljs-keyword" style="color:#0000FF;">self</span>::$loggers[$type]; <span class="hljs-keyword" style="color:#0000FF;">return</span> $log; } }</span> |
这样不同的日志数据会被存储到不同的日志文件中去。还能记录日志数据信息。
laravel的错误日志堆栈太长了,怎么办?
使用上面的BLogger类,在start/global.php记录下必要的错误信息
1 2 3 4 5 6 7 |
<span class="hljs-comment" style="color:green;">// 错误日志信息</span> App::error(<span class="hljs-function"><span class="hljs-keyword" style="color:#0000FF;">function</span><span class="hljs-params">(Exception $exception, $code)</span> </span>{ Log::error($exception); $err = [ <span class="hljs-string" style="color:#A31515;">'message'</span> => $exception->getMessage(), <span class="hljs-string" style="color:#A31515;">'file'</span> => $exception->getFile(), <span class="hljs-string" style="color:#A31515;">'line'</span> => $exception->getLine(), <span class="hljs-string" style="color:#A31515;">'code'</span> => $exception->getCode(), <span class="hljs-string" style="color:#A31515;">'url'</span> => Request::url(), <span class="hljs-string" style="color:#A31515;">'input'</span> => Input::all(), ]; BLogger::getLogger(BLogger::LOG_ERROR)->error($err); }); |
laravel默认的日志没有使用分割
所以应该默认把laravel的默认日志记录改成有分割的。
同样在start/global.php中
1 |
Log::useDailyFiles(storage_path().<span class="hljs-string" style="color:#A31515;">'/logs/laravel.log'</span>, <span class="hljs-number">30</span>); |
如何记录一个请求的sql日志
这个应该再细化问,你是不是要实时记录?
如果不要实时记录,那么laravel有个DB::getQueryLog可以获取一个app请求获取出来的sql请求:
1 2 3 4 |
<span class="hljs-comment" style="color:green;">## 在filters.php中</span> App::after(<span class="hljs-function"><span class="hljs-keyword" style="color:#0000FF;">function</span><span class="hljs-params">($request, $response)</span> </span>{ <span class="hljs-comment" style="color:green;">// 数据库查询进行日志</span> $queries = DB::getQueryLog(); <span class="hljs-keyword" style="color:#0000FF;">if</span> (Config::get(<span class="hljs-string" style="color:#A31515;">'query.log'</span>, <span class="hljs-keyword" style="color:#0000FF;">false</span>)) { BLogger::getLogger(<span class="hljs-string" style="color:#A31515;">'query'</span>)->info($queries); } } |
如果你是需要实时记录的(也就是你在任何地方die出来的时候,之前的页面的sql请求也有记录)的话,你就需要监听illuminate.query事件了
1 2 3 4 5 6 7 |
<span class="hljs-comment" style="color:green;">// 数据库实时请求的日志</span> <span class="hljs-keyword" style="color:#0000FF;">if</span> (Config::get(<span class="hljs-string" style="color:#A31515;">'database.log'</span>, <span class="hljs-keyword" style="color:#0000FF;">false</span>)) { Event::listen(<span class="hljs-string" style="color:#A31515;">'illuminate.query'</span>, <span class="hljs-function"><span class="hljs-keyword" style="color:#0000FF;">function</span><span class="hljs-params">($query, $bindings, $time, $name)</span> </span>{ $data = compact(<span class="hljs-string" style="color:#A31515;">'query'</span>,<span class="hljs-string" style="color:#A31515;">'bindings'</span>, <span class="hljs-string" style="color:#A31515;">'time'</span>, <span class="hljs-string" style="color:#A31515;">'name'</span>); BLogger::getLogger(BLogger::LOG_QUERY_REAL_TIME)->info($data); }); } |
错误
laravel的所有错误会全部过global的App::error再出来
所以比如你设计的是接口,希望即使有error出现也返回json数据,则可以这么做:
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="hljs-comment" style="color:green;">// 错误日志信息</span> App::error(<span class="hljs-function"><span class="hljs-keyword" style="color:#0000FF;">function</span><span class="hljs-params">(Exception $exception, $code)</span> </span>{ <span class="hljs-comment" style="color:green;">// 如果没有路径就直接跳转到登录页面</span> <span class="hljs-keyword" style="color:#0000FF;">if</span> ($exception <span class="hljs-keyword" style="color:#0000FF;">instanceof</span> NotFoundHttpException) { <span class="hljs-keyword" style="color:#0000FF;">return</span> Redirect::route(<span class="hljs-string" style="color:#A31515;">'login'</span>); } Log::error($exception); $err = [ <span class="hljs-string" style="color:#A31515;">'message'</span> => $exception->getMessage(), <span class="hljs-string" style="color:#A31515;">'file'</span> => $exception->getFile(), <span class="hljs-string" style="color:#A31515;">'line'</span> => $exception->getLine(), <span class="hljs-string" style="color:#A31515;">'code'</span> => $exception->getCode(), <span class="hljs-string" style="color:#A31515;">'url'</span> => Request::url(), <span class="hljs-string" style="color:#A31515;">'input'</span> => Input::all(), ]; BLogger::getLogger(BLogger::LOG_ERROR)->error($err); $response = [ <span class="hljs-string" style="color:#A31515;">'status'</span> => <span class="hljs-number">0</span>, <span class="hljs-string" style="color:#A31515;">'error'</span> => <span class="hljs-string" style="color:#A31515;">"服务器内部错误"</span>, ]; <span class="hljs-keyword" style="color:#0000FF;">return</span> Response::json($response); }); |
如果你还希望将404错误也hold住:
1 2 3 4 |
App::missing(<span class="hljs-function"><span class="hljs-keyword" style="color:#0000FF;">function</span><span class="hljs-params">($exception)</span> </span>{ $response = [ <span class="hljs-string" style="color:#A31515;">'status'</span> => <span class="hljs-number">0</span>, <span class="hljs-string" style="color:#A31515;">'error'</span> => <span class="hljs-string" style="color:#A31515;">"请求路径错误"</span>, ]; <span class="hljs-keyword" style="color:#0000FF;">return</span> Response::json($response); }); |