X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FLog.pm;h=d16d4236c53d800d64c5b2667cd1fd01da1c886d;hb=bb5d95749bd597953fad17ba4cc3f5262d538ff2;hp=6b8ff17e45b26fad3a0cb26a22bcb6b292660d46;hpb=944831555e89c8fdb4dc865764de51887a98a23b;p=koha-ffzg.git diff --git a/C4/Log.pm b/C4/Log.pm index 6b8ff17e45..d16d4236c5 100644 --- a/C4/Log.pm +++ b/C4/Log.pm @@ -8,33 +8,37 @@ package C4::Log; # # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . use strict; use warnings; +use Data::Dumper qw( Dumper ); +use JSON qw( to_json ); +use Scalar::Util qw( blessed ); +use File::Basename qw( basename ); + use C4::Context; -use C4::Dates qw(format_date); +use Koha::Logger; +use Koha::ActionLogs; -use vars qw($VERSION @ISA @EXPORT); +use vars qw(@ISA @EXPORT); BEGIN { - # set the version for version checking - $VERSION = 3.01; - require Exporter; - @ISA = qw(Exporter); - @EXPORT = qw(&logaction &GetLogStatus &displaylog &GetLogs); + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw(logaction cronlogaction); } =head1 NAME @@ -55,7 +59,7 @@ The functions in this module perform various functions in order to log all the o =item logaction - &logaction($modulename, $actionname, $objectnumber, $infos); + &logaction($modulename, $actionname, $objectnumber, $infos, $interface); Adds a record into action_logs table to report the different changes upon the database. Each log entry includes the number of the user currently logged in. For batch @@ -66,184 +70,101 @@ number is set to 0, which is the same as the superlibrarian's number. #' sub logaction { - my ($modulename, $actionname, $objectnumber, $infos)=@_; + my ($modulename, $actionname, $objectnumber, $infos, $interface)=@_; # Get ID of logged in user. if called from a batch job, # no user session exists and C4::Context->userenv() returns # the scalar '0'. my $userenv = C4::Context->userenv(); my $usernumber = (ref($userenv) eq 'HASH') ? $userenv->{'number'} : 0; - - my $dbh = C4::Context->dbh; - my $sth=$dbh->prepare("Insert into action_logs (timestamp,user,module,action,object,info) values (now(),?,?,?,?,?)"); - $sth->execute($usernumber,$modulename,$actionname,$objectnumber,$infos); - $sth->finish; -} - -=item GetLogStatus - - $status = GetLogStatus; - -C<$status> is a hasref like this example: - $hash = { - BorrowersLog => 1, - CataloguingLog => 0, - IssueLog => 0, - ... + $usernumber ||= 0; + $interface //= C4::Context->interface; + + if( blessed($infos) && $infos->isa('Koha::Object') ) { + $infos = $infos->get_from_storage if $infos->in_storage; + local $Data::Dumper::Sortkeys = 1; + + if ( $infos->isa('Koha::Item') && $modulename eq 'CATALOGUING' && $actionname eq 'MODIFY' ) { + $infos = "item " . Dumper( $infos->unblessed ); + } else { + $infos = Dumper( $infos->unblessed ); + } } -=cut - -#' -sub GetLogStatus { - my %hash; - $hash{BorrowersLog} = C4::Context->preference("BorrowersLog"); - $hash{CataloguingLog} = C4::Context->preference("CataloguingLog"); - $hash{IssueLog} = C4::Context->preference("IssueLog"); - $hash{ReturnLog} = C4::Context->preference("ReturnLog"); - $hash{SubscriptionLog} = C4::Context->preference("SubscriptionLog"); - $hash{LetterLog} = C4::Context->preference("LetterLog"); - $hash{FinesLog} = C4::Context->preference("FinesLog"); - return \%hash; -} - -=item displaylog - - &displaylog($modulename, @filters); - $modulename is the name of the module on which the user wants to display logs - @filters is an optional table of hash containing : - - name : the name of the variable to filter - - value : the value of the filter.... May be with * joker - -returns a table of hash containing who did what on which object at what time - -=cut - -#' -sub displaylog { - my ($modulename, @filters) = @_; - my $dbh = C4::Context->dbh; - my $strsth=qq| - SELECT action_logs.timestamp, action_logs.action, action_logs.info, - borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid, - biblio.biblionumber, biblio.title, biblio.author - FROM action_logs - LEFT JOIN borrowers ON borrowers.borrowernumber=action_logs.user - LEFT JOIN biblio ON action_logs.object=biblio.biblionumber - WHERE action_logs.module = 'cataloguing' - |; - my %filtermap = (); - if ($modulename eq "catalogue" or $modulename eq "acqui") { - %filtermap = ( - user => 'borrowers.surname', - title => 'biblio.title', - author => 'biblio.author', - ); - } elsif ($modulename eq "members") { - $strsth=qq| - SELECT action_logs.timestamp, action_logs.action, action_logs.info, - borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid, - bor2.cardnumber, bor2.surname, bor2.firstname, bor2.userid - FROM action_logs - LEFT JOIN borrowers ON borrowers.borrowernumber=action_logs.user - LEFT JOIN borrowers as bor2 ON action_logs.object=bor2.borrowernumber - WHERE action_logs.module = 'members' - |; - %filtermap = ( - user => 'borrowers.surname', - surname => 'bor2.surname', - firstname => 'bor2.firstname', - cardnumber => 'bor2.cardnumber', - ); - } else { - return 0; - } - - if (@filters) { - foreach my $filter (@filters) { - my $tempname = $filter->{name} or next; - (grep {/^$tempname$/} keys %filtermap) or next; - $filter->{value} =~ s/\*/%/g; - $strsth .= " AND " . $filtermap{$tempname} . " LIKE " . $filter->{value}; - } - } - my $sth=$dbh->prepare($strsth); - $sth->execute; - my @results; - my $count; - my $hilighted=1; - while (my $data = $sth->fetchrow_hashref){ - $data->{hilighted} = ($hilighted>0); - $data->{info} =~ s/\n//g; - $data->{day} = format_date($data->{timestamp}); - push @results, $data; - $count++; - $hilighted = -$hilighted; + my $script = ( $interface eq 'cron' or $interface eq 'commandline' ) + ? basename($0) + : undef; + + my @trace; + my $depth = C4::Context->preference('ActionLogsTraceDepth') || 0; + for ( my $i = 0 ; $i < $depth ; $i++ ) { + my ( $package, $filename, $line, $subroutine ) = caller($i); + last unless defined $line; + push( + @trace, + { + package => $package, + filename => $filename, + line => $line, + subroutine => $subroutine, + } + ); } - return ($count, \@results); + my $trace = @trace ? to_json( \@trace, { utf8 => 1, pretty => 0 } ) : undef; + + Koha::ActionLog->new( + { + timestamp => \'NOW()', + user => $usernumber, + module => $modulename, + action => $actionname, + object => $objectnumber, + info => $infos, + interface => $interface, + script => $script, + trace => $trace, + } + )->store(); + + my $logger = Koha::Logger->get( + { + interface => $interface, + category => "ActionLogs.$modulename.$actionname" + } + ); + $logger->debug( + sub { + "ACTION LOG: " . to_json( + { + user => $usernumber, + module => $modulename, + action => $actionname, + object => $objectnumber, + info => $infos + } + ); + } + ); } -=item GetLogs +=item cronlogaction -$logs = GetLogs($datefrom,$dateto,$user,\@modules,$action,$object,$info); + &cronlogaction($infos); -Return: -C<$logs> is a ref to a hash which containts all columns from action_logs +Convenience routine to add a record into action_logs table from a cron job. +Logs the path and name of the calling script plus the information privided by param $infos. =cut -sub GetLogs { - my $datefrom = shift; - my $dateto = shift; - my $user = shift; - my $modules = shift; - my $action = shift; - my $object = shift; - my $info = shift; - - my $iso_datefrom = C4::Dates->new($datefrom,C4::Context->preference("dateformat"))->output('iso'); - my $iso_dateto = C4::Dates->new($dateto,C4::Context->preference("dateformat"))->output('iso'); - - my $dbh = C4::Context->dbh; - my $query = " - SELECT * - FROM action_logs - WHERE 1 - "; - - my @parameters; - $query .= " AND DATE_FORMAT(timestamp, '%Y-%m-%d') >= \"".$iso_datefrom."\" " if $iso_datefrom; #fix me - mysql specific - $query .= " AND DATE_FORMAT(timestamp, '%Y-%m-%d') <= \"".$iso_dateto."\" " if $iso_dateto; - if($user ne "") { - $query .= " AND user = ? "; - push(@parameters,$user); - } - if($modules && scalar(@$modules)) { - $query .= " AND module IN (".join(",",map {"?"} @$modules).") "; - push(@parameters,@$modules); - } - if($action && scalar(@$action)) { - $query .= " AND action IN (".join(",",map {"?"} @$action).") "; - push(@parameters,@$action); - } - if($object) { - $query .= " AND object = ? "; - push(@parameters,$object); - } - if($info) { - $query .= " AND info LIKE ? "; - push(@parameters,"%".$info."%"); - } - - my $sth = $dbh->prepare($query); - $sth->execute(@parameters); - - my @logs; - while( my $row = $sth->fetchrow_hashref ) { - $row->{$row->{module}} = 1; - push @logs , $row; - } - return \@logs; +#' +sub cronlogaction { + my $params = shift; + my $info = $params->{info}; + my $action = $params->{action}; + $action ||= "Run"; + my $loginfo = (caller(0))[1]; + $loginfo .= ' ' . $info if $info; + logaction( 'CRONJOBS', $action, $$, $loginfo ) if C4::Context->preference('CronjobLog'); } 1;