UdpLog.php 4.09 KB
<?php
/**
 * Created by IntelliJ IDEA.
 * User: hbomb_000
 * Date: 2016/5/5
 * Time: 18:17
 */

namespace WebPlugin;


/**
 * Class UdpLog
 * @useage:
 * UdpLog::info('get payment list begin',array('order_code'=>123231));
 * @package WebPlugin
 */
class UdpLog
{
    //influxdb url
    public static $url = 'influxdb.yohobuy.com';
    //influxdb port
    public static $port = '4444';
    //influxdb measurement
    public static $measurement = 'php_log';
    
    public static $filePath = '/Data/logs/';
    
    const RECORD_MODE_FILE = 'FILE';
    const RECORD_MODE_UDP = 'UDP';
    
    const RECORD_MODE = 'FILE';//mode: FILE | UDP

    /**
     * proc line and send log to influxdb
     * @param $level
     * @param $message
     * @param $meta
     */
    private static function procLog($level, $message, $debugInfo, $meta = '') {
        date_default_timezone_set('PRC');
        $level = str_replace(__CLASS__.'::','',$level);
        $file = $debugInfo[0]["file"];
        $line = $debugInfo[0]["line"];
        $string = '';
        //make tags
        $tags = array(
             'time' => date('Y-m-d H:i:s',time()),
              'level' => $level,
              'host'=> gethostname(),
              'file'=> $file,
              'line'=> $line,
              'message' => $message,
              'meta' =>  serialize($meta)
        );
        //make a line
        $string = implode('|', $tags); //format: time|level|host|file|line|message|meta
        if(self::RECORD_MODE == self::RECORD_MODE_UDP) {
            self::send($string);
        }
        else if(self::RECORD_MODE == self::RECORD_MODE_FILE) {
            self::fileLog($level, $string);
        }
    }

    /**
     * 文件日志记录
     * 
     * @param string $level
     * @param string $message
     */
    private static function fileLog($level, $message)
    {
        $filename = $level . '.log'; //日志文件
        $logFile = self::createPath(self::$filePath, $filename);
        if (!file_exists(self::$filePath))//判断文件路径是否存在
        {
            if (!empty(self::$filePath))//判断路径是否为空
            {
                if (!(self::createDir(self::$filePath))) {
                    return false;
                }
                if (!is_writable($logFile)) {
                    return false;
                }
            }
        }
        @error_log($message."\r\n", 3, $logFile);
    }
    
    /**
     * 作用:创建目录
     * 输入:要创建的目录
     * 输出:true | false
     */
    private static function createDir($dir)
    {
        return is_dir($dir) or (self::createDir(dirname($dir)) and mkdir($dir, 0777));
    }
    
    /**
     * 作用:构建路径
     * 输入:文件的路径,要写入的文件名
     * 输出:构建好的路径字串
     */
    private static function createPath($dir, $filename)
    {
        if (empty($dir)) {
            return $filename;
        } else {
            return $dir . "/" . $filename;
        }
    }
    
    /**
     * send by udp
     * @param $string
     */
    private static function send($string) {
        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        $len = strlen($string);
        socket_sendto($sock, $string, $len, 0, self::$url, self::$port);
        socket_close($sock);
    }

    /**
     * info log
     * @param $message
     * @param mixed $meta
     */
    public static function info($message, $meta = '') {
        self::procLog(__METHOD__, $message, debug_backtrace(), $meta);
    }

    /**
     * warn log
     * @param $message
     * @param mixed $meta
     */
    public static function warn($message, $meta = '') {
        self::procLog(__METHOD__, $message, debug_backtrace(), $meta);
    }

    /**
     * error log
     * @param $message
     * @param mixed $meta
     */
    public static function error($message, $meta = '') {
        self::procLog(__METHOD__, $message, debug_backtrace(), $meta);
    }

    /**
     * debug log
     * @param $message
     * @param mixed $meta
     */
    public static function debug($message, $meta = '') {
        self::procLog(__METHOD__, $message, debug_backtrace(), $meta);
    }
}