logging-log4j-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Behrang Saeedzadeh <behran...@gmail.com>
Subject Re: Is there a low overhead way to enable/disable a given appender based on the value of an environment variable or system property?
Date Sun, 27 Oct 2019 00:02:34 GMT
Hi Ralph,

Thanks for the reply. That worked for me, but I have a couple of
suggestions:

   1.

   In the documentation, it is not mentioned that the script can return null
   to signal that none of the appenders in that block’s AppenderSet should be
   selected. It is worthwhile to mention that in the docs.
   2.

   With how ScriptAppenderSelector is working now, the log configuration
   becomes quite verbose:

<?xml version="1.0" encoding="UTF-8"?><Configuration status="debug"
name="ScriptAppenderSelectorExample">
    <Appenders>
        <ScriptAppenderSelector name="SelectConsole">
            <Script language="groovy"><![CDATA[
                if (System.getProperty("CONSOLE_APPENDER_ENABLED",
'true').equalsIgnoreCase('true')) {
                    return "Console"
                } else {
                    return null
                }
            ]]></Script>
            <AppenderSet>
                <Console name="Console" target="SYSTEM_OUT">
                    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t]
%-5level %logger{36} - %msg%n"/>
                </Console>
            </AppenderSet>
        </ScriptAppenderSelector>

        <ScriptAppenderSelector name="SelectFile">
            <Script language="groovy"><![CDATA[
                if (System.getProperty("FILE_APPENDER_ENABLED",
'true').equalsIgnoreCase('true')) {
                    return "File"
                } else {
                    return null
                }
            ]]></Script>
            <AppenderSet>
                <File name="File" fileName="application.log">
                    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t]
%-5level %logger{36} - %msg%n" />
                </File>
            </AppenderSet>
        </ScriptAppenderSelector>

        <ScriptAppenderSelector name="SelectSMTP">
            <Script language="groovy"><![CDATA[
                if (System.getProperty("SMTP_APPENDER_ENABLED",
'true').equalsIgnoreCase('true')) {
                    return "SMTP"
                } else {
                    return null
                }
            ]]></Script>
            <AppenderSet>
                <SMTP name="SMTP"
                      subject="App: Error"
                      from="log4j@example.com"
                      to="support@example.com"
                      smtpHost="smtp.example.com"
                      smtpPort="25"
                      bufferSize="5">
                </SMTP>
            </AppenderSet>
        </ScriptAppenderSelector>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="SelectConsole"/>
        </Root>
    </Loggers></Configuration>

If the script could return a list of appenders to be selected instead of
just one appender, the configuration would become more concise:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" name="ScriptAppenderSelectorExample">
    <Appenders>
        <ScriptAppenderSelector name="SelectMultiple">
            <Script language="groovy"><![CDATA[
                def selected = []

                if (System.getProperty("CONSOLE_APPENDER_ENABLED",
'true').equalsIgnoreCase('true')) {
                    selected.add("Console")
                }

                if (System.getProperty("FILE_APPENDER_ENABLED",
'true').equalsIgnoreCase('true')) {
                    selected.add("File")
                }

                if (System.getProperty("SMTP_APPENDER_ENABLED",
'true').equalsIgnoreCase('true')) {
                    selected.add("SMTP")
                }

                return selected
            ]]></Script>
            <AppenderSet>
                <Console name="Console" target="SYSTEM_OUT">
                    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t]
%-5level %logger{36} - %msg%n"/>
                </Console>
                <File name="File" fileName="application.log">
                    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t]
%-5level %logger{36} - %msg%n" />
                </File>
                <SMTP name="SMTP"
                      subject="App: Error"
                      from="log4j@example.com"
                      to="support@example.com"
                      smtpHost="smtp.example.com"
                      smtpPort="25"
                      bufferSize="5">
                </SMTP>
            </AppenderSet>
        </ScriptAppenderSelector>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="SelectMultiple"/>
        </Root>
    </Loggers>
</Configuration>

If that makes sense, I can work on a PR.
Best regards,
Behrang Saeedzadeh
blog.behrang.org


