<?php
class ModelLogs {
    private $logs;
    /**
     * 写日志, 最多64k
     * @param unknown_type $params 信息
     * @param unknown_type $file 地址
     */
    public function debug($params, $file='debug.txt')
    {
        clearstatcache();
        return $this->debug3($params, $file); //使用同一日志系统，方便ELK收集

        $dir = PATH_DAT. 'log/';
        $file = $dir . $file . '.php';
        if( !is_dir($dir) ){
            $old = umask(0);
            mkdir($dir, PRODUCTION_SERVER ? 0775 : 0777, true);
            umask($old);
        }
        if (file_exists($file)) {
            $size =  @filesize($file);
        } else {
            touch($file) && chmod($file, PRODUCTION_SERVER ? 0664 : 0666);
            $size = 0;
        }
        $time = date('Y-m-d H:i:s');
        $contents = ($size ? '' : "<?php die();?>\n") . $time. "\n" . var_export($params, true) . "\n\n";
        file_put_contents($file, $contents, $size<64*1024 ? FILE_APPEND : null);
    }

    /**
     * 写日志-无大小限制-按小时散列-适合大型日志
     * @param unknown $params
     * @param string $file
     */
    public function debug2($params, $filename='log.txt')
    {
        return $this->debug3($params, $filename); //使用同一日志系统，方便ELK收集
        $ymd = date('Ymd');
        $dir = PATH_DAT."{$ymd}/";
        if (!is_dir($dir))
        {
            $old = umask(0);
            mkdir($dir, PRODUCTION_SERVER ? 0775 : 0777, true);
            umask($old);
        }
        $h = date('H');
        $filepath = "{$dir}{$filename}_{$h}.log";
        $str = is_array($params) ? json_encode($params) : $params;
        return file_put_contents($filepath, date('Y-m-d H:i:s')." {$str} \n", FILE_APPEND);
    }

    /**
     * 写日志-无大小限制-适合大型日志
     * @param $params
     * @param string $filename
     * @param string $path
     * @return bool|int
     * Created by: Owen
     * Created on: 2020/3/10 17:00
     */
    public function debug3($params, $filename='log.txt',$path = "")
    {
        $ymd = date('Ymd');
        //$dir = PATH_DAT."logs/"."{$ymd}/".$path;
        $dir = PATH_DAT."logs2/"."{$ymd}/";
        if (!is_dir($dir)) {
            $old = umask(0);
            mkdir($dir, PRODUCTION_SERVER ? 0775 : 0777, true);
            umask($old);
            if(function_exists('chgrp')&&php_sapi_name()=='cli'){//防止root创建www无权限
                @chgrp($dir,'www');
                @chown($dir,'www');
            }
        }
        if(empty($filename)){
            $filename = 'other';
        }
        $pos = strrpos($filename, '.');
        $filename = $pos !== false ? substr($filename, 0, $pos) : $filename;
        $filepath = "{$dir}{$filename}.log";
        if(!file_exists($filepath)){
            touch($filepath);
            if(function_exists('chgrp')&&php_sapi_name()=='cli'){//防止root创建的文件www无权限写
                @chgrp($filepath,'www');
                @chown($filepath,'www');
            }
        }
        $str = is_array($params) ? json_encode($params,JSON_UNESCAPED_UNICODE) : $params;
        return file_put_contents($filepath, date('Y-m-d H:i:s')."##{$str} \n", FILE_APPEND);
//        $data = ['log_level' => 'info', 'log_module' => $filename, 'time' => date('Y-m-d H:i:s'), 'host_ip' => SERVER_INT_IP, 'content' => $params];
//        return file_put_contents($filepath, json_encode($data)."\n", FILE_APPEND);
    }

    /**
     * 写日志-无大小限制-适合大型日志
     * @param $params
     * @param string $filename
     * @param string $path
     * @return bool|int
     * Created by: Owen
     * Created on: 2020/3/10 17:01
     */
    public function debug4($params, $filename='log.txt',$path = "")
    {
        return $this->debug3($params, $filename); //使用同一日志系统，方便ELK收集
        $dir = PATH_DAT.$path;
        if (!is_dir($dir)){
            $old = umask(0);
            mkdir($dir, PRODUCTION_SERVER ? 0775 : 0777, true);
            umask($old);
        }
        $filepath = "{$dir}{$filename}";
        $str = is_array($params) ? json_encode($params) : $params;
        return file_put_contents($filepath, "{$str} \n", FILE_APPEND);
    }
	
  	/**
     * 写日志-无大小限制-适合大型日志
     * @param unknown $params
     * @param string $file
     */
    public function debug5($params, $filename='log.txt',$path = "")
    {
        return $this->debug3($params, $filename); //使用同一日志系统，方便ELK收集
        $dir = PATH_DAT.$path;
        if (!is_dir($dir)){
            $old = umask(0);
            mkdir($dir, PRODUCTION_SERVER ? 0775 : 0777, true);
            umask($old);
        }
        $filepath = "{$dir}{$filename}";
        $str = is_array($params) ? json_encode($params) : $params;
        return file_put_contents($filepath, "{$str} \n", FILE_APPEND);
    }
  
