Implement log rotation

master
teknomunk 11 months ago
parent fc604be2ad
commit 35a0cd7b59

@ -23,6 +23,8 @@
#include <errno.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <signal.h>
struct process
{
@ -104,16 +106,21 @@ int process_run_section( int id )
return EXIT_FAILURE;
}
static void redirect_io( int section )
static const char* logfile_for_section( int section )
{
const char* filename = NULL;
switch( section ) {
case 0: filename = "data/logs/webserver.log"; break;
case 1: filename = "data/logs/inbox.log"; break;
case 2: filename = "data/logs/outbox.log"; break;
case 5: filename = "data/logs/fetch.log"; break;
case 6: filename = "data/logs/tor.log"; break;
case 0: return "data/logs/webserver.log";
case 1: return "data/logs/inbox.log";
case 2: return "data/logs/outbox.log";
case 5: return "data/logs/fetch.log";
case 6: return "data/logs/tor.log";
}
return NULL;
}
static void redirect_io( int section )
{
const char* filename = logfile_for_section(section);
if( !filename ) { return; }
@ -161,6 +168,39 @@ void process_stop()
{
}
static bool rotate_log( int section )
{
const char* logfile = logfile_for_section(section);
if(!logfile) { return false; }
struct stat s;
if( -1 == stat( logfile, &s ) ) { return false; }
if( s.st_size < 50000000 ) { return false; }
char buffer1[512];
char buffer2[512];
snprintf( buffer1,sizeof(buffer1), "%s.%d", logfile, 5 );
unlink( buffer1 );
snprintf( buffer2,sizeof(buffer2), "%s.%d", logfile, 4 );
rename( buffer2, buffer1 );
snprintf( buffer1,sizeof(buffer1), "%s.%d", logfile, 3 );
rename( buffer1, buffer2 );
snprintf( buffer1,sizeof(buffer2), "%s.%d", logfile, 2 );
rename( buffer2, buffer1 );
snprintf( buffer1,sizeof(buffer1), "%s.%d", logfile, 1 );
rename( buffer1, buffer2 );
rename( logfile, buffer1 );
return true;
}
void process_wait_for_finished()
{
while( !terminate ) {
@ -183,6 +223,9 @@ void process_wait_for_finished()
printf( "Restarting...\n" );
process_start_section( section );
}
} else if( rotate_log( child->section ) ) {
// Interrupt child process (Ctrl+C) to force restart with new log file
kill( child->pid, SIGINT );
}
}
}

Loading…
Cancel
Save