#semaphores my $writelog = Thread::Semaphore->new(); #sequential log writing #LIBS: use common; open my $LOGFH ,">", $files{log}{file}; #from common #disable write buffer my $stdout = select($LOGFH); $| = 1; select($stdout); require other; other->import(\$LOGFH, \$writelog); #FH, SEM logLine("TEST"); sub logLine { my ($text) =@_; chomp($text); my ($package, $filename, $line) = caller; my $FunctionName = (caller(1))[3]; if ($FunctionName =~ m/::(.+)/) { $FunctionName = $1; } my $time = localtime time; #do sprintf left align truncate until sprintf supports if ($files{log}{fileNameLen} =~ m/-\d+\.(\d+)/) { $filename = substr($filename, 0, $1); } if ($files{log}{funNameLen} =~ m/-\d+\.(\d+)/) { $FunctionName = substr($FunctionName, 0, $1); } my $header = sprintf("%*s, %*s, %*s, %*s:", $files{log}{timeLen}, $time, $files{log}{fileNameLen}, $filename, $files{log}{funNameLen}, $FunctionName, $files{log}{lineNumLen}, $line); print "$header $text\n"; #only for testing if (defined $writelog and defined $LOGFH) { $writelog->down(); print $LOGFH "$header $text\n"; $writelog->up(); } }