3 #package to deal with Logging Actions in DB
5 # Copyright 2000-2002 Katipo Communications
6 # Copyright 2011 MJ Ray and software.coop
8 # This file is part of Koha.
10 # Koha is free software; you can redistribute it and/or modify it
11 # under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 3 of the License, or
13 # (at your option) any later version.
15 # Koha is distributed in the hope that it will be useful, but
16 # WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with Koha; if not, see <http://www.gnu.org/licenses>.
26 use Data::Dumper qw( Dumper );
27 use File::Basename qw( basename );
28 use JSON qw( to_json encode_json );
29 use Scalar::Util qw( blessed );
30 use Struct::Diff qw( diff );
36 use vars qw(@ISA @EXPORT);
41 @EXPORT = qw(logaction cronlogaction);
46 C4::Log - Koha Log Facility functions
54 The functions in this module perform various functions in order to log all the operations done on the Database, including deleting and undeleting books, adding/editing members, etc.
62 &logaction($modulename, $actionname, $objectnumber, $infos, $interface, $original_as_hashref_or_object);
64 Adds a record into action_logs table to report the different changes upon the database.
65 Each log entry includes the number of the user currently logged in. For batch
66 jobs, which operate without authenticating a user and setting up a session, the user
67 number is set to 0, which is the same as the superlibrarian's number.
73 my ( $modulename, $actionname, $objectnumber, $infos, $interface, $original ) = @_;
77 # Get ID of logged in user. if called from a batch job,
78 # no user session exists and C4::Context->userenv() returns
80 my $userenv = C4::Context->userenv();
81 my $usernumber = ( ref($userenv) eq 'HASH' ) ? $userenv->{'number'} : 0;
83 $interface //= C4::Context->interface;
85 if ( blessed($infos) && $infos->isa('Koha::Object') ) {
86 $infos = $infos->get_from_storage if $infos->in_storage;
87 $updated = $infos->unblessed;
88 local $Data::Dumper::Sortkeys = 1;
90 if ( $infos->isa('Koha::Item') && $modulename eq 'CATALOGUING' && $actionname eq 'MODIFY' ) {
91 $infos = "item " . Dumper($updated);
93 $infos = Dumper($updated);
100 ( $interface eq 'cron' or $interface eq 'commandline' )
105 my $depth = C4::Context->preference('ActionLogsTraceDepth') || 0;
106 for ( my $i = 0 ; $i < $depth ; $i++ ) {
107 my ( $package, $filename, $line, $subroutine ) = caller($i);
108 last unless defined $line;
113 filename => $filename,
115 subroutine => $subroutine,
119 my $trace = @trace ? to_json( \@trace, { utf8 => 1, pretty => 0 } ) : undef;
122 $diff = encode_json( diff( $original->unblessed, $updated, noU => 1 ) )
123 if blessed($original) && $original->isa('Koha::Object');
124 $diff //= encode_json( diff( $original, $updated, noU => 1 ) )
125 if $original && ref $updated eq 'HASH';
127 Koha::ActionLog->new(
129 timestamp => \'NOW()',
131 module => $modulename,
132 action => $actionname,
133 object => $objectnumber,
135 interface => $interface,
142 my $logger = Koha::Logger->get(
144 interface => $interface,
145 category => "ActionLogs.$modulename.$actionname"
150 "ACTION LOG: " . encode_json(
153 module => $modulename,
154 action => $actionname,
155 object => $objectnumber,
165 &cronlogaction($infos);
167 Convenience routine to add a record into action_logs table from a cron job.
168 Logs the path and name of the calling script plus the information privided by param $infos.
175 my $info = $params->{info};
176 my $action = $params->{action};
178 my $loginfo = ( caller(0) )[1];
179 $loginfo .= ' ' . $info if $info;
180 logaction( 'CRONJOBS', $action, $$, $loginfo ) if C4::Context->preference('CronjobLog');
190 Koha Development Team <http://koha-community.org/>