1package Log::Log4perl::JavaMap; 2 3use Carp; 4use strict; 5 6use constant _INTERNAL_DEBUG => 0; 7 8our %translate = ( 9 'org.apache.log4j.ConsoleAppender' => 10 'Log::Log4perl::JavaMap::ConsoleAppender', 11 'org.apache.log4j.FileAppender' => 12 'Log::Log4perl::JavaMap::FileAppender', 13 'org.apache.log4j.RollingFileAppender' => 14 'Log::Log4perl::JavaMap::RollingFileAppender', 15 'org.apache.log4j.TestBuffer' => 16 'Log::Log4perl::JavaMap::TestBuffer', 17 'org.apache.log4j.jdbc.JDBCAppender' => 18 'Log::Log4perl::JavaMap::JDBCAppender', 19 'org.apache.log4j.SyslogAppender' => 20 'Log::Log4perl::JavaMap::SyslogAppender', 21 'org.apache.log4j.NTEventLogAppender' => 22 'Log::Log4perl::JavaMap::NTEventLogAppender', 23); 24 25our %user_defined; 26 27sub get { 28 my ($appender_name, $appender_data) = @_; 29 30 print "Trying to map $appender_name\n" if _INTERNAL_DEBUG; 31 32 $appender_data->{value} || 33 die "ERROR: you didn't tell me how to implement your appender " . 34 "'$appender_name'"; 35 36 my $perl_class = $translate{$appender_data->{value}} || 37 $user_defined{$appender_data->{value}} || 38 die "ERROR: I don't know how to make a '$appender_data->{value}' " . 39 "to implement your appender '$appender_name', that's not a " . 40 "supported class\n"; 41 eval { 42 eval "require $perl_class"; #see 'perldoc -f require' for why two evals 43 die $@ if $@; 44 }; 45 $@ and die "ERROR: trying to set appender for $appender_name to " . 46 "$appender_data->{value} using $perl_class failed\n$@ \n"; 47 48 my $app = $perl_class->new($appender_name, $appender_data); 49 return $app; 50} 51 52#an external api to the two hashes 53sub translate { 54 my $java_class = shift; 55 56 return $translate{$java_class} || 57 $user_defined{$java_class}; 58} 59 601; 61 62 63=head1 NAME 64 65Log::Log4perl::JavaMap - maps java log4j appenders to Log::Dispatch classes 66 67=head1 SYNOPSIS 68 69 ############################### 70 log4j.appender.FileAppndr1 = org.apache.log4j.FileAppender 71 log4j.appender.FileAppndr1.File = /var/log/onetime.log 72 log4j.appender.FileAppndr1.Append = false 73 74 log4j.appender.FileAppndr1.layout = org.apache.log4j.PatternLayout 75 log4j.appender.FileAppndr1.layout.ConversionPattern=%d %4r [%t] %-5p %c %x - %m%n 76 ############################### 77 78 79=head1 DESCRIPTION 80 81If somebody wants to create an appender called C<org.apache.log4j.ConsoleAppender>, 82we want to translate it to Log::Dispatch::Screen, and then translate 83the log4j options into Log::Dispatch parameters.. 84 85=head2 What's Implemented 86 87(Note that you can always use the Log::Dispatch::* module. By 'implemented' 88I mean having a translation class that translates log4j options into 89the Log::Dispatch options so you can use log4j rather than log4perl 90syntax in your config file.) 91 92Here's the list of appenders I see on the current (6/2002) log4j site. 93 94These are implemented 95 96 ConsoleAppender - Log::Dispatch::Screen 97 FileAppender - Log::Dispatch::File 98 RollingFileAppender - Log::Dispatch::FileRotate (by Mark Pfeiffer) 99 JDBCAppender - Log::Log4perl::Appender::DBI 100 SyslogAppender - Log::Dispatch::Syslog 101 NTEventLogAppender - Log::Dispatch::Win32EventLog 102 103 104These should/will/might be implemented 105 106 DailyRollingFileAppender - 107 SMTPAppender - Log::Dispatch::Email::MailSender 108 109 110These might be implemented but they don't have corresponding classes 111in Log::Dispatch (yet): 112 113 NullAppender 114 TelnetAppender 115 116These might be simulated 117 118 LF5Appender - use Tk? 119 ExternallyRolledFileAppender - catch a HUP instead? 120 121These will probably not be implemented 122 123 AsyncAppender 124 JMSAppender 125 SocketAppender - (ships a serialized LoggingEvent to the server side) 126 SocketHubAppender 127 128=head1 ROLL YOUR OWN 129 130Let's say you've in a mixed Java/Perl enviroment and you've 131come up with some custom Java appender with behavior you want to 132use in both worlds, C<myorg.customAppender>. You write a 133Perl appender with the same behavior C<Myorg::CustomAppender>. You 134want to use one config file accross both applications, so the 135config file will have to say 'myorg.customAppender'. But 136the mapping from C<myorg.customAppender> to C<Myorg::CustomAppender> 137isn't in this JavaMap class, so what do you do? 138 139In your Perl code, before you call Log::Log4perl::init(), do this: 140 141 $Log::Log4perl::JavaMap::user_defined{'myorg.customAppender'} = 142 'Myorg::CustomAppender'; 143 144and you can use 'myorg.customAppender' in your config file with 145impunity. 146 147 148 149=head1 AUTHORS 150 151 Kevin Goess, <cpan@goess.org> 152 Mike Schilli, <m@perlmeister.com> 153 154 June, 2002 155 156=head1 SEE ALSO 157 158http://jakarta.apache.org/log4j/docs/ 159 160=cut 161