Skip to content

Commit eb123e5

Browse files
committed
logs upload command
Signed-off-by: romanetar <[email protected]>
1 parent 652ead5 commit eb123e5

File tree

4 files changed

+54
-29
lines changed

4 files changed

+54
-29
lines changed

.env.example

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,15 @@ AWS_ENDPOINT=
185185
REGISTRATION_ORDER_PUBLIC_EDIT_TTL=10
186186
DEFAULT_PROFILE_IMAGE=
187187
SCHEDULE_USE_REALTIME_UPDATE=1
188-
SAMSUNG_REGISTRATION_API_ENDPOINT=
188+
SAMSUNG_REGISTRATION_API_ENDPOINT=
189+
190+
NODE_NBR=1
191+
192+
# Remote logs storage
193+
REMOTE_LOGS_STORAGE_NAME='logs_s3'
194+
195+
AWS_ACCESS_KEY_ID_LOGS=
196+
AWS_SECRET_ACCESS_KEY_LOGS=
197+
AWS_DEFAULT_REGION_LOGS=
198+
AWS_ENDPOINT_LOGS=
199+
AWS_BUCKET_LOGS=

app/Console/Commands/LogsUploader.php

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
**/
1414

1515
use Carbon\Carbon;
16-
use Carbon\CarbonPeriod;
1716
use Exception;
1817
use Illuminate\Console\Command;
18+
use Illuminate\Support\Facades\Config;
1919
use Illuminate\Support\Facades\Log;
2020
use Illuminate\Support\Facades\Storage;
2121

@@ -47,8 +47,21 @@ final class LogsUploader extends Command
4747
*/
4848
protected $description = 'Upload local logs to external storage';
4949

50-
private function formatFileName(string $date_str) {
51-
return "laravel-{$date_str}.log";
50+
/**
51+
* Returns the log file name based on the date parameter.
52+
*/
53+
private function formatFileName(Carbon $date): string
54+
{
55+
$date_format = 'Y-m-d';
56+
return "laravel-{$date->format($date_format)}.log";
57+
}
58+
59+
/**
60+
* Returns the remote log file path based on the local name and the node number.
61+
*/
62+
private function formatRemoteLogFilePath(string $local_name, string $node_number): string
63+
{
64+
return "{$node_number}/{$local_name}.gz";
5265
}
5366

5467
/**
@@ -60,35 +73,34 @@ private function formatFileName(string $date_str) {
6073
public function handle()
6174
{
6275
try {
63-
$date_format = 'Y-m-d';
64-
$ui_file_name = 'uploads_info';
65-
$pending_uploads = [];
66-
$yesterday = Carbon::yesterday('UTC');
76+
$node_number = Config::get("server.node_number");
77+
$remote_storage_name = Config::get("log.remote_storage_name");
78+
79+
$today_log_file_name = $this->formatFileName(Carbon::today('UTC'));
6780

6881
$logs_fs = Storage::disk('logs');
69-
if ($logs_fs->exists($ui_file_name)) {
70-
$uploads_info = explode(PHP_EOL, $logs_fs->get($ui_file_name));
71-
sort($uploads_info);
72-
$first_date_str = $uploads_info[0];
73-
$date_from = Carbon::createFromFormat($date_format, $first_date_str);
74-
//get upload gaps
75-
$period = CarbonPeriod::create($date_from, $yesterday);
76-
77-
foreach ($period as $date) {
78-
$date_str = $date->format($date_format);
79-
if (!in_array($date_str, $uploads_info)) {
80-
$pending_uploads[] = $this->formatFileName($date_str);
81-
}
82-
}
83-
} else {
84-
$pending_uploads[] = $this->formatFileName($yesterday->format($date_format));
85-
}
82+
$remote_logs_fs = Storage::disk($remote_storage_name);
8683

87-
foreach ($pending_uploads as $pending_upload) {
88-
$logs_fs->append($ui_file_name, $pending_upload);
89-
}
84+
$local_log_files = array_filter($logs_fs->allFiles(), function ($file_name) use ($today_log_file_name) {
85+
return $file_name != $today_log_file_name && str_ends_with($file_name, '.log');
86+
});
87+
sort($local_log_files);
88+
89+
foreach ($local_log_files as $local_log_file) {
90+
$content = $logs_fs->get($local_log_file);
91+
if (empty($content)) continue;
9092

91-
//Storage::disk('logs_s3')->put($log_name, $content);
93+
$remote_file_path = $this->formatRemoteLogFilePath($local_log_file, $node_number);
94+
if ($remote_logs_fs->exists($remote_file_path)) continue;
95+
96+
$deflateContext = deflate_init(ZLIB_ENCODING_GZIP);
97+
$compressed = deflate_add($deflateContext, $content, ZLIB_FINISH);
98+
99+
$remote_logs_fs->put($remote_file_path, $compressed);
100+
101+
$logs_fs->put("{$local_log_file}.gz", $compressed);
102+
$logs_fs->delete($local_log_file);
103+
}
92104
} catch (Exception $ex) {
93105
Log::error($ex);
94106
}

config/log.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@
1111
'level' => env('LOG_LEVEL', 'error'),
1212
'email_level' => env('LOG_EMAIL_LEVEL', 'error'),
1313
'email_subject' => env('LOG_EMAIL_SUBJECT', ''),
14+
'remote_storage_name' => env('REMOTE_LOGS_STORAGE_NAME', 's3'),
1415
];

config/server.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@
2626
'ss_encrypt_cypher' => env('SS_ENCRYPT_CYPHER', ''),
2727
'google_geocoding_api_key' => env('GOOGLE_GEO_CODING_API_KEY', ''),
2828
'samsung_registration_api_endpoint' => env('SAMSUNG_REGISTRATION_API_ENDPOINT', ''),
29+
'node_number' => env('NODE_NBR', 1),
2930
);

0 commit comments

Comments
 (0)