I’ll try to describe it better but I’m not sure how good a job I’ll do if the 
dots aren’t clicking yet. Also, even though I might say to do it one way if I 
was coding I could very well change my mind as I implement it. That said:
Create an Appender plugin named ScriptSelector or ScriptAppenderSelector. It 
needs the following parameters
name, a String PluginAttribute
default, a String PluginAttribute
initScript or startupScript, an AbstractScript PluginElement
script, an AbstractScript PluginElement
appenderList, an AppenderList PluginElement.
As always, the builder (or factory) creates an instance of the 
ScriptAppenderSelector. 
If there is an init script then the builder (or factory) executes it. 
If the returned value is not null then instantiate the Appender with that name 
using the configuration in the AppenderList. 
Whatever Appender the init script names should become the default Appender.
If no init script is present or the init script returns null use the value of 
the default setting as the name of the default Appender to use.
Create the default Appender and save it in the Map of created appenders wrapped 
by an AppenderControl.
When the append method is called check for a script setting.
If a script is found, run it. 
If it returns a value see if that appender is saved in the AppenderMap. 
If it is, call the appender and return.
If it is not, locate the configuration for the appender, create it and add it 
to the AppenderMap. Then call it and return.
If it returns null or no script is defined then call the default Appender and 
return.
When the stop method is called call the stop method on each of the Appenders in 
the AppenderMap.

Note that signatures for scripts are defined by the components that use them. 
In this case both the init script and script return the name of the appender to 
execute. 

Ralph


