1#testing init_and_watch 2 3BEGIN { 4 if($ENV{INTERNAL_DEBUG}) { 5 require Log::Log4perl::InternalDebug; 6 Log::Log4perl::InternalDebug->enable(); 7 } 8} 9 10use Test::More; 11 12use warnings; 13use strict; 14 15use Log::Log4perl; 16use File::Spec; 17 18sub trunc { 19 open FILE, ">$_[0]" or die "Cannot open $_[0]"; 20 close FILE; 21} 22 23sub is_like_windows { 24 if( $^O eq "MSWin32" or 25 $^O eq "cygwin" ) { 26 return 1; 27 } 28 29 return 0; 30} 31 32BEGIN { 33 if ($] < 5.006) { 34 plan skip_all => "Only with perl >= 5.006"; 35 } else { 36 plan tests => 34; 37 } 38} 39 40my $WORK_DIR = "tmp"; 41if(-d "t") { 42 $WORK_DIR = File::Spec->catfile(qw(t tmp)); 43} 44 45unless (-e "$WORK_DIR"){ 46 mkdir("$WORK_DIR", 0755) || die "can't create $WORK_DIR ($!)"; 47} 48 49my $testfile = File::Spec->catfile($WORK_DIR, "test17.log"); 50my $testfile2 = File::Spec->catfile($WORK_DIR, "test17b.log"); 51my $testconf = File::Spec->catfile($WORK_DIR, "test17.conf"); 52 53END { 54 unlink $testfile if (-e $testfile); 55 unlink $testfile2 if (-e $testfile2); 56 unlink $testconf if (-e $testconf); 57 rmdir $WORK_DIR; 58} 59 60trunc($testfile); 61trunc($testconf); 62 63my $conf1 = <<EOL; 64log4j.category.animal.dog = INFO, myAppender 65 66log4j.appender.myAppender = Log::Log4perl::Appender::File 67log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout 68log4j.appender.myAppender.filename = $testfile 69log4j.appender.myAppender.mode = append 70 71EOL 72open (CONF, ">$testconf") || die "can't open $testconf $!"; 73print CONF $conf1; 74close CONF; 75 76Log::Log4perl->init_and_watch($testconf, 1); 77 78my $logger = Log::Log4perl::get_logger('animal.dog'); 79 80$logger->debug('debug message'); 81$logger->info('info message'); 82 83ok(! $logger->is_debug(), "is_debug - true"); 84ok( $logger->is_info(), "is_info - true"); 85ok( $logger->is_warn(), "is_warn - true"); 86ok( $logger->is_error(), "is_error - true"); 87ok( $logger->is_fatal(), "is_fatal - true"); 88 89# ********************************************************************* 90# Check if we really dont re-read the conf file if nothing has changed 91# ********************************************************************* 92 93my $how_many_reads = $Log::Log4perl::Config::CONFIG_FILE_READS; 94print "sleeping for 2 secs\n"; 95sleep 2; 96$logger->is_debug(); 97is($how_many_reads, $Log::Log4perl::Config::CONFIG_FILE_READS, 98 "no re-read until config has changed"); 99 100 # Need to sleep for at least a sec, otherwise the watcher 101 # wont check 102print "sleeping for 2 secs\n"; 103sleep 2; 104 105# ********************************************************************* 106# Now, lets check what happens if the config changes 107# ********************************************************************* 108 109my $conf2 = <<EOL; 110log4j.category.animal.dog = DEBUG, myAppender 111 112log4j.appender.myAppender = Log::Log4perl::Appender::File 113log4j.appender.myAppender.layout = org.apache.log4j.PatternLayout 114log4j.appender.myAppender.layout.ConversionPattern=%-5p %c - %m%n 115 116log4j.appender.myAppender.filename = $testfile 117log4j.appender.myAppender.mode = append 118EOL 119 120open (CONF, ">$testconf") || die "can't open $testconf $!"; 121print CONF $conf2; 122close CONF; 123 124$logger = Log::Log4perl::get_logger('animal.dog'); 125 126$logger->debug('2nd debug message'); 127is($Log::Log4perl::Config::CONFIG_FILE_READS, 128 $how_many_reads + 1, 129 "re-read if config has changed, even if no logger has fired"); 130 131$logger->info('2nd info message'); 132print "sleeping for 2 secs\n"; 133sleep 2; 134$logger->info('2nd info message again'); 135 136is($Log::Log4perl::Config::CONFIG_FILE_READS, 137 $how_many_reads + 1, 138 "no re-read unless config has changed"); 139 140open (LOG, $testfile) or die "can't open $testfile $!"; 141my @log = <LOG>; 142close LOG; 143my $log = join('',@log); 144 145is($log, "INFO - info message\nDEBUG animal.dog - 2nd debug message\nINFO animal.dog - 2nd info message\nINFO animal.dog - 2nd info message again\n", "1st init"); 146ok( $logger->is_debug(), "is_debug - false"); 147ok( $logger->is_info(), "is_info - true"); 148ok( $logger->is_warn(), "is_warn - true"); 149ok( $logger->is_error(), "is_error - true"); 150ok( $logger->is_fatal(), "is_fatal - true"); 151 152# *************************************************************** 153# do it 3rd time 154 155print "sleeping for 2 secs\n"; 156sleep 2; 157 158$conf2 = <<EOL; 159log4j.category.animal.dog = INFO, myAppender 160 161log4j.appender.myAppender = Log::Log4perl::Appender::File 162log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout 163log4j.appender.myAppender.filename = $testfile 164log4j.appender.myAppender.mode = append 165EOL 166open (CONF, ">$testconf") || die "can't open $testconf $!"; 167print CONF $conf2; 168close CONF; 169 170$logger = Log::Log4perl::get_logger('animal.dog'); 171 172$logger->debug('2nd debug message'); 173$logger->info('3rd info message'); 174 175ok(! $logger->is_debug(), "is_debug - false"); 176ok( $logger->is_info(), "is_info - true"); 177ok( $logger->is_warn(), "is_warn - true"); 178ok( $logger->is_error(), "is_error - true"); 179ok( $logger->is_fatal(), "is_fatal - true"); 180 181open (LOG, $testfile) or die "can't open $testfile $!"; 182@log = <LOG>; 183close LOG; 184$log = join('',@log); 185 186is($log, "INFO - info message\nDEBUG animal.dog - 2nd debug message\nINFO animal.dog - 2nd info message\nINFO animal.dog - 2nd info message again\nINFO - 3rd info message\n", "after reload"); 187 188SKIP: { 189 skip "Signal handling not supported on Win32", 2 if is_like_windows(); 190 # *************************************************************** 191 # Check the 'recreate' feature 192 193 trunc($testfile); 194 my $conf4 = <<EOL; 195 log4j.category.animal.dog = INFO, myAppender 196 197 log4j.appender.myAppender = Log::Log4perl::Appender::File 198 log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout 199 log4j.appender.myAppender.filename = $testfile 200 log4j.appender.myAppender.recreate = 1 201 log4j.appender.myAppender.recreate_check_interval = 0 202 log4j.appender.myAppender.mode = append 203EOL 204 205 Log::Log4perl->init(\$conf4); 206 207 $logger = Log::Log4perl::get_logger('animal.dog'); 208 $logger->info("test1"); 209 open (LOG, $testfile) or die "can't open $testfile $!"; 210 is(scalar <LOG>, "INFO - test1\n", "Before recreate"); 211 close LOG; 212 213 unlink $testfile or die "Cannot unlink $testfile: $!"; 214 $logger->info("test2"); 215 open (LOG, $testfile) or die "can't open $testfile $!"; 216 is(scalar <LOG>, "INFO - test2\n", "After recreate"); 217 close LOG; 218 219 trunc($testfile); 220 trunc($testconf); 221}; 222 223 224# *************************************************************** 225# Check the 'recreate' feature with signal handling 226 227SKIP: { 228 skip "File recreation not supported on Win32", 9 if is_like_windows(); 229 230 # Use two appenders to confirm that both files are recreated when the 231 # signal is received, rather than just whichever watcher was created 232 # last. 233 234 my $conf5 = <<EOL; 235 log4j.category.animal.dog = INFO, myAppender1 236 log4j.category.animal.cat = INFO, myAppender2 237 238 log4j.appender.myAppender1 = Log::Log4perl::Appender::File 239 log4j.appender.myAppender1.layout = Log::Log4perl::Layout::SimpleLayout 240 log4j.appender.myAppender1.filename = $testfile 241 log4j.appender.myAppender1.recreate = 1 242 log4j.appender.myAppender1.recreate_check_signal = USR1 243 244 log4j.appender.myAppender2 = Log::Log4perl::Appender::File 245 log4j.appender.myAppender2.layout = Log::Log4perl::Layout::SimpleLayout 246 log4j.appender.myAppender2.filename = $testfile2 247 log4j.appender.myAppender2.recreate = 1 248 log4j.appender.myAppender2.recreate_check_signal = USR1 249EOL 250 251 Log::Log4perl->init(\$conf5); 252 253 my $logger = Log::Log4perl::get_logger('animal.dog'); 254 $logger->info("test1"); 255 ok(-f $testfile, "recreate_signal - testfile created"); 256 257 my $logger2 = Log::Log4perl::get_logger('animal.cat'); 258 $logger2->info("test1"); 259 ok(-f $testfile2, "recreate_signal - testfile created"); 260 261 262 unlink $testfile, $testfile2; 263 ok(!-f $testfile, "recreate_signal - testfile deleted"); 264 ok(!-f $testfile2, "recreate_signal - testfile2 deleted"); 265 266 $logger->info("test1"); 267 $logger2->info("test1"); 268 ok(!-f $testfile, "recreate_signal - testfile still missing"); 269 ok(!-f $testfile2, "recreate_signal - testfile2 still missing"); 270 271 ok(kill('USR1', $$), "sending signal"); 272 $logger->info("test1"); 273 $logger2->info("test1"); 274 ok(-f $testfile, "recreate_signal - testfile reinstated"); 275 ok(-f $testfile2, "recreate_signal - testfile2 reinstated"); 276}; 277 278 279SKIP: { 280 skip "Removing busy files not supported on Win32", 1 if is_like_windows(); 281 282 # *************************************************************** 283 # Check the 'recreate' feature with check_interval 284 285 trunc($testfile); 286 my $conf3 = <<EOL; 287 log4j.category.animal.dog = INFO, myAppender 288 289 log4j.appender.myAppender = Log::Log4perl::Appender::File 290 log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout 291 log4j.appender.myAppender.filename = $testfile 292 log4j.appender.myAppender.recreate = 1 293 log4j.appender.myAppender.recreate_check_interval = 1 294 log4j.appender.myAppender.mode = append 295EOL 296 297 # Create logfile 298 Log::Log4perl->init(\$conf3); 299 # ... and immediately remove it 300 unlink $testfile or die "cannot remove file $testfile ($!)"; 301 302 print "sleeping for 2 secs\n"; 303 sleep(2); 304 305 $logger = Log::Log4perl::get_logger('animal.dog'); 306 $logger->info("test1"); 307 open (LOG, $testfile) or die "can't open $testfile $!"; 308 is(scalar <LOG>, "INFO - test1\n", "recreate before first write"); 309 close LOG; 310} 311 312# *************************************************************** 313# Check the 'recreate' feature with check_interval (2nd write) 314 315SKIP: { 316 skip "Signal handling not supported on Win32", 1 if is_like_windows(); 317 trunc($testfile); 318 my $conf3 = <<EOL; 319 log4j.category.animal.dog = INFO, myAppender 320 321 log4j.appender.myAppender = Log::Log4perl::Appender::File 322 log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout 323 log4j.appender.myAppender.filename = $testfile 324 log4j.appender.myAppender.recreate = 1 325 log4j.appender.myAppender.recreate_check_interval = 1 326 log4j.appender.myAppender.mode = append 327EOL 328 329 # Create logfile 330 Log::Log4perl->init(\$conf3); 331 332 # Write to it 333 $logger = Log::Log4perl::get_logger('animal.dog'); 334 $logger->info("test1"); 335 336 # ... remove it (stupid windoze cannot remove an open file) 337 rename $testfile, "$testfile.old"; 338 unlink $testfile; 339 340 print "sleeping for 2 secs\n"; 341 sleep(2); 342 343 # ... write again 344 $logger->info("test2"); 345 346 open (LOG, $testfile) or die "can't open $testfile $!"; 347 is(scalar <LOG>, "INFO - test2\n", "recreate before 2nd write"); 348 close LOG; 349 unlink "$testfile.old"; 350}; 351 352# *************************************************************** 353# Check the 'recreate' feature with moved/recreated file 354 355SKIP: { 356 skip "Moving busy files not supported on Win32", 1 if is_like_windows(); 357 358 trunc($testfile); 359 my $conf3 = <<EOL; 360 log4j.category.animal.dog = INFO, myAppender 361 362 log4j.appender.myAppender = Log::Log4perl::Appender::File 363 log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout 364 log4j.appender.myAppender.filename = $testfile 365 log4j.appender.myAppender.recreate = 1 366 log4j.appender.myAppender.recreate_check_interval = 1 367 log4j.appender.myAppender.mode = append 368EOL 369 370 # Create logfile 371 Log::Log4perl->init(\$conf3); 372 373 # Get a logger, but dont write to it 374 $logger = Log::Log4perl::get_logger('animal.dog'); 375 376 rename "$testfile", "$testfile.old" or die "Cannot rename ($!)"; 377 # recreate it 378 trunc($testfile); 379 380 print "sleeping for 2 secs\n"; 381 sleep(2); 382 383 # ... write to (hopefully) truncated file 384 $logger->info("test3"); 385 386 open (LOG, $testfile) or die "can't open $testfile $!"; 387 is(scalar <LOG>, "INFO - test3\n", "log to externally recreated file"); 388 close LOG; 389 390 unlink "$testfile.old"; 391}; 392