首页 > 编程语言 >自定义php日志类收集应用日志

自定义php日志类收集应用日志

时间:2023-12-26 23:33:07浏览次数:36  
标签:function log 自定义 logLevel file logMessage 日志 php

<?php

class MiniLog {
	private static $_instance;
	private $_path;
	private $_pid;
	private $_handleArr;
	
	function __construct($path) {
		$this->_path = $path;
		$this->_pid = getmypid();
		
	}
	
	private function __clone() {
		
	}
	
	public static function instance($path = '/tmp/') {
		if(!(self::$_instance instanceof self)) {
			self::$_instance = new self($path);
		}
		
		return self::$_instance;
	}
	
	private	function getHandle($fileName) {
		if($this->_handleArr[$fileName]) {
			return $this->_handleArr[$fileName];
		}
		date_default_timezone_set('PRC');
		$nowTime = time();
		$logSuffix = date('Ymd', $nowTime);
		$handle = fopen($this->_path . '/' . $fileName . $logSuffix . ".log", 'a');
		$this->_handleArr[$fileName] = $handle;
		return $handle;
	}
	
	public function log($fileName, $message) {
		$handle = $this->getHandle($fileName);
		$nowTime = time();
		$logPreffix = date('Y-m-d H:i:s', $nowTime);
		fwrite($handle, "[$logPreffix][$this->_pid]$message\n");
		return true;
	}
	
	function __destruct(){
		foreach ($this->_handleArr as $key => $item) {
			if($item) {
				fclose($item);
			}
		}
	}
}

?>

该日志类特点:1. 消息记录了进程id,在消息交错时方便调试 2.打开文件后保存了文件的fd,避免重复打开文件。

调用代码:

/*
 * 默认打开所有的日志文件文件
 * ERROR,INFO,DEBUG日志级别分别对应的关闭标记文件为:NO_ERROR, NO_INFO, NO_DEBUG
 */
function isLogLevelOff($logLevel)
{
	$swithFile = ROOT_PATH . '/log/' . 'NO_' . $logLevel;
	if (file_exists($swithFile)){
		return true;
	}else {
		return false;
	}
}


/**
 * @author pacozhong
 * 日志函数的入口
 * @param string $confName 日志配置名
 * @param string $logLevel 级别
 * @param int $errorCode 错误码
 * @param string $logMessage 日志内容
 */
function ccdb_log($confName ,$logLevel, $errorCode, $logMessage = "no error msg")
{
	if (isLogLevelOff($logLevel)){
		return;
	}
	
	$st = debug_backtrace();

	$function = ''; //调用interface_log的函数名
	$file = '';     //调用interface_log的文件名
	$line = '';     //调用interface_log的行号
	foreach($st as $item) {
		if($file) {
			$function = $item['function'];
			break;
		}
		if($item['function'] == 'interface_log') {
			$file = $item['file'];
			$line = $item['line'];
		}
	}
	
	$function = $function ? $function : 'main';
	
	//为了缩短日志的输出,file只取最后一截文件名
	$file = explode("/", rtrim($file, '/'));
	$file = $file[count($file)-1];
	$prefix = "[$file][$function][$line][$logLevel][$errorCode] ";
	if($logLevel == INFO || $logLevel == STAT) {
		$prefix = "[$logLevel]" ;
	}
	$logMessage = genErrMsg($errorCode , $logMessage);
	$logFileName = $confName . "_" . strtolower($logLevel);
	MiniLog::instance(ROOT_PATH . "/log/")->log($logFileName, $prefix . $logMessage);
	if (isLogLevelOff("DEBUG") || $logLevel == "DEBUG"){
		return ;
	}else {
		MiniLog::instance(ROOT_PATH . "/log/")->log($confName . "_" . "debug", $prefix . $logMessage);
	}
}

/**
 * @author pacozhong
 * 接口层日志函数
 */
function interface_log($logLevel, $errorCode, $logMessage = "no error msg")
{
	ccdb_log('interface', $logLevel, $errorCode, $logMessage);
}

 

在文件夹放NO_XX控制日志的开启和关闭。

 

以上为《微信公众平台开发实战》学习笔记

