PHP ローリング log_PHP チュートリアルのコード実装

WBOY
リリース: 2016-07-13 09:51:15
オリジナル
869 人が閲覧しました

PHPローリングログのコード実装

PHPローリングログライブラリ

PHP のログを記録する方法として、年と月ごとにフォルダーを分割し、日ごとにファイルを分割する方法を見つけました。この方法には利点と欠点があり、その使用シナリオについて説明します。今日は別のロギング方法です。ファイルローリング方式はログを記録します。もちろん、このローリングメカニズムは以前のロギング方式に追加することもできます。

ログをスクロールさせる方法

ローリング ログは、名前が示すように、一連のログ ファイルを使用してモジュールのログを記録します。同じモジュール内のファイル数は maxNum までに制限され、サイズも maxSize バイトまでに制限されます。ファイル名には、testlog .log、testlog_1.log、testlog_2.log、、、、、などの特定の命名方法があり、testlog.log は、testlog.log ファイルのサイズに達したときの使用中のログ ファイルです。 maxSize を制限すると、以下に示すように、ログ ファイルは逆方向にロールされます:

コードは次のとおりです:


テストログ_2.ログ -> テストログ_3.ログ
; テストログ_1.ログ -> テストログ_2.ログ
; testlog.log -> testlog_1.log
テストログ.ログ #0kb

ログ ファイルの数が制限 maxNum に達すると、削除メカニズムが開始され、最も古いログが削除されます。たとえば、maxNum が 10 に設定されている場合、この時点で testlog.log を含む最大 10 個のファイルが存在します。スクロール時に testlog_9.log が存在する場合、testlog_8.log からローリングが開始され、testlog_9.log が上書きされます。これにより、ログ システムが正常に動作し、非常に大きなログ ファイルが表示されなくなります。

コードの実装

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

最終クラスのログ{

プライベート $レベル;

プライベート $maxFileNum;

プライベート $maxFileSize;

プライベート $logPath;

プライベート $ファイル;

//日志の级别DEBUG、MSG、ERR

const LOGS_DEBUG = 0;

const LOGS_MSG = 1;

const LOGS_ERR = 2;

プライベート静的 $instance = null;

プライベート関数 __construct(){}

パブリック静的関数 getInstance()

{

if(self::$instance == null)

{

self::$instance = 新しい self();

}

self::$instance を返す;

}

/**

* @Desc 初期化

* @Param $level int レコードレベル

* @Param $maxNum int ログファイルの最大数

* @Param $maxSize int 最大ログファイルサイズ

* @Param $logPath 文字列ログファイルの保存パス

* @Param $file 文字列ログファイル名のプレフィックス

* @Return boolean

*/

パブリック関数 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 ))

{

false を返す;

}

$this->level = $level;

$this->maxFileNum = $maxNum;

$this->maxFileSize = $maxSize;

$this->logPath = $logPath;

$this->file = $file;

true を返す;

}

/**

* @Desc フォーマットされた時刻文字列を取得します

*/

パブリック関数 formatTime()

{

$ustime = 爆発 ( " ", microtime () );

「[」を返します。 date('Y-m-d H:i:s', time()) ."."。 ($ustime[0] * 1000) 。 "]";

}

/**

* @Desc ローリングモードでログファイルを記録します

*/

公開関数ログ($str)

{

$path = $this->logPath.DIRECTORY_SEPARATOR.$this->file.".log";

clearstatcache();

if(file_exists($path))

{

if(ファイルサイズ($path) >= $this->maxFileSize)

{

$インデックス = 1;

//获取最大的滚動日志数目

for(;$index maxFileNum; $index++)

{

if(!file_exists($this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log"))

{

休憩;

}

}

//已经存在maxFileNum个日志文件了

if($index == $this->maxFileNum)

{

$インデックス--;

}

//滚アニメーション日志

for(;$index > 1; $index--)

{

$new = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log";

$old = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".($index - 1).".log";

名前を変更($old, $new);

}

$newFile = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_1.log";

名前変更($path, $newFile);

}

}

$fp = fopen($path, "a+b");

fwrite($fp, $str, strlen($str));

fclose($fp);

true を返す;

}

/**

* @Desc はデバッグ情報を記録します

* @Param文字列のログ情報

* @Param string ログが配置されるファイル

* @Param string ログが配置されている行

*/

パブリック関数デバッグ($msg、$file、$line)

{

if($this->レベル <= self::LOGS_DEBUG)

{

$this->log($this->formatTime()."[{$file}:{$line}]DEBUG: ${msg}n");

}

}

/**

* @Descレコード情報

* @Param文字列のログ情報

* @Param string ログが配置されるファイル

* @Param string ログが配置されている行

*/

パブリック関数 msg($msg, $file, $line)

{

if($this->レベル<= self::LOGS_MSG)

{

$this->log($this->formatTime()."[{$file}:{$line}]MSG: ${msg}n");

}

}

/**

* @Desc ログエラーメッセージ

* @Param文字列のログ情報

* @Param string ログが配置されるファイル

* @Param string ログが配置されている行

*/

パブリック関数エラー($msg, $file, $line)

{

if($this->レベル<= self::LOGS_ERR)

{

$this->log($this->formatTime()."[{$file}:{$line}]ERR: ${msg}n");

}

}

}

例を見る

#例中の設置记录级别はmsg(今回はデバッグ情報はありません)、日志文件数は5、大小は200字节(测试方便)、文件名はtestlog

1

2

3

4

5

$logs = LOGS::getInstance();

$logs->init(1, 5, 200, "./", 'testlog');

$logs->msg("YRT", __FILE__, __LINE__);

$logs->debug("YRT", __FILE__, __LINE__);

当我们停まらないこの例の時、会在代码所在文件夹下生成5個文件就像下这样:

1

2

3

4

5

testlog_4.log

testlog_3.log

testlog_2.log

testlog_1.log

testlog.log #最新の日志はこの文中にあります

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1014276.html技術記事 PHP滚動日志の代番号实现 PHP滚動日志类库 PHP记录日志、私以前に接触した有按照年月分文件、その後按照日分文件の日志记录方式、この方式...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート