13
13
**/
14
14
15
15
use Carbon \Carbon ;
16
- use Carbon \CarbonPeriod ;
17
16
use Exception ;
18
17
use Illuminate \Console \Command ;
18
+ use Illuminate \Support \Facades \Config ;
19
19
use Illuminate \Support \Facades \Log ;
20
20
use Illuminate \Support \Facades \Storage ;
21
21
@@ -47,8 +47,21 @@ final class LogsUploader extends Command
47
47
*/
48
48
protected $ description = 'Upload local logs to external storage ' ;
49
49
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 " ;
52
65
}
53
66
54
67
/**
@@ -60,35 +73,34 @@ private function formatFileName(string $date_str) {
60
73
public function handle ()
61
74
{
62
75
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 ' ) );
67
80
68
81
$ 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 );
86
83
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 ;
90
92
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
+ }
92
104
} catch (Exception $ ex ) {
93
105
Log::error ($ ex );
94
106
}
0 commit comments