PageRenderTime 36ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/laravel/framework/src/Illuminate/Log/Writer.php

https://gitlab.com/xolotsoft/pumasruiz
PHP | 311 lines | 147 code | 43 blank | 121 comment | 8 complexity | 87bf36c2bc4cd506f27add45bfd45687 MD5 | raw file
  1. <?php namespace Illuminate\Log;
  2. use Closure;
  3. use Illuminate\Events\Dispatcher;
  4. use Monolog\Handler\StreamHandler;
  5. use Monolog\Logger as MonologLogger;
  6. use Monolog\Formatter\LineFormatter;
  7. use Monolog\Handler\ErrorLogHandler;
  8. use Monolog\Handler\RotatingFileHandler;
  9. use Illuminate\Support\Contracts\JsonableInterface;
  10. use Illuminate\Support\Contracts\ArrayableInterface;
  11. class Writer {
  12. /**
  13. * The Monolog logger instance.
  14. *
  15. * @var \Monolog\Logger
  16. */
  17. protected $monolog;
  18. /**
  19. * All of the error levels.
  20. *
  21. * @var array
  22. */
  23. protected $levels = array(
  24. 'debug',
  25. 'info',
  26. 'notice',
  27. 'warning',
  28. 'error',
  29. 'critical',
  30. 'alert',
  31. 'emergency',
  32. );
  33. /**
  34. * The event dispatcher instance.
  35. *
  36. * @var \Illuminate\Events\Dispatcher
  37. */
  38. protected $dispatcher;
  39. /**
  40. * Create a new log writer instance.
  41. *
  42. * @param \Monolog\Logger $monolog
  43. * @param \Illuminate\Events\Dispatcher $dispatcher
  44. * @return void
  45. */
  46. public function __construct(MonologLogger $monolog, Dispatcher $dispatcher = null)
  47. {
  48. $this->monolog = $monolog;
  49. if (isset($dispatcher))
  50. {
  51. $this->dispatcher = $dispatcher;
  52. }
  53. }
  54. /**
  55. * Call Monolog with the given method and parameters.
  56. *
  57. * @param string $method
  58. * @param mixed $parameters
  59. * @return mixed
  60. */
  61. protected function callMonolog($method, $parameters)
  62. {
  63. if (is_array($parameters[0]))
  64. {
  65. $parameters[0] = json_encode($parameters[0]);
  66. }
  67. return call_user_func_array(array($this->monolog, $method), $parameters);
  68. }
  69. /**
  70. * Register a file log handler.
  71. *
  72. * @param string $path
  73. * @param string $level
  74. * @return void
  75. */
  76. public function useFiles($path, $level = 'debug')
  77. {
  78. $level = $this->parseLevel($level);
  79. $this->monolog->pushHandler($handler = new StreamHandler($path, $level));
  80. $handler->setFormatter($this->getDefaultFormatter());
  81. }
  82. /**
  83. * Register a daily file log handler.
  84. *
  85. * @param string $path
  86. * @param int $days
  87. * @param string $level
  88. * @return void
  89. */
  90. public function useDailyFiles($path, $days = 0, $level = 'debug')
  91. {
  92. $level = $this->parseLevel($level);
  93. $this->monolog->pushHandler($handler = new RotatingFileHandler($path, $days, $level));
  94. $handler->setFormatter($this->getDefaultFormatter());
  95. }
  96. /**
  97. * Register an error_log handler.
  98. *
  99. * @param string $level
  100. * @param int $messageType
  101. * @return void
  102. */
  103. public function useErrorLog($level = 'debug', $messageType = ErrorLogHandler::OPERATING_SYSTEM)
  104. {
  105. $level = $this->parseLevel($level);
  106. $this->monolog->pushHandler($handler = new ErrorLogHandler($messageType, $level));
  107. $handler->setFormatter($this->getDefaultFormatter());
  108. }
  109. /**
  110. * Get a default Monolog formatter instance.
  111. *
  112. * @return \Monolog\Formatter\LineFormatter
  113. */
  114. protected function getDefaultFormatter()
  115. {
  116. return new LineFormatter(null, null, true);
  117. }
  118. /**
  119. * Parse the string level into a Monolog constant.
  120. *
  121. * @param string $level
  122. * @return int
  123. *
  124. * @throws \InvalidArgumentException
  125. */
  126. protected function parseLevel($level)
  127. {
  128. switch ($level)
  129. {
  130. case 'debug':
  131. return MonologLogger::DEBUG;
  132. case 'info':
  133. return MonologLogger::INFO;
  134. case 'notice':
  135. return MonologLogger::NOTICE;
  136. case 'warning':
  137. return MonologLogger::WARNING;
  138. case 'error':
  139. return MonologLogger::ERROR;
  140. case 'critical':
  141. return MonologLogger::CRITICAL;
  142. case 'alert':
  143. return MonologLogger::ALERT;
  144. case 'emergency':
  145. return MonologLogger::EMERGENCY;
  146. default:
  147. throw new \InvalidArgumentException("Invalid log level.");
  148. }
  149. }
  150. /**
  151. * Register a new callback handler for when
  152. * a log event is triggered.
  153. *
  154. * @param \Closure $callback
  155. * @return void
  156. *
  157. * @throws \RuntimeException
  158. */
  159. public function listen(Closure $callback)
  160. {
  161. if ( ! isset($this->dispatcher))
  162. {
  163. throw new \RuntimeException("Events dispatcher has not been set.");
  164. }
  165. $this->dispatcher->listen('illuminate.log', $callback);
  166. }
  167. /**
  168. * Get the underlying Monolog instance.
  169. *
  170. * @return \Monolog\Logger
  171. */
  172. public function getMonolog()
  173. {
  174. return $this->monolog;
  175. }
  176. /**
  177. * Get the event dispatcher instance.
  178. *
  179. * @return \Illuminate\Events\Dispatcher
  180. */
  181. public function getEventDispatcher()
  182. {
  183. return $this->dispatcher;
  184. }
  185. /**
  186. * Set the event dispatcher instance.
  187. *
  188. * @param \Illuminate\Events\Dispatcher
  189. * @return void
  190. */
  191. public function setEventDispatcher(Dispatcher $dispatcher)
  192. {
  193. $this->dispatcher = $dispatcher;
  194. }
  195. /**
  196. * Fires a log event.
  197. *
  198. * @param string $level
  199. * @param string $message
  200. * @param array $context
  201. * @return void
  202. */
  203. protected function fireLogEvent($level, $message, array $context = array())
  204. {
  205. // If the event dispatcher is set, we will pass along the parameters to the
  206. // log listeners. These are useful for building profilers or other tools
  207. // that aggregate all of the log messages for a given "request" cycle.
  208. if (isset($this->dispatcher))
  209. {
  210. $this->dispatcher->fire('illuminate.log', compact('level', 'message', 'context'));
  211. }
  212. }
  213. /**
  214. * Dynamically pass log calls into the writer.
  215. *
  216. * @param mixed (level, param, param)
  217. * @return mixed
  218. */
  219. public function write()
  220. {
  221. $level = head(func_get_args());
  222. return call_user_func_array(array($this, $level), array_slice(func_get_args(), 1));
  223. }
  224. /**
  225. * Dynamically handle error additions.
  226. *
  227. * @param string $method
  228. * @param mixed $parameters
  229. * @return mixed
  230. *
  231. * @throws \BadMethodCallException
  232. */
  233. public function __call($method, $parameters)
  234. {
  235. if (in_array($method, $this->levels))
  236. {
  237. $this->formatParameters($parameters);
  238. call_user_func_array(array($this, 'fireLogEvent'), array_merge(array($method), $parameters));
  239. $method = 'add'.ucfirst($method);
  240. return $this->callMonolog($method, $parameters);
  241. }
  242. throw new \BadMethodCallException("Method [$method] does not exist.");
  243. }
  244. /**
  245. * Format the parameters for the logger.
  246. *
  247. * @param mixed $parameters
  248. * @return void
  249. */
  250. protected function formatParameters(&$parameters)
  251. {
  252. if (isset($parameters[0]))
  253. {
  254. if (is_array($parameters[0]))
  255. {
  256. $parameters[0] = var_export($parameters[0], true);
  257. }
  258. elseif ($parameters[0] instanceof JsonableInterface)
  259. {
  260. $parameters[0] = $parameters[0]->toJson();
  261. }
  262. elseif ($parameters[0] instanceof ArrayableInterface)
  263. {
  264. $parameters[0] = var_export($parameters[0]->toArray(), true);
  265. }
  266. }
  267. }
  268. }