    /**
     * 写日志-无大小限制-适合大型日志
     * @param unknown $params
     * @param string $file
     */
    public function todebug($params, $filename='log.txt')
    {
        return $this->debug3($params, $filename); //使用同一日志系统，方便ELK收集
        $ymd = date('Ymd');
        $dir = "/data/datalog/{$ymd}/";
        if (!is_dir($dir))
        {
            $old = umask(0);
            mkdir($dir, PRODUCTION_SERVER ? 0775 : 0777, true);
            umask($old);
            chgrp($dir, 'wwwsp');

        }
        $filepath = "{$dir}{$filename}";
        $str = is_array($params) ? json_encode($params) : $params;
        return file_put_contents($filepath, date('Y-m-d H:i:s')." {$str} \n", FILE_APPEND);
    }


    /**
     * 写日志-无大小限制-适合大型日志
     * @param unknown $params
     * @param string $file
     */
    public function nodatedebug($params, $filename='log.txt', $dir = 'log')
    {
        return $this->debug3($params, $filename); //使用同一日志系统，方便ELK收集
        $dir = PATH_DAT.$dir.'/';
        if (!is_dir($dir))
        {
            $old = umask(0);
            mkdir($dir, PRODUCTION_SERVER ? 0775 : 0777, true);
            umask($old);
        }
        $filepath = "{$dir}{$filename}";
        $str = is_array($params) ? json_encode($params) : $params;
        return file_put_contents($filepath, date('Y-m-d H:i:s')." {$str} \n", FILE_APPEND);
    }


    /**
     * boyaa log
     * @param unknown $str
     */
    public function bylogs( $str){
        if( ! is_object( $this->logs['bylogs'])){
            include_once PATH_LIB . 'class.bylog.php';
            $this->logs['bylogs'] = new bylog();
        }
        return $this->logs['bylogs']->write( $str);
    }
    /**
     * UDP SWOOLE上报日志
     * @param string $type
     * @param string $filename
     * @param unknown $params
     */
    public function logsUdp( $type='debug',$params, $filename='debug.txt')
    {
        if (1) { // 一台服务器暂时不走UDP日志
            is_array($params) && $params = var_export($params, TRUE);
            self::$type($params, $filename);
            return true;
        }
        $configInc = oo::$config['swooleLogs'];
        $host = $configInc[0];
        $port = $configInc[1];
        $error_code = 0;
        $error_message = '';
        $socket = stream_socket_client("udp://{$host}:{$port}", $error_code, $error_message, 300);
        $log_buff_str = array('filename'=>$filename,'type'=>$type,'content'=>is_array($params) ? var_export($params, TRUE) : $params);
        $log_buff_str = json_encode( $log_buff_str);
        @fwrite($socket, $log_buff_str);
    }

    /**
     * Notes:通用日志
     * User : wsc
     * Date : 2020/1/9 18:44
     * @param $params
     * @param string $fname
     * @param int $fsize
     * @param bool $sign
     * @return bool
     */
    public function commlog($params, $fname = 'debug.txt', $fsize = 1, $sign=false){
        if(!is_string($fname)){
            //文件名一定是字符串
            return false;
        }
        is_scalar( $params ) or ($params = var_export( $params, true )); //是简单数据
        if( !$params ){
            return false;
        }
        clearstatcache();
//        if(!IS_DEBUF){
            $filename = str_replace('/','_',$fname);
            return $this->debug3($params, $filename); //使用同一日志系统，方便ELK收集
//        }

        $file = PATH_DAT.'logs/' . $fname . '.php';
        $dir = dirname( $file );
        if( !is_dir( $dir ) ) mkdir( $dir, 0775, true );
        $size = file_exists( $file ) ? @filesize( $file ) : 0;
        $flag = $size < max( 1, $fsize ) * 1024 * 1024; //标志是否附加文件.文件控制在1M大小
        if( !$flag && $sign === 'bak' ){//文件超过大小自动备份
            $bak = $dir . "/bak/$fname/";
            if( !is_dir( $bak ) ) mkdir( $bak, 0775, true );
            $fname = explode( '/', $fname );
            $fname = $fname[count( $fname ) - 1];
            $bak .= $fname . '-' . date( 'YmdHis' ) . '.php';
            copy( $file, $bak );
        }
        $pwd = 'mvc';//默认密码
        $prefix = $size && $flag ? '' : "<?php (isset(\$_GET['pwd']) && (\$_GET['pwd']==='{$pwd}')) or die();?>\n";
        @file_put_contents( $file, $prefix .date('Y-m-d H:i:s').'##'. $params . "\n", $flag ? FILE_APPEND : null  );
        return true;
    }
}
