Logger.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <?php
  2. namespace Heanup\Frame;
  3. /**
  4. * 简单日志记录
  5. */
  6. class Logger
  7. {
  8. private static $logPath = '/data/wwwlogs/';
  9. private static $logLevel = LOG_ERR;
  10. private static $maps = array(
  11. LOG_DEBUG => 'debug',
  12. LOG_INFO => 'info',
  13. LOG_NOTICE => 'notice',
  14. LOG_WARNING => 'warning',
  15. LOG_ERR => 'err',
  16. LOG_CRIT => 'crit',
  17. LOG_ALERT => 'alert',
  18. LOG_EMERG => 'emerg'
  19. );
  20. /**
  21. * 获取单例
  22. *
  23. * @return Logger
  24. */
  25. public static function getInstance()
  26. {
  27. static $instance = null;
  28. if (is_null($instance)) {
  29. $instance = new Logger();
  30. }
  31. return $instance;
  32. }
  33. /**
  34. * 设置日志记录错误等级
  35. *
  36. * @param int $level
  37. * @return Logger
  38. */
  39. public static function setLogLevel($level = LOG_DEBUG)
  40. {
  41. self::$logLevel = intval($level);
  42. return self::getInstance();
  43. }
  44. /**
  45. * 设置日志记录路径
  46. *
  47. * @param
  48. * $path
  49. * @return Logger
  50. */
  51. public static function setLogPath($path)
  52. {
  53. $path = trim($path);
  54. if (!empty($path) and is_writable($path)) {
  55. self::$logPath = $path;
  56. }
  57. return self::getInstance();
  58. }
  59. public static function debug($message = '', $filename = null)
  60. {
  61. return self::log($message, $filename, LOG_DEBUG);
  62. }
  63. public static function info($message = '', $filename = null)
  64. {
  65. return self::log($message, $filename, LOG_INFO);
  66. }
  67. public static function notice($message = '', $filename = null)
  68. {
  69. return self::log($message, $filename, LOG_NOTICE);
  70. }
  71. public static function warning($message = '', $filename = null)
  72. {
  73. return self::log($message, $filename, LOG_WARNING);
  74. }
  75. public static function error($message = '', $filename = null)
  76. {
  77. return self::log($message, $filename, LOG_ERR);
  78. }
  79. public static function crit($message = '', $filename = null)
  80. {
  81. return self::log($message, $filename, LOG_CRIT);
  82. }
  83. public static function alert($message = '', $filename = null)
  84. {
  85. return self::log($message, $filename, LOG_ALERT);
  86. }
  87. public static function emerg($message = '', $filename = null)
  88. {
  89. return self::log($message, $filename, LOG_EMERG);
  90. }
  91. public static function log($message = '', $filename = null, $logType = LOG_DEBUG)
  92. {
  93. // 达不到错误记录级别的不与记录,主要是线上环境忽略debug信息
  94. if ($logType > self::getLogLevel()) {
  95. return false;
  96. }
  97. self::file($message, $filename, $logType);
  98. return true;
  99. }
  100. /**
  101. * 自定义记录日志
  102. *
  103. * @param null $email
  104. * @param string $message
  105. * @param string $filename
  106. * @return bool
  107. */
  108. public static function setLog($email = NULL, $message = "", $filename = "")
  109. {
  110. if (empty($message) || empty($filename))
  111. return false;
  112. $filename = self::getLogPath($filename);
  113. $message = "[" . date('Y-m-d H:i:s') . "]" . "-[IP:" . self::getClientIp() . "]" . "-[http://" . self::getServerIp() . $_SERVER['REQUEST_URI'] . "]" . ($email ? "-[EMAIL:$email]" : "") . "-[操作:$message]" . "\n";
  114. return error_log($message, 3, $filename);
  115. }
  116. /**
  117. * 自定义记录日志
  118. *
  119. * @param string $message
  120. * @param string $filename
  121. * @return bool
  122. */
  123. public static function logApi($message = "", $filename = "")
  124. {
  125. if (empty($message) || empty($filename))
  126. return false;
  127. $filename = self::getLogPath($filename);
  128. $message = "[" . date('Y-m-d H:i:s') . "]" . "-[IP:" . self::getClientIp() . "]" . "-[http://" . self::getServerIp() . $_SERVER['REQUEST_URI'] . "]" . '[post:' . http_build_query($_POST) . ']' . '[get:' . http_build_query($_GET) . ']' . "-[msg:$message]" . "\n";
  129. return error_log($message, 3, $filename);
  130. }
  131. /**
  132. * 记录简单的日志内容
  133. *
  134. * @param
  135. * $message
  136. * @param
  137. * $filename
  138. * @return bool
  139. */
  140. public static function singleLog($data, $filename)
  141. {
  142. if (is_array($data)) {
  143. $msg = http_build_query($data);
  144. } else {
  145. $msg = $data;
  146. }
  147. $filename = self::getLogPath($filename);
  148. $message = "[" . date('Y-m-d H:i:s') . "][" . $_SERVER['REQUEST_URI'] . "]-[IP:" . self::getClientIp() . "][data:" . $msg . "]\r\n";
  149. return error_log($message, 3, $filename);
  150. }
  151. /**
  152. * 使用文件记录推送日志
  153. *
  154. * @param string $message
  155. * @param string $filename
  156. * @param int $logType
  157. * @return bool
  158. */
  159. private static function file($message = '', $filename = null, $logType = LOG_INFO)
  160. {
  161. if (!$filename) {
  162. $logType = intval($logType);
  163. $filename = self::$maps[$logType];
  164. }
  165. $filename = self::getLogPath($filename);
  166. $message = self::formatFields($message);
  167. return error_log($message, 3, $filename);
  168. }
  169. /**
  170. * 格式日志记录
  171. *
  172. * @param string $message
  173. * @return string
  174. */
  175. private static function formatFields($message)
  176. {
  177. if ($message instanceof \Exception) {
  178. $trace = $message->getTrace();
  179. $trace = $trace[1];
  180. $trace = ' ;trace => ' . json_encode($trace);
  181. $message = $message->getCode() . ' => ' . $message->getMessage() . $trace;
  182. } elseif ($message) {
  183. $message = (is_string($message) || is_numeric($message)) ? $message : json_encode($message);
  184. } else {
  185. $message = ' - ';
  186. }
  187. $data = array();
  188. $data['time'] = date('Y-m-d H:i:s');
  189. $data['message'] = trim($message);
  190. $data['client_ip'] = self::getClientIp();
  191. $string = '[' . implode("] [", $data) . ']' . "\n";
  192. return $string;
  193. }
  194. /**
  195. * 获取错误等级
  196. *
  197. * @return int
  198. */
  199. private static function getLogLevel()
  200. {
  201. return self::$logLevel;
  202. }
  203. /**
  204. * 获取日志路径,如果不存在或者不可写则使用tmp路径
  205. *
  206. * @param
  207. * $filename
  208. * @return string
  209. */
  210. private static function getLogPath($filename)
  211. {
  212. static $path = '';
  213. if (!$path) {
  214. if ((!file_exists(self::$logPath))) {
  215. @mkdir(self::$logPath, 0777, true);
  216. }
  217. $path = is_writable(self::$logPath) ? self::$logPath : sys_get_temp_dir();
  218. $path = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . date('Ym') . DIRECTORY_SEPARATOR . date('d') . DIRECTORY_SEPARATOR;
  219. if (!is_writable($path)) {
  220. if (!file_exists($path)) {
  221. mkdir($path, 0777, true);
  222. }
  223. }
  224. }
  225. $filename = strtolower(strtr($filename, array(
  226. ' ' => '',
  227. DIRECTORY_SEPARATOR => ''
  228. )));
  229. $filename = $path . $filename . '.log';
  230. return $filename;
  231. }
  232. /**
  233. * 获取客户端Ip
  234. *
  235. * @return string|int
  236. */
  237. private static function getClientIp()
  238. {
  239. static $ip;
  240. if ($ip) {
  241. return $ip;
  242. }
  243. if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
  244. $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  245. } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
  246. $ip = $_SERVER["HTTP_CLIENT_IP"];
  247. } elseif (isset($_SERVER["HTTP_CLIENTIP"])) {
  248. $ip = $_SERVER["HTTP_CLIENTIP"];
  249. } elseif (isset($_SERVER["HTTP_X_REAL_IP"])) {
  250. $ip = $_SERVER["HTTP_X_REAL_IP"];
  251. } elseif (isset($_SERVER["REMOTE_ADDR"])) {
  252. $ip = $_SERVER["REMOTE_ADDR"];
  253. } else {
  254. $ip = '127.0.0.1';
  255. }
  256. $pos = strpos($ip, '|');
  257. if ($pos) {
  258. $ip = substr($ip, 0, $pos);
  259. }
  260. $ip = trim($ip);
  261. return $ip;
  262. }
  263. /**
  264. * 获取服务器IP
  265. *
  266. * @return string
  267. */
  268. private static function getServerIp()
  269. {
  270. static $ip;
  271. if ($ip) {
  272. return $ip;
  273. }
  274. if (isset($_SERVER['SERVER_ADDR'])) {
  275. $ip = $_SERVER['SERVER_ADDR'];
  276. } else {
  277. $cmd = "/sbin/ifconfig|grep 'inet addr'|awk '{print $2}'|awk -F':' '{print $2}'|awk '$1 !~ /127.0.0.1/{print}'|tail -n 1";
  278. $handle = popen($cmd, 'r');
  279. $ip = trim(fread($handle, 1024));
  280. pclose($handle);
  281. }
  282. return $ip;
  283. }
  284. }