Hi,
you don't have to pass the logger around. You can configure it once in the
main script and ask for it in child scripts. Every time you invoke
java.util.logging.Logger.getLogger('my-script-logger'), the same logger is
returned. This is true also if you use log4j or logback (better) instead of
java.util.logging.

On 9 January 2016 at 02:15, Gerald Wiltse <jerrywil...@gmail.com> wrote:

> Thank you both for your feedback.  In my case, I don't think either
> suggestion will work.  Our scripts are all executed by a third party
> application. We do not have control over most environment items, nor can I
> pass startup options to the scripts. This puts me in a corner case, which
> makes me feel like I'm going against the grain on this.
>
> For this case, everything must take place in the script, or in calls I
> make from the script to other scripts, and then subsequent classes. I
> already call children scripts, and pass in objects through binding.  (def
> shell = new GroovyShell(bindings).parse( scriptBody ))
>
> I'm considering a few alternatives for logging:
>
> 1. Creating a logger in step 1, passing it along to scripts and classes i
> call
>     a.   Tedious, yet seemingly straightforward
>     b.   I assume possible, correct if wrong
> 2. Creating a logger in step 1, using reflection/stacktrace to get
> references back to it
>     a.   Seems like I could make it work, but I don't even know if
> actually possible
>     b.   From what i've read, seems pretty ill-advised for efficiency
> reasons
>
> To be honest, I don't like either, and it seems that there is no elegant
> way to do the logging the way I am envisioning. Usually that means "You're
> doing it wrong".  I guess here, that means the third party app didn't
> intend for people to be instantiating, calling custom classes, etc.  It was
> intended to be more basic.  They also don't support grape and a few other
> items that have made me engineer some things that would have otherwise been
> simple in a vanilla groovy environment.
>
> Thanks again for everyone's help.
>
>
>
> Gerald R. Wiltse
> jerrywil...@gmail.com
>
>
> On Fri, Jan 8, 2016 at 4:31 PM, Shil Sinha <shil.si...@gmail.com> wrote:
>
>> Hi Gerald,
>>
>> You can apply AST transformations to script classes using
>> http://docs.groovy-lang.org/latest/html/documentation/#_ast_transformation_customizer
>> .
>>
>> In your case, you'd need a script (called config.groovy in this example)
>> that looks like this:
>>
>> withConfig(configuration) { ast(groovy.util.logging.Log) }
>>
>> When you run a script that you want @Log applied to (MyScript.groovy in
>> this example), you'd call it as follows:
>>
>> groovy -configscript config.groovy MyScript.groovy
>>
>>
>>
>> On Fri, Jan 8, 2016 at 2:55 PM, Nelson, Erick [HDS] <
>> erick.nel...@hdsupply.com> wrote:
>>
>>> I’m not sure if there is a better way to handle script logging.
>>>
>>> The annotations is for classes and you cannot apply it to your script
>>> class.
>>>
>>> Another  disadvantage is that I don’t think you can use the logger in
>>> static methods.
>>>
>>>
>>>
>>> What you can do is ‘override’ the groovy Script class (the class that
>>> your script is an instance of, kindof) by use the BaseScript annotation
>>>
>>> Example:
>>>
>>> Define your wrapper like this…
>>>
>>>
>>>
>>> -bash-4.1$ cat MyScript.groovy
>>>
>>> abstract class MyScript extends Script {
>>>
>>>     java.util.logging.Logger log
>>>
>>>     @Override def run () {
>>>
>>>         log = java.util.logging.Logger.getLogger('')
>>>
>>>         // any other startup stuff here….
>>>
>>>         runMyScript()
>>>
>>>       // any other shutdown stuff here…
>>>
>>>     }
>>>
>>>     abstract def runMyScript()
>>>
>>> }
>>>
>>>
>>>
>>> Note that I have added a script variable called log that you can then
>>> use in your script.
>>>
>>>
>>>
>>> Then in your script do something like this…
>>>
>>>
>>>
>>> @groovy.transform.BaseScript(MyScript)
>>>
>>> import groovy.util.*
>>>
>>> log.info 'hello'
>>>
>>> log.severe 'hello'
>>>
>>>
>>>
>>> sample run….
>>>
>>>
>>>
>>> -bash-4.1$ groovy -Djava.util.logging.config.file=logging.properties
>>> test.groovy
>>>
>>> Jan 8, 2016 11:53:04 AM java.util.logging.LogManager$RootLogger log
>>>
>>> INFO: hello
>>>
>>> Jan 8, 2016 11:53:04 AM java.util.logging.LogManager$RootLogger log
>>>
>>> SEVERE: hello
>>>
>>>
>>>
>>> The advantage here is that you can now add any other startup and
>>> shutdown code in the base script class’s run method.
>>>
>>>
>>>
>>> *From:* Gerald Wiltse [mailto:jerrywil...@gmail.com]
>>> *Sent:* Friday, January 08, 2016 11:01 AM
>>> *To:* users@groovy.apache.org
>>> *Subject:* @Log annotation inside Groovy Script
>>>
>>>
>>>
>>> I just got @Log to work in some test classes, then learned that  @Log
>>> annotations do not work in scripts. Is this true? If so, is there some
>>> workaround that exists?  I assume this is true for all @annotations and
>>> scripts, so it seems pretty sad if there's no way to do it.
>>>
>>>
>>>
>>> I'm basing that conclusion on this post, and my own error.
>>>
>>> http://stackoverflow.com/questions/15981182/logging-in-groovy-script
>>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__stackoverflow.com_questions_15981182_logging-2Din-2Dgroovy-2Dscript&d=BQMFaQ&c=_8VcuiJ--MukFqz6Sy5gel64o52_IbhiNdatg8Zb5Gs&r=X18JEC7WoH6AE_Xb-Yc-vOlw3Sre-zHIm9sFtf9hiJM&m=elRpgOr6t4A7M6hufAu_wLHNWUXEqqQZNu0dcjkJ7yg&s=VPldU_7pX8ccleusYK_YJ2P_Z9duECJ6fmtuy498rn8&e=>
>>>
>>>
>>>
>>> If that is the case, maybe someone can help me with a solution :
>>>
>>>
>>>
>>> Our use case is this:
>>>
>>>
>>>
>>> Our scripts are launched on a scheduled basis by the JVM
>>>
>>> Several class files are called throughout the execution of each script
>>>
>>> For each execution, we want the script and any called classes to share
>>> one log
>>>
>>> This means all logging configuration would have to be programmatic /
>>> dynamic
>>>
>>>
>>>
>>> The hope is that the script can define the log based on variables at
>>> execution time, and then the classes will somehow "Inherit" the variable
>>> from the script that called it.
>>>
>>>
>>>
>>> Does this seem possible?
>>>
>>>
>>>
>>> Regards,
>>>
>>> Jerry
>>>
>>>
>>>
>>
>>
>

Reply via email to