@@ -56,7 +56,7 @@ async function getRetentionDays(orgId: string): Promise<number> {
5656 return response . data . data . days ;
5757 } catch ( error ) {
5858 if ( axios . isAxiosError ( error ) ) {
59- logger . error ( "Error fetching retention days:" , {
59+ logger . error ( "logRequestAudit: Error fetching retention days:" , {
6060 message : error . message ,
6161 code : error . code ,
6262 status : error . response ?. status ,
@@ -65,20 +65,49 @@ async function getRetentionDays(orgId: string): Promise<number> {
6565 method : error . config ?. method
6666 } ) ;
6767 } else {
68- logger . error ( "Error fetching retention days:" , error ) ;
68+ logger . error ( "logRequestAudit: Error fetching retention days:" , error ) ;
6969 }
7070 return 0 ;
7171 }
7272}
7373
74- async function sendQueuedLogs ( ) {
75- await axios . post (
76- `${ config . getRawConfig ( ) . managed ?. endpoint } /api/v1/hybrid/logs/batch` ,
77- {
78- logs : logQueue
79- } ,
80- await tokenManager . getAuthHeader ( )
81- ) ;
74+ async function sendQueuedLogs ( ) : Promise < boolean > {
75+ try {
76+ const endpoint = config . getRawConfig ( ) . managed ?. endpoint ;
77+ if ( ! endpoint ) {
78+ logger . warn ( "Cannot send logs: managed endpoint not configured" ) ;
79+ return false ;
80+ }
81+
82+ // create a copy of the log queue to process
83+ const logsToProcess = [ ...logQueue ] ;
84+ // Process logs in batches of 100
85+ for ( let i = 0 ; i < logsToProcess . length ; i += 100 ) {
86+ const batch = logsToProcess . slice ( i , i + 100 ) ;
87+ await axios . post (
88+ `${ endpoint } /api/v1/hybrid/logs/batch` ,
89+ {
90+ logs : batch
91+ } ,
92+ await tokenManager . getAuthHeader ( )
93+ ) ;
94+ }
95+ } catch ( error ) {
96+ if ( axios . isAxiosError ( error ) ) {
97+ logger . error ( "logRequestAudit: Error sending queued logs:" , {
98+ message : error . message ,
99+ code : error . code ,
100+ status : error . response ?. status ,
101+ statusText : error . response ?. statusText ,
102+ url : error . config ?. url ,
103+ method : error . config ?. method
104+ } ) ;
105+ } else {
106+ logger . error ( "logRequestAudit: Error sending queued logs:" , error ) ;
107+ }
108+ return false ;
109+ }
110+ return true ;
82111}
83112
84113export async function logRequestAudit (
@@ -190,32 +219,27 @@ export async function logRequestAudit(
190219 tls : body . tls
191220 } ;
192221
222+ // if the queue is full dont push new logs
223+ if ( logQueue . length >= 10000 ) {
224+ logger . warn (
225+ "logRequestAudit: Log queue full, dropping log entry to prevent memory issues"
226+ ) ;
227+ return ;
228+ }
229+
193230 logQueue . push ( payload ) ;
194231 } catch ( error ) {
195232 logQueue = [ ] ; // clear queue on error to prevent buildup
196- if ( axios . isAxiosError ( error ) ) {
197- logger . error ( "Error fetching retention days:" , {
198- message : error . message ,
199- code : error . code ,
200- status : error . response ?. status ,
201- statusText : error . response ?. statusText ,
202- url : error . config ?. url ,
203- method : error . config ?. method
204- } ) ;
205- } else {
206- logger . error ( "Error fetching config in verify session:" , error ) ;
207- }
233+ logger . error ( "logRequestAudit: Error fetching config in verify session:" , error ) ;
208234 }
209235}
210236
211237// set a periodic flush of the log queue every 30 seconds
212238setInterval ( async ( ) => {
239+ logger . debug ( `logRequestAudit: Attempting to upload log queue of size ${ logQueue . length } ` ) ;
213240 if ( logQueue . length > 0 ) {
214- try {
215- await sendQueuedLogs ( ) ;
241+ if ( await sendQueuedLogs ( ) ) {
216242 logQueue = [ ] ;
217- } catch ( error ) {
218- logger . error ( "Error sending queued logs:" , error ) ;
219243 }
220244 }
221245} , 30000 ) ;
0 commit comments