标签:function,log,自定义,logLevel,file,logMessage,日志,php
From: https://www.cnblogs.com/luoyunshu/p/17929611.html

相关文章

  • day21 Prometheus Operator优化配置 -Prometheus Operator自定义监控对象(7.13-7.14)
    7.13-PrometheusOperator优化配置1、数据持久化1.1prometheus数据持久化默认Prometheus和Grafana不做数据持久化,那么服务重启以后配置的Dashboard、账号密码、监控数据等信息将会丢失,所以做数据持久化也是很有必要的。原始的数据是以emptyDir形式存放在pod里面,生命周期与po......
  • MagicArray:像php一样,让Go业务代码不再卷!
    卷!一个字形容了当今码农行业的现状。一层一层的代码结构,一个一个dto,entity,vo,req,resp。这些对象越来越多,让码农们非常劳于奔命,加一个字段,改一个字段,影响面有多少。代码量也越来越大。有可能一个代码,要建10多个数据对象。这虽然有点夸张,但体现了行业的乱象。我是曾经写php代码的......
  • Windows事件日志
    本文主旨:了解Windows事件日志的相关信息,以便于后续进行Windows日志分析。事件日志简介事件日志记录[1]为(的应用程序和操作系统)记录重要软件和硬件事件提供了一种标准的集中式方法。事件日志记录服务记录来自各种源的事件,并将其存储在名为事件日志的单个集合中。事件日志......
  • kafka 自定义开发Sink Connector组件(兼容mysql和oracle)
    1.情景展示目前,市场上已有不少能从kafka消费数据的插件,如:io.confluent.connect.jdbc.JdbcSinkConnector,但这个组件有个致命的问题是,只能同步字符串类型。具体意思是:源库源表的日期类型字段,往目标库目标表插入数据的时候,只能是字符串类型,无法自动将其转成日期类型。这样一来的......
  • 项目自定义代码规范
    2023年底了马上2024年了,今年没写几篇文章,事情太多。长大是痛苦的要经历很多。收~进入正题今天带来一个创建项目团队合作开发的规范。跟上我的步伐,从0-1开始吧!eslintESLint是一个可配置的JavaScript检查器。它可以帮助你发现并修复JavaScript代码中的问题。问题可以指......
  • iview 表格列自定义样式 & public.css 公共样式里面引用图片方式
    {title:'操作',key:'action',align:'center',renderHead:()=>{},//自定义表头样式className:'col_oper',width:120,render:(h,params)=&g......
  • rabbitMq怎么查看队列日志消息-Tracing日志
    Trace是Rabbitmq用于记录每一次发送的消息,方便使用Rabbitmq的开发者调试、排错。1、启动Tracing插件在RabbitMQ中默认是关闭的,需手动开启。此处rabbitMQ是使用docker部署的##进入rabbitMq中dockerexec-itrabbitmq1bash##启动日志插件rabbitmq-pluginsenablerabbitmq_tr......
  • 自定义开发odoo14的统计在线用户人数 (续)
    上一篇是只统计在过去几分钟内有活动的用户是在线的。今天我们来处理当浏览器关闭后,才算是离线用户,否则算在线用户。 要实现当浏览器关闭后才算用户离线的功能,在Odoo中较为复杂,因为Odoo服务器端无法直接检测到客户端浏览器的关闭事件。不过,我们可以通过一种近似的方法来实......
  • 自定义开发odoo14的统计在线用户人数
    在Odoo14中统计在线人数通常涉及到定制开发或者使用特定的模块。自定义开发:如果没有现成的模块,您可能需要进行一些自定义开发。这通常涉及到扩展Odoo的用户模型,以跟踪用户的登录和登出活动。以下是一个基本的实现思路:扩展用户模型:在用户模型(通常是res.users)中添加字段来记......
  • 微信小程序自定义ui库开发记录
    首先去翻官网,看有没有提供,发现微信官方提供了命令行工具,用于快速初始化一个项目npminstall-g@wechat-miniprogram/miniprogram-cli自定义组件/开发第三方自定义组件(qq.com)使用体验打包后的组件,每个js顶部都会带上一大段代码,增大了文件体积。没有相关的组件文档生......