On Sun, Oct 27, 2019 at 3:21 AM Ralph Goers <ralph.goers@dslextreme.com>
wrote:

> Take a look at the ScriptAppenderSelector -
> http://logging.apache.org/log4j/2.x/manual/appenders.html#ScriptAppenderSelector
> <
> http://logging.apache.org/log4j/2.x/manual/appenders.html#ScriptAppenderSelector>
> - and see if that does what you want. If not, please let us know.
>
> Ralph
>
> > On Oct 26, 2019, at 5:26 AM, Behrang Saeedzadeh <behrangsa@gmail.com>
> wrote:
> >
> > Let’s say I have three appenders:
> >
> > <?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN">
> >    <Appenders>
> >        <Console name="Console" target="SYSTEM_OUT">
> >            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level
> > %logger{36} - %msg%n"/>
> >        </Console>
> >
> >        <File name="File" fileName="application.log">
> >            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level
> > %logger{36} - %msg%n" />
> >        </File>
> >
> >        <SMTP name="SMTP"
> >              subject="App: Error"
> >              from="log4j@example.com"
> >              to="support@example.com"
> >              smtpHost="mailserver"
> >              smtpPort="25"
> >              bufferSize="100">
> >        </SMTP>
> >    </Appenders></Configuration>
> >
> > I want to enable/disable these appenders using system properties in
> > different environments.
> >
> > One option is to control this using scripts:
> >
> > <?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN">
> >    <Scripts>
> >        <Script name="isConsoleAppenderEnabled"
> language="groovy"><![CDATA[
> >            return System.getProperty("CONSOLE_APPENDER_ENABLED",
> > 'true').equalsIgnoreCase('true');
> >        ]]></Script>
> >
> >        <Script name="isFileAppenderEnabled" language="groovy"><![CDATA[
> >            return System.getProperty("FILE_APPENDER_ENABLED",
> > 'true').equalsIgnoreCase('true');
> >        ]]></Script>
> >
> >        <Script name="isSmtpAppenderEnabled" language="groovy"><![CDATA[
> >            return System.getProperty("SMTP_APPENDER_ENABLED",
> > 'true').equalsIgnoreCase('true');
> >        ]]></Script>
> >    </Scripts>
> >
> >    <Appenders>
> >        <Console name="Console" target="SYSTEM_OUT">
> >            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level
> > %logger{36} - %msg%n"/>
> >        </Console>
> >
> >        <File name="File" fileName="application.log">
> >            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level
> > %logger{36} - %msg%n" />
> >        </File>
> >
> >        <SMTP name="SMTP"
> >              subject="App: Error"
> >              from="log4j@example.com"
> >              to="support@example.com"
> >              smtpHost="smtp.example.com"
> >              smtpPort="25"
> >              bufferSize="5">
> >        </SMTP>
> >    </Appenders>
> >
> >    <Loggers>
> >        <Root level="info">
> >            <AppenderRef ref="Console">
> >                <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY">
> >                    <ScriptRef ref="isConsoleAppenderEnabled"/>
> >                </ScriptFilter>
> >            </AppenderRef>
> >
> >            <AppenderRef ref="File">
> >                <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY">
> >                    <ScriptRef ref="isFileAppenderEnabled"/>
> >                </ScriptFilter>
> >            </AppenderRef>
> >
> >            <AppenderRef ref="SMTP">
> >                <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY">
> >                    <ScriptRef ref="isSmtpAppenderEnabled"/>
> >                </ScriptFilter>
> >            </AppenderRef>
> >        </Root>
> >    </Loggers></Configuration>
> >
> > However, this doesn’t really disable the appender, but computes the value
> > of the script for each log event and based on that suppresses the event
> > from being sent to the appender.
> >
> > Another option is to write a custom appender that implements this logic
> and
> > that can decorate other appenders to achieve this behavior.
> >
> > But I was wondering if there’s already a built-in feature available that
> > can enable/disable appenders based on environment variables and/or system
> > properties?
> >
> >
> > Best regards,
> > Behrang Saeedzadeh
> > blog.behrang.org
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message