PHP 롤링 log_php 기술의 코드 구현
PHP 롤링 로그 라이브러리
PHP는 로그를 기록하는 방법에 대해 폴더를 연도, 월별로 나누고, 파일을 날짜별로 나누는 방법에 대해 알아봤습니다. 이 방법에는 장단점이 있으며 사용 시나리오도 있습니다. 오늘날은 또 다른 방법입니다. 로그를 기록하는 파일 롤링 방법입니다. 물론 이 롤링 메커니즘은 이전 로깅 방법에 추가될 수도 있습니다.
로그 스크롤 방법
롤링 로그는 이름에서 알 수 있듯이 일련의 로그 파일을 사용하여 모듈의 로그를 기록합니다. 동일한 모듈의 파일 수는 최대 maxNum으로 제한되며 크기도 최대 maxSize로 제한됩니다. 파일 이름에는 testlog.log, testlog_1.log, testlog_2.log,,,,,와 같은 특정 명명 방법이 있습니다. 여기서 testlog.log는 testlog.log 파일 크기에 도달할 때 사용되는 로그 파일입니다. maxSize 제한을 초과하면 로그 파일이 다음과 같이 역방향으로 롤백됩니다.
testlog_2.log -> testlog_3.log
testlog_1.log -> testlog_2.log
testlog.log -> testlog_1.log
testlog.log #0kb
로그 파일 수가 maxNum 제한에 도달하면 제거 메커니즘이 시작되고 가장 오래된 로그가 삭제됩니다. 예를 들어 maxNum이 10으로 설정된 경우 testlog.log를 포함하여 최대 10개의 파일이 있습니다. 이때 testlog_9.log가 존재하면 testlog_8.log부터 롤링을 시작하여 testlog_9.log를 덮어쓰게 됩니다. 이렇게 하면 정상적인 로그 기록이 이루어지며 대용량 로그 파일이 나타나지 않아 로그 시스템이 정상적으로 작동됩니다.
코드 구현
<?php final class LOGS { private $level; private $maxFileNum; private $maxFileSize; private $logPath; private $file; //日志的级别DEBUG,MSG,ERR const LOGS_DEBUG = 0; const LOGS_MSG = 1; const LOGS_ERR = 2; private static $instance = null; private function __construct(){} public static function getInstance() { if(self::$instance == null) { self::$instance = new self(); } return self::$instance; } /** * @Desc 初始化 * @Param $level int 记录级别 * @Param $maxNum int 最大日志文件数目 * @Param $maxSize int 最大日志文件大小 * @Param $logPath string 日志文件保存路径 * @Param $file string 日志文件名称前缀 * @Return boolean */ public function init($level, $maxNum, $maxSize, $logPath, $file) { $level = intval($level); $maxNum = intval($maxNum); $maxSize = intval($maxSize); !is_dir($logPath) && mkdir($logPath, 0777, true); if(!in_array($level, array(self::LOGS_DEBUG, self::LOGS_MSG, self::LOGS_ERR)) || $maxNum <= 0 || $maxSize <= 0 || !is_dir($logPath)) { return false; } $this->level = $level; $this->maxFileNum = $maxNum; $this->maxFileSize = $maxSize; $this->logPath = $logPath; $this->file = $file; return true; } /** * @Desc 获取格式化时间串 */ public function formatTime() { $ustime = explode ( " ", microtime () ); return "[" . date('Y-m-d H:i:s', time()) .".". ($ustime[0] * 1000) . "]"; } /** * @Desc 滚动方式记录日志文件 */ public function log($str) { $path = $this->logPath.DIRECTORY_SEPARATOR.$this->file.".log"; clearstatcache(); if(file_exists($path)) { if(filesize($path) >= $this->maxFileSize) { $index = 1; //获取最大的滚动日志数目 for(;$index < $this->maxFileNum; $index++) { if(!file_exists($this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log")) { break; } } //已经存在maxFileNum个日志文件了 if($index == $this->maxFileNum) { $index--; } //滚动日志 for(;$index > 1; $index--) { $new = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log"; $old = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".($index - 1).".log"; rename($old, $new); } $newFile = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_1.log"; rename($path, $newFile); } } $fp = fopen($path, "a+b"); fwrite($fp, $str, strlen($str)); fclose($fp); return true; } /** * @Desc 记录调试信息 * @Param string 日志信息 * @Param string 日志所在文件 * @Param string 日志所在行 */ public function debug($msg, $file, $line) { if($this->level <= self::LOGS_DEBUG) { $this->log($this->formatTime()."[{$file}:{$line}]DEBUG: ${msg}\n"); } } /** * @Desc 记录信息 * @Param string 日志信息 * @Param string 日志所在文件 * @Param string 日志所在行 */ public function msg($msg, $file, $line) { if($this->level <= self::LOGS_MSG) { $this->log($this->formatTime()."[{$file}:{$line}]MSG: ${msg}\n"); } } /** * @Desc 记录错误信息 * @Param string 日志信息 * @Param string 日志所在文件 * @Param string 日志所在行 */ public function err($msg, $file, $line) { if($this->level <= self::LOGS_ERR) { $this->log($this->formatTime()."[{$file}:{$line}]ERR: ${msg}\n"); } } }
예시 보기
#예제에서는 로깅 레벨을 msg(지금은 디버그 정보가 기록되지 않음)로 설정하고, 로그 파일 개수는 5개, 크기는 200바이트(테스트하기에 편리함), 파일 이름은 테스트로그입니다
$logs = LOGS::getInstance(); $logs->init(1, 5, 200, "./", 'testlog'); $logs->msg("YRT", __FILE__, __LINE__); $logs->debug("YRT", __FILE__, __LINE__);
이 예제를 계속 실행하면 코드가 위치한 폴더에 다음과 같이 5개의 파일이 생성됩니다.
testlog_4.log testlog_3.log testlog_2.log testlog_1.log testlog.log #最新的日志在这个文件中
위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP에서 데이터베이스 작업은 매우 쉽습니다. 이번 장에서는 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 이해하겠습니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP에 로그인하는 것은 매우 쉬운 작업입니다. 한 가지 기능만 사용하면 됩니다. cronjob과 같은 백그라운드 프로세스에 대해 오류, 예외, 사용자 활동, 사용자가 취한 조치를 기록할 수 있습니다. CakePHP에 데이터를 기록하는 것은 쉽습니다. log() 함수는 다음과 같습니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