> On Sep 12, 2016, at 12:54 PM, Gary Gregory <garydgreg...@gmail.com> wrote:
> 
> On Sun, Sep 11, 2016 at 12:47 PM, Ralph Goers <ralph.go...@dslextreme.com 
> <mailto:ralph.go...@dslextreme.com>> wrote:
> Yes. The Appenders tag inside the ScriptSelector are the Appenders that are 
> to be created. But now that I think about it, we can’t use “Appenders” for 
> this. If you look at the RoutingAppender you will notice that Appenders there 
> are declared under a Route element. The Route plugin is defined with 
> deferChildren=true. This means that whatever is configured under the Route 
> will not be created during initial configuration. Instead the Route keeps a 
> reference to the Node and then configures the Appender when it is required. 
> So we would need a new plugin to wrap the Appenders that are to be created.
> 
> Can you please describe in more detail how this new plug fits in and what it 
> does? I can't quite connect the dots with the parallel of the routing 
> appender. I'm willing to implement this as I need the feature ASAP. 
> 
> Gary
> 
> 
> Ralph
> 
>> On Sep 11, 2016, at 11:10 AM, Gary Gregory <garydgreg...@gmail.com 
>> <mailto:garydgreg...@gmail.com>> wrote:
>> 
>> Are the <Appenders> tags really meant to be nested?
>> 
>> Gary
>> 
>> On Sat, Sep 10, 2016 at 11:48 AM, Ralph Goers <ralph.go...@dslextreme.com 
>> <mailto:ralph.go...@dslextreme.com>> wrote:
>> Oops. I forgot the closing CDATA tag in the script.
>> 
>> Ralph
>> 
>>> On Sep 10, 2016, at 11:43 AM, Ralph Goers <ralph.go...@dslextreme.com 
>>> <mailto:ralph.go...@dslextreme.com>> wrote:
>>> 
>>> Interesting. OS/390.  I worked on MVS, OS/370, z/OS, etc many moons ago but 
>>> haven’t worked on a mainframe since 2001.
>>> 
>>> This sort of sounds like you want an Appender Selector, which would be an 
>>> Appender that uses a Selector to figure out which Appender to delegate to. 
>>> This is a bit like the PatternSelector. I would imagine it would make sense 
>>> to implement AppenderSelectors and LayoutSelectors.  You probably would 
>>> want to dynamically initialize the Appenders much like the RoutingAppender 
>>> does. 
>>> 
>>> Maybe it would look like:
>>> 
>>> <Appenders>
>>>   <ScriptSelector name=“" default=“”>
>>>      <Script language=“groovy”><![CDATA[
>>>          if (System.getProperty”os.name 
>>> <http://os.name/>”).contains(“OS/390”)) then {
>>>              return “Socket”;
>>>          } else {
>>>              return “File”;
>>>          }           
>>>      </Script>
>>>      <Appenders>
>>>          <SocketAppender name=“Socket” …/>
>>>          <FileAppender name=“File” …/>
>>>      </Appenders>     
>>>   </ScriptSelector>
>>> </Appenders>
>>> 
>>> The thing is that this script would run every time the Selector was 
>>> accessed while it sounds like you would only want the script to run when 
>>> the Selector is initialized. We could do that too but the script would need 
>>> to be declared in a property that would only be used when the selector is 
>>> initialized. I would want to support being able to do both.
>>> 
>>> Ralph
>>> 
>>>> On Sep 10, 2016, at 11:04 AM, Gary Gregory <garydgreg...@gmail.com 
>>>> <mailto:garydgreg...@gmail.com>> wrote:
>>>> 
>>>> <Appenders>
>>>>    <ScriptTest language="JavaScript">
>>>>       <If>System.getProperty("os.name 
>>>> <http://os.name/>").contains("OS/390")</If>
>>>>       <True>
>>>>          <SocketAppender ...>
>>>>      </True>
>>>>      <False>
>>>>          <FileAppender ...>
>>>>      </False>
>>>>    </ScriptTest>
>>>> </Appenders>
>>>> 
>>>> ?
>>>> 
>>>> 
>>>> On Sat, Sep 10, 2016 at 10:40 AM, Gary Gregory <garydgreg...@gmail.com 
>>>> <mailto:garydgreg...@gmail.com>> wrote:
>>>> OK, I found 
>>>> https://logging.apache.org/log4j/2.x/manual/configuration.html#Scripts 
>>>> <https://logging.apache.org/log4j/2.x/manual/configuration.html#Scripts> 
>>>> and I think I could use either:
>>>> 
>>>> - Use composite configurations: One file for OS/390, one for all other 
>>>> OSs; or
>>>> - Do it all in one configuration file (that seems simpler)
>>>> 
>>>> It seems like there are some pieces missing to do what I want conveniently.
>>>> 
>>>> Should I define all appenders in <Appenders> and later use a script to 
>>>> only add the one(s) I want in the <Root> section?
>>>> 
>>>> Or, should the <Appenders> section itself be scripted to only add the 
>>>> appenders I want? 
>>>> 
>>>> Since I expect the OS/390 appender will likely blow up running on a 
>>>> different OK I do not want to create it unless I know it can run OK. 
>>>> 
>>>> I guess then I have a conditional section in both the Appenders and in the 
>>>> Root section so that when I say <AppenderRef =...> we do not go look for 
>>>> an appender that is not defined.
>>>> 
>>>> Thoughts?
>>>> 
>>>> A narrow solution would be to add an "os" attribute to all appenders but 
>>>> that seems lame. os="OS/390" and os="!OS/390" means also knowing about 
>>>> "not", yikes.
>>>> 
>>>> Gary
>>>> 
>>>> On Sat, Sep 10, 2016 at 10:05 AM, Gary Gregory <garydgreg...@gmail.com 
>>>> <mailto:garydgreg...@gmail.com>> wrote:
>>>> Hi,
>>>> 
>>>> I can't seem to find on our site the scripting support that was recently 
>>>> added (or is that only in master?).
>>>> 
>>>> What I need to do is only add a specific appender when running on a 
>>>> specific OS (USS on OS/390 if you must know). Then only add a different 
>>>> appender when not running on that OS.
>>>> 
>>>> I'd rather not have to hard-code this and make thing more complicated.
>>>> 
>>>> Thoughts?
>>>> 
>>>> Gary
>>>> 
>>>> -- 
>>>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | 
>>>> ggreg...@apache.org  <mailto:ggreg...@apache.org>
>>>> Java Persistence with Hibernate, Second Edition 
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>>>> 
>>>> 
>>>> -- 
>>>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | 
>>>> ggreg...@apache.org  <mailto:ggreg...@apache.org>
>>>> Java Persistence with Hibernate, Second Edition 
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>>>> 
>>>> 
>>>> -- 
>>>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | 
>>>> ggreg...@apache.org  <mailto:ggreg...@apache.org>
>>>> Java Persistence with Hibernate, Second Edition 
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>> 
>> 
>> 
>> 
>> -- 
>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | 
>> ggreg...@apache.org  <mailto:ggreg...@apache.org>
>> Java Persistence with Hibernate, Second Edition 
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>> Home: http://garygregory.com/ <http://garygregory.com/>
>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
> 
> 
> 
> -- 
> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | 
> ggreg...@apache.org  <mailto:ggreg...@apache.org>
> Java Persistence with Hibernate, Second Edition 
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
> Home: http://garygregory.com/ <http://garygregory.com/>
> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>

Reply via email to