====== How to send LiteSpeed logs to a Syslog or Splunk logging server ====== The following script is helpful and can be easily customized to fit your environment to send error/server logs from all litespeed web servers or load balancer instances to a centralized location: a central syslog server, or a splunk data gather. For this example, the logs are syslogged to a remote server without any alteration. ===== A. Install Perl Modules ==== Make sure to install the necessary Perl modules from CPAN. perl -MCPAN -e "install File::Tail::Multi" prel -MCPAN -e "install Sys::Syslog" ===== B. Copy Script to Server ==== Here is the Perl script. If you do not have Perl binary in /usr/bin/perl then modify the scripts first line. #!/usr/bin/perl use strict; use File::Tail::Multi; use Sys::Syslog; #Put all the litespeed error/stderr/php error log files here my @log_files = ["/opt/lsws/logs/error.log","/opt/lsws/logs/stderr.log","/opt/lsws/logs/php.err"]; #Create this file if it does not exist. Script will use this file to keep #a record of where it left off for each tailing file so it will never re-read old data. my $tail_checkpoint_file = "/tmp/perl_tail.lastrun"; #Your syslog udp server. Make sure udp port 514 is open my $syslog_server = "127.0.0.1"; #Let syslog use remote udp protocol Sys::Syslog::setlogsock("udp", $syslog_server); #Setting syslog message options. The firt param will prepend litespeed to all outgoing messages openlog("litespeed", 'nowait', 'local0'); #Create the tail/watch instance. my $myTail = File::Tail::Multi->new( Function => \&fn_read_lines, LastRun_File => $tail_checkpoint_file, Files => @log_files, RemoveDuplicate => 1, ); print("Log watcher running...\n"); while(1) { #Read lines from watched files if there are new lines to read $myTail->read; #for debug purpose #$myTail->print; #1 second is good for almost real-time without chewing up cpu sleep 1; } #This function is called when there are new lines read sub fn_read_lines { my $lines_ref = shift; foreach ( @{$lines_ref} ) { chomp; #removes new line syslog("info",$_); } } ===== C. Test Script ==== To verify that the code is working. Run the scrip via command line. perl watch.pl #or if you have executable bit set on the script ./watch.pl ===== D. Run as daemon/in background ==== To run it as a daemon/background process. Use nohup. nohup perl watch.pl &