use PostgresNode;
use TestLib;
-use Test::More;
+use Test::More tests => 4;
use Time::HiRes qw(usleep);
-if ($windows_os)
-{
- plan skip_all => 'logrotate test not supported on Windows';
- exit;
-}
-else
-{
- plan tests => 1;
-}
-
-
-my $tempdir = TestLib::tempdir;
-
+# Set up node with logging collector
my $node = get_new_node('primary');
-$node->init(allows_streaming => 1);
+$node->init();
$node->append_conf(
'postgresql.conf', qq(
logging_collector = on
-log_directory = 'log'
-log_filename = 'postgresql.log'
+lc_messages = 'C'
));
$node->start();
-# Rename log file and rotate log. Then log file should appear again.
+# Verify that log output gets to the file
-my $logfile = $node->data_dir . '/log/postgresql.log';
-my $old_logfile = $node->data_dir . '/log/postgresql.old';
-rename($logfile, $old_logfile);
+$node->psql('postgres', 'SELECT 1/0');
-$node->logrotate();
+my $current_logfiles = slurp_file($node->data_dir . '/current_logfiles');
+
+note "current_logfiles = $current_logfiles";
+
+like($current_logfiles, qr|^stderr log/postgresql-.*log$|,
+ 'current_logfiles is sane');
+
+my $lfname = $current_logfiles;
+$lfname =~ s/^stderr //;
+chomp $lfname;
-# pg_ctl logrotate doesn't wait until rotation request being completed. So
-# we have to wait some time until log file appears.
-my $attempts = 0;
+# might need to retry if logging collector process is slow...
my $max_attempts = 180 * 10;
-while (not -e $logfile and $attempts < $max_attempts)
+
+my $first_logfile;
+for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
+{
+ $first_logfile = slurp_file($node->data_dir . '/' . $lfname);
+ last if $first_logfile =~ m/division by zero/;
+ usleep(100_000);
+}
+
+like($first_logfile, qr/division by zero/,
+ 'found expected log file content');
+
+# Sleep 2 seconds and ask for log rotation; this should result in
+# output into a different log file name.
+sleep(2);
+$node->logrotate();
+
+# pg_ctl logrotate doesn't wait for rotation request to be completed.
+# Allow a bit of time for it to happen.
+my $new_current_logfiles;
+for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
+{
+ $new_current_logfiles = slurp_file($node->data_dir . '/current_logfiles');
+ last if $new_current_logfiles ne $current_logfiles;
+ usleep(100_000);
+}
+
+note "now current_logfiles = $new_current_logfiles";
+
+like($new_current_logfiles, qr|^stderr log/postgresql-.*log$|,
+ 'new current_logfiles is sane');
+
+$lfname = $new_current_logfiles;
+$lfname =~ s/^stderr //;
+chomp $lfname;
+
+# Verify that log output gets to this file, too
+
+$node->psql('postgres', 'fee fi fo fum');
+
+my $second_logfile;
+for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
{
+ $second_logfile = slurp_file($node->data_dir . '/' . $lfname);
+ last if $second_logfile =~ m/syntax error/;
usleep(100_000);
- $attempts++;
}
-ok(-e $logfile, "log file exists");
+like($second_logfile, qr/syntax error/,
+ 'found expected log file content in new log file');
$node->stop();