Skip to content

Commit 13732de

Browse files
committed
feat: log zip by time
1 parent 35ecef2 commit 13732de

File tree

5 files changed

+151
-4
lines changed

5 files changed

+151
-4
lines changed

Log.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use yii\caching\FileDependency;
88
use yii\helpers\FileHelper;
99
use yii\helpers\Inflector;
10+
use yii\helpers\StringHelper;
1011

1112
/**
1213
* Class Log
@@ -17,6 +18,7 @@
1718
* @property string $slug
1819
* @property string $fileName
1920
* @property boolean $isExist
21+
* @property boolean $isZip
2022
* @property integer|null $size
2123
* @property integer|null $updatedAt
2224
* @property string $downloadName
@@ -92,6 +94,14 @@ public function getIsExist()
9294
return file_exists($this->getFileName());
9395
}
9496

97+
/**
98+
* @return bool
99+
*/
100+
public function getIsZip()
101+
{
102+
return $this->getIsExist() ? StringHelper::endsWith($this->getFileName(), '.zip') : false;
103+
}
104+
95105
/**
96106
* @return integer|null
97107
*/

controllers/DefaultController.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
namespace kriss\logReader\controllers;
44

5-
use kriss\logReader\Module;
65
use kriss\logReader\Log;
6+
use kriss\logReader\models\ZipLogForm;
7+
use kriss\logReader\Module;
78
use Yii;
89
use yii\data\ArrayDataProvider;
910
use yii\helpers\ArrayHelper;
@@ -83,6 +84,24 @@ public function actionHistory($slug)
8384
]);
8485
}
8586

87+
public function actionZip($slug)
88+
{
89+
$log = $this->find($slug, null);
90+
$model = new ZipLogForm(['log' => $log]);
91+
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
92+
$result = $model->zip();
93+
if ($result !== false) {
94+
Yii::$app->session->setFlash('success', 'zip success');
95+
return $this->redirect(Url::previous());
96+
} else {
97+
Yii::$app->session->setFlash('error', 'zip error: ', implode('<br>', $model->getFirstErrors()));
98+
}
99+
}
100+
return $this->render('zip', [
101+
'model' => $model,
102+
]);
103+
}
104+
86105
public function actionDelete($slug, $stamp = null, $since = null)
87106
{
88107
$log = $this->find($slug, $stamp);

models/ZipLogForm.php

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
3+
namespace kriss\logReader\models;
4+
5+
use kriss\logReader\Log;
6+
use yii\base\Model;
7+
use ZipArchive;
8+
9+
class ZipLogForm extends Model
10+
{
11+
/**
12+
* @var Log
13+
*/
14+
public $log;
15+
16+
public $start;
17+
18+
public $end;
19+
20+
public $deleteAfterZip = 0;
21+
22+
public function rules()
23+
{
24+
return [
25+
[['start', 'end'], 'string'],
26+
[['deleteAfterZip'], 'boolean'],
27+
];
28+
}
29+
30+
public function attributeLabels()
31+
{
32+
return [
33+
'start' => 'Start Date',
34+
'end' => 'End Date',
35+
'deleteAfterZip' => 'Is Delete After Zip',
36+
];
37+
}
38+
39+
public function init()
40+
{
41+
parent::init();
42+
$this->start = date('Y-m-01');
43+
$this->end = date('Y-m-d');
44+
}
45+
46+
public function zip()
47+
{
48+
$log = $this->log;
49+
$startStamp = date('Ymd', strtotime($this->start));
50+
$endStamp = date('Ymd', strtotime($this->end));
51+
$logs = [];
52+
foreach (glob(Log::extractFileName($log->alias, '*')) as $fileName) {
53+
$logEnd = Log::extractFileStamp($log->alias, $fileName);
54+
// 被自动切割的log文件可能为:jd.log.20181109.1
55+
$arr = explode('.', $logEnd);
56+
if ($arr) {
57+
$logEnd = $arr[0];
58+
}
59+
$stamp = date('Ymd', strtotime($logEnd));
60+
if ($stamp >= $startStamp && $stamp <= $endStamp) {
61+
$log = new Log($log->name, $log->alias, Log::extractFileStamp($log->alias, $fileName));
62+
if (!$log->isZip) {
63+
$logs[] = $log;
64+
}
65+
}
66+
}
67+
$current = date('YmdHis');
68+
$fileName = Log::extractFileName($log->alias, "{$startStamp}-{$endStamp}-{$current}.zip");
69+
$zip = new ZipArchive();
70+
if ($zip->open($fileName, ZipArchive::CREATE) !== true) {
71+
$this->addError('log', 'cannot open zipFile, do you have permission?');
72+
return false;
73+
}
74+
foreach ($logs as $log) {
75+
$zip->addFile($log->fileName, basename($log->fileName));
76+
}
77+
$zip->close();
78+
79+
// 删除已打包的文件
80+
if ($this->deleteAfterZip) {
81+
foreach ($logs as $log) {
82+
unlink($log->fileName);
83+
}
84+
}
85+
86+
return true;
87+
}
88+
}

views/default/history.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
* @var integer $fullSize
77
*/
88

9+
use kriss\logReader\Log;
910
use yii\grid\GridView;
1011
use yii\helpers\Html;
11-
use kriss\logReader\Log;
1212
use yii\i18n\Formatter;
1313

1414
$this->title = $name;
@@ -17,12 +17,16 @@
1717

1818
$formatter = new Formatter();
1919
$fullSizeFormat = $formatter->format($fullSize, 'shortSize');
20+
$zipBtn = '';
21+
if ($fullSize > 1) {
22+
$zipBtn = Html::a('zip', ['zip', 'slug' => Yii::$app->request->get('slug')], ['class' => 'btn btn-success btn-xs']);
23+
}
2024
?>
2125
<div class="log-reader-history">
2226
<?= GridView::widget([
2327
'tableOptions' => ['class' => 'table'],
2428
'dataProvider' => $dataProvider,
25-
'caption' => "full size: {$fullSizeFormat}",
29+
'caption' => "full size: {$fullSizeFormat}. $zipBtn",
2630
'columns' => [
2731
[
2832
'attribute' => 'fileName',
@@ -51,7 +55,10 @@
5155
return [$action, 'slug' => $log->slug, 'stamp' => $log->stamp];
5256
},
5357
'buttons' => [
54-
'view' => function ($url) {
58+
'view' => function ($url, Log $log) {
59+
if ($log->isZip) {
60+
return '';
61+
}
5562
return Html::a('View', $url, [
5663
'class' => 'btn btn-xs btn-primary',
5764
'target' => '_blank',

views/default/zip.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* @var $this \yii\web\View
4+
* @var $model \kriss\logReader\models\ZipLogForm
5+
*/
6+
7+
use yii\helpers\Html;
8+
use yii\widgets\ActiveForm;
9+
10+
$this->title = $model->log->name . ' zip';
11+
$this->params['breadcrumbs'][] = ['label' => 'Logs', 'url' => ['index']];
12+
$this->params['breadcrumbs'][] = ['label' => $model->log->name, 'url' => ['history', 'slug' => $model->log->slug]];
13+
$this->params['breadcrumbs'][] = $this->title;
14+
15+
$form = ActiveForm::begin();
16+
17+
echo $form->field($model, 'start')->input('date');
18+
echo $form->field($model, 'end')->input('date');
19+
echo $form->field($model, 'deleteAfterZip')->dropDownList([0 => 'keep', 1 => 'delete']);
20+
21+
echo Html::submitInput('Submit', ['class' => 'btn btn-primary']);
22+
23+
$form->end();

0 commit comments

Comments
 (0)