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