| Use Case | Command | Description |
|---|---|---|
| Validate XML config | StdInParse -ns -v < config.xml | Validate against DTD |
| Reference log4j DTD | <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> | Use standard log4j DTD |
| Reference log4perl DTD | <!DOCTYPE log4perl:configuration SYSTEM "log4perl.dtd"> | Use extended log4perl DTD |
| Use nested parameters | <param-nested name="login">...</param-nested> | Pass nested options to appenders |
| Variable substitution | ${env_var} in attribute values | Replace with environment variable |
| Add custom conversion specifier | <cspec name="K">sub { ... }</cspec> | Define appender-local layout specifier |
--------------------------
--using the log4j DTD--
--------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="FileAppndr1" class="org.apache.log4j.FileAppender">
<layout class="Log::Log4perl::Layout::PatternLayout">
<param name="ConversionPattern"
value="%d %4r [%t] %-5p %c %t - %m%n"/>
</layout>
<param name="File" value="t/tmp/DOMtest"/>
<param name="Append" value="false"/>
</appender>
<category name="a.b.c.d" additivity="false">
<level value="warn"/> <!-- note lowercase! -->
<appender-ref ref="FileAppndr1"/>
</category>
<root>
<priority value="warn"/>
<appender-ref ref="FileAppndr1"/>
</root>
</log4j:configuration>
--------------------------
--using the log4perl DTD--
--------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4perl:configuration SYSTEM "log4perl.dtd">
<log4perl:configuration xmlns:log4perl="http://log4perl.sourceforge.net/"
threshold="debug" >
<log4perl:appender name="jabbender" class="Log::Dispatch::Jabber">
<param-nested name="login">
<param name="hostname" value="a.jabber.server"/>
<param name="password" value="12345"/>
<param name="port" value="5222"/>
<param name="resource" value="logger"/>
<param name="username" value="bobjones"/>
</param-nested>
<param name="to" value="bob AT a.server"/>
<param-text name="to">
mary AT another.server
</param-text>
<log4perl:layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value = "%K xx %G %U"/>
<cspec name="K">
sub { return sprintf "%1x", $$}
</cspec>
<cspec name="G">
sub {return 'thisistheGcspec'}
</cspec>
</log4perl:layout>
</log4perl:appender>
<log4perl:appender name="DBAppndr2" class="Log::Log4perl::Appender::DBI">
<param name="warp_message" value="0"/>
<param name="datasource" value="DBI:CSV:f_dir=t/tmp"/>
<param name="bufferSize" value="2"/>
<param name="password" value="sub { $ENV{PWD} }"/>
<param name="username" value="bobjones"/>
<param-text name="sql">
INSERT INTO log4perltest
(loglevel, message, shortcaller, thingid,
category, pkg, runtime1, runtime2)
VALUES
(?,?,?,?,?,?,?,?)
</param-text>
<param-nested name="params">
<param name="1" value="%p"/>
<param name="3" value="%5.5l"/>
<param name="5" value="%c"/>
<param name="6" value="%C"/>
</param-nested>
<layout class="Log::Log4perl::Layout::NoopLayout"/>
</log4perl:appender>
<category name="animal.dog">
<priority value="info"/>
<appender-ref ref="jabbender"/>
<appender-ref ref="DBAppndr2"/>
</category>
<category name="plant">
<priority value="debug"/>
<appender-ref ref="DBAppndr2"/>
</category>
<PatternLayout>
<cspec name="U"><![CDATA[
sub {
return "UID $< GID $(";
}
]]></cspec>
</PatternLayout>
</log4perl:configuration>
<!DOCTYPE log4perl:configuration SYSTEM "log4perl.dtd">
That tells the parser to validate your config against the DTD in "log4perl.dtd", which is
available in the xml/ directory of the log4perl distribution. Note that you'll also need to grab
the log4j-1.2.dtd from there as well, since the it's included by log4perl.dtd.
Namespace-aware validating parsers are not the norm in Perl. But the Xerces project
(http://xml.apache.org/xerces-c/index.html --lots of binaries available, even rpm's) does
provide just such a parser that you can use like this:
StdInParse -ns -v < my-log4perl-config.xml
This module itself does not use a validating parser, the obvious one XML::DOM::ValParser doesn't
seem to handle namespaces.
oneMessagePerAppender global settinglog4perl.>log4perl.PatternLayout.cspec.G=sub { return "UID $< GID $("; }log4j.appender.appndr1.layout.cspec.K = sub {return sprintf "%1x", $$ }log4j.appender.jabbender = Log::Dispatch::Jabberlog4j.appender.jabbender.login.hostname = a.jabber.serverlog4j.appender.jabbender.login.port = 5222log4j.appender.jabbender.login.username = bobjonest/044XML-Filter.t, here's a short one:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4perl:configuration SYSTEM "log4perl.dtd">
<log4perl:configuration xmlns:log4perl="http://log4perl.sourceforge.net/">
<appender name="A1" class="Log::Log4perl::Appender::TestBuffer">
<layout class="Log::Log4perl::Layout::SimpleLayout"/>
<filter class="Log::Log4perl::Filter::Boolean">
<param name="logic" value="!Match3 && (Match1 || Match2)"/>
</filter>
</appender>
<appender name="A2" class="Log::Log4perl::Appender::TestBuffer">
<layout class="Log::Log4perl::Layout::SimpleLayout"/>
<filter-ref id="Match1"/>
</appender>
<log4perl:filter name="Match1" value="sub { /let this through/ }" />
<log4perl:filter name="Match2">
sub {
/and that, too/
}
</log4perl:filter>
<log4perl:filter name="Match3" class="Log::Log4perl::Filter::StringMatch">
<param name="StringToMatch" value="suppress"/>
<param name="AcceptOnMatch" value="true"/>
</log4perl:filter>
<log4perl:filter name="MyBoolean" class="Log::Log4perl::Filter::Boolean">
<param name="logic" value="!Match3 && (Match1 || Match2)"/>
</log4perl:filter>
<root>
<priority value="info"/>
<appender-ref ref="A1"/>
</root>
</log4perl:configuration>
<log4perl:configuration>
handles #1) and accepts <PatternLayout>
<log4perl:appender>
accepts <param-nested> and <param-text>
<log4perl:layout>
accepts custom cspecs for #3)<param-nested> element (complementing the <param> element) to handle #4)<PatternLayout> element to handle #2)<param-text> which lets you put things like perl code into escaped CDATA between the
tags, so you don't have to worry about escaping characters and quotes<cspec><log4perl:appender> instead of just <appender>, you can make
your own DTD combining the two DTDs and getting rid of the namespace prefixes. Then you can
validate against that, and log4perl should accept it just fine.
<param name="${hostname}" value="${hostnameval}.foo.com"/>
<param-text name="to">${currentsysadmin}@foo.com</param-text>
Generated by phpman v4.9.29 · Markdown · JSON · MCP Author: Che Dong Under GNU General Public License
2026-07-20 18:38 @2600:1f28:365:80b0:8802:8bb4:3873:328e
CrawledBy CCBot/2.0 (https://commoncrawl.org/faq/)
Enhanced by LLM: deepseek-v4-flash / taotoken.net / www.chedong.com - original format