<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <base href="http://jira.qos.ch" /> 
        <title>Message Title</title> 
    </head> 
    <body class="jira" style="color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.429"> 
        <table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f5f5f5; border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt"> 
            <!-- header here --> 
            <tr> 
                <td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px"> 
                    <table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt"> 
                        <tr> 
                            <td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 8px"> <img id="header-avatar-image" class="image_fix" src="cid:jira-generated-image-avatar-805a76f9-867a-45c3-af0b-0900d6b6285d" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top" /> 
                            </td> 
                            <td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> <a class="user-hover" rel="forsel" id="email_forsel" href="http://jira.qos.ch/secure/ViewProfile.jspa?name=forsel" style="color:#3b73af;; color: #3b73af; text-decoration: none">Frans Orsel</a> <strong>created</strong> an issue 
                            </td> 
                        </tr> 
                    </table> 
                </td> 
            </tr> 
            <tr> 
                <td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px"> 
                    <table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-spacing: 0; border-collapse: separate"> 
                        <tr> 
                            <!-- there needs to be content in the cell for it to render in some clients --> 
                            <td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 15px; background-color: #fff; border-left: 1px solid #ccc; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px; height: 10px; line-height: 10px; padding: 0 15px 0 16px; mso-line-height-rule: exactly">
                                 
                            </td> 
                        </tr> 
                        <tr> 
                            <td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff"> 
                                <table class="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt"> 
                                    <tr> 
                                        <td class="page-title-pattern-first-line " style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; padding-top: 10px"> <a href="http://jira.qos.ch/browse/LOGBACK" style="color: #3b73af; text-decoration: none">logback</a> / <a href="http://jira.qos.ch/browse/LOGBACK-1118" style="color: #3b73af; text-decoration: none"><img src="cid:jira-generated-image-static-bug-c3430d20-c290-452e-95d0-fdd857250df4" height="16" width="16" border="0" align="absmiddle" alt="Bug" style="vertical-align: text-bottom" /></a> <a href="http://jira.qos.ch/browse/LOGBACK-1118" style="color: #3b73af; text-decoration: none">LOGBACK-1118</a> 
                                        </td> 
                                    </tr> 
                                    <tr> 
                                        <td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" class="page-title-pattern-header-container"> <span class="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"> <a href="http://jira.qos.ch/browse/LOGBACK-1118" style="color: #3b73af; text-decoration: none">logback.groovy/Gaffer variable scope is broken</a> </span> 
                                        </td> 
                                    </tr> 
                                </table> 
                            </td> 
                        </tr> 
                        <tr> 
                            <td class="email-content-main mobile-expand  wrapper-special-margin" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 10px; padding-bottom: 5px"> 
                                <table class="keyvalue-table" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt"> 
                                    <tr> 
                                        <th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
                                            Issue Type:
                                        </th> 
                                        <td class="has-icon" style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <img src="cid:jira-generated-image-static-bug-c3430d20-c290-452e-95d0-fdd857250df4" height="16" width="16" border="0" align="absmiddle" alt="Bug" style="vertical-align: text-bottom" /> Bug 
                                        </td> 
                                    </tr> 
                                    <tr> 
                                        <th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
                                            Affects Versions:
                                        </th> 
                                        <td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
                                             1.1.3 
                                        </td> 
                                    </tr> 
                                    <tr> 
                                        <th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
                                            Assignee:
                                        </th> 
                                        <td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <a class="user-hover" rel="logback-dev@qos.ch" id="email_logback-dev@qos.ch" href="http://jira.qos.ch/secure/ViewProfile.jspa?name=logback-dev%40qos.ch" style="color:#3b73af;; color: #3b73af; text-decoration: none">Logback dev list</a> 
                                        </td> 
                                    </tr> 
                                    <tr> 
                                        <th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
                                            Components:
                                        </th> 
                                        <td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
                                             logback-classic 
                                        </td> 
                                    </tr> 
                                    <tr> 
                                        <th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
                                            Created:
                                        </th> 
                                        <td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
                                             31/Dec/15 12:36 PM 
                                        </td> 
                                    </tr> 
                                    <tr> 
                                        <th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
                                            Priority:
                                        </th> 
                                        <td class="has-icon" style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <img src="cid:jira-generated-image-static-major-2adc240c-0d12-4c03-8567-886d9c178558" height="16" width="16" border="0" align="absmiddle" alt="Major" style="vertical-align: text-bottom" /> Major 
                                        </td> 
                                    </tr> 
                                    <tr> 
                                        <th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
                                            Reporter:
                                        </th> 
                                        <td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <a class="user-hover" rel="forsel" id="email_forsel" href="http://jira.qos.ch/secure/ViewProfile.jspa?name=forsel" style="color:#3b73af;; color: #3b73af; text-decoration: none">Frans Orsel</a> 
                                        </td> 
                                    </tr> 
                                </table> 
                            </td> 
                        </tr> 
                        <tr> 
                            <td class="email-content-main mobile-expand  issue-description-container" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 5px; padding-bottom: 10px"> 
                                <table class="text-paragraph-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 2px"> 
                                    <tr> 
                                        <td class="text-paragraph-pattern-container mobile-resize-text " style="padding: 0px; border-collapse: collapse; padding: 0 0 10px 0"> 
                                            <p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The normal variable scope as expected in Groovy scripts does not work properly in logback.groovy. Declared variables are accessible in all parts of the script, whereas fields (using @Field annotation) and undeclared variables are only accessible in the top-level code and not in any pre-defined closures.</p> 
                                            <p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The following sample logback.groovy shows this behaviour:</p> 
                                            <div class="code panel" style="border-width: 1px;; border: 1px solid #ccc; background: #f5f5f5; font-size: 12px; line-height: 1.333; font-family: monospace; border: 1px solid #ccc; -moz-border-radius: 3px 3px 3px 3px; border-radius: 3px 3px 3px 3px; margin: 9px 0">
                                                <div class="codeContent panelContent" style="padding: 9px 12px"> 
                                                    <pre class="code-java" style="margin: 10px 0 0 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
<span class="code-keyword" style="color: #000091">import</span> groovy.transform.Field

<span class="code-comment" style="color: #808080">// declared variable, will go into run method of compiled script class
</span>def PATH1 = <span class="code-quote" style="color: #009100">"dir1"</span>
<span class="code-comment" style="color: #808080">// declared field, will become a field of compiled script class
</span>@Field
def PATH2 = <span class="code-quote" style="color: #009100">"dir2"</span>
<span class="code-comment" style="color: #808080">// undeclared variable, will go into script binding
</span>PATH3 = <span class="code-quote" style="color: #009100">"dir3"</span>

appender(<span class="code-quote" style="color: #009100">"FILE"</span>, FileAppender) {
  file = <span class="code-quote" style="color: #009100">"/${PATH1}/${PATH2}/${PATH3}/mylog.log"</span>
  encoder(PatternLayoutEncoder) {
    pattern = <span class="code-quote" style="color: #009100">"%msg%n"</span>
  }
}
root(DEBUG, [<span class="code-quote" style="color: #009100">"FILE"</span>])
</pre> 
                                                </div>
                                            </div> 
                                            <p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The expected file path would be <tt>/dir1/dir2/dir3/mylog.log</tt>, but instead it is set to <tt>/dir1/null/null/mylog.log</tt></p> 
                                            <p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The following sample is a normal groovy script that shows scoping rules:</p> 
                                            <div class="code panel" style="border-width: 1px;; border: 1px solid #ccc; background: #f5f5f5; font-size: 12px; line-height: 1.333; font-family: monospace; border: 1px solid #ccc; -moz-border-radius: 3px 3px 3px 3px; border-radius: 3px 3px 3px 3px; margin: 9px 0">
                                                <div class="codeContent panelContent" style="padding: 9px 12px"> 
                                                    <pre class="code-java" style="margin: 10px 0 0 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
<span class="code-keyword" style="color: #000091">import</span> groovy.transform.Field

def PATH1 = <span class="code-quote" style="color: #009100">"dir1"</span>
@Field
def PATH2 = <span class="code-quote" style="color: #009100">"dir2"</span>
PATH3 = <span class="code-quote" style="color: #009100">"dir3"</span>

<span class="code-object" style="color: #910091">String</span> method1(Closure clos) {
        println <span class="code-quote" style="color: #009100">"Inside method1"</span>
        println <span class="code-quote" style="color: #009100">"/<not in scope>/${PATH2}/${PATH3}/mylog.log"</span>
        clos()
}

clos1 = {clos ->
        println <span class="code-quote" style="color: #009100">"Inside clos1"</span>
        println <span class="code-quote" style="color: #009100">"/${PATH1}/${PATH2}/${PATH3}/mylog.log"</span>
        clos()
}
        
println <span class="code-quote" style="color: #009100">"Script top-level code"</span>
        println <span class="code-quote" style="color: #009100">"/${PATH1}/${PATH2}/${PATH3}/mylog.log"</span>

method1({
        println <span class="code-quote" style="color: #009100">"Closure passed into method1"</span>
        println <span class="code-quote" style="color: #009100">"/${PATH1}/${PATH2}/${PATH3}/mylog.log"</span>
        })

clos1({
        println <span class="code-quote" style="color: #009100">"Closure passed into clos1"</span>
        println <span class="code-quote" style="color: #009100">"/${PATH1}/${PATH2}/${PATH3}/mylog.log"</span>
        })

</pre> 
                                                </div>
                                            </div> 
                                            <p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">All printed paths show up as <tt>/dir1/dir2/dir3/mylog.log</tt> (expect for the println in method1 as PATH1 is not in scope as local variable of the script run method). This means that the different types of variables can be resolved, whether they are used in a closure passed into a method or into another closure.</p> 
                                            <p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">I found that the cause of this is in the <tt>ComponentDelegate</tt> class. All logback configuration components are represented as closures and the <tt>ComponentDelegate</tt> class is set as delegate of each component. The delegation strategy is changed to <tt>DELEGATE_FIRST</tt>, so that component specific fields and methods can be handled by <tt>ComponentDelegate</tt> via the <tt>missingMethod</tt> and <tt>missingProperty</tt> methods. However, when a property or method is found to be component specific , the code logs an error and simply returns. Choosing strategy <tt>DELEGATE_FIRST</tt>, would mean that if the delegate cannot find the method/field, the owner should be checked next. This is not done, because of the return. Instead, <tt>ComponentDelegate</tt> should throw a <tt>MissingMethodException</tt>/<tt>MissingPropertyException</tt>. This signals to the <tt>Closure</tt> (class) code that it should continue looking for the missing method/field. And this is where the field or undeclared variable are then found.</p> 
                                            <p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">Note that the strange behaviour for the hostname variable (a binding variable) as described in the documentation and also in <a href="http://jira.qos.ch/browse/LOGBACK-488" title="HOSTNAME property not resolved" class="issue-link" data-issue-key="LOGBACK-488" style="color: #3b73af; text-decoration: none"></a></p>
                                            <del>
                                                LOGBACK-488
                                            </del> is caused by this as well. After applying the above fix, hostname simply resolves even when it is used in a closure. 
                                            <p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">I have made a fix where both return statements are replaced with throwing mentioned exceptions. As the 2 error logs are no longer necessarily applicable, I have removed them (gave too much clutter in my opinion). Instead, for the <tt>MissingPropertyException</tt>, the same string as for the error log is used and eventually, if the property is never found, the same message comes out as an exception. The <tt>MissingMethodException</tt> has a fixed constructor signature, therefore this is followed. If a method is used, that is not found as part of the component (e.g. appender, encoder, etc) and not present in the script, then the not-found method comes out as an exception.<br /> In the same fix, I have updated 2 unit test input files as they referred to an unknown variable p. Before this would print out null, now it gives an exception back. Instead, I opted to print out the hostname variable instead.<br /> Also, I have updated the site documentation by removing the extra HOSTNAME workaround and by adding a section that explains about variable scope.</p> 
                                        </td> 
                                    </tr> 
                                </table> 
                            </td> 
                        </tr> 
                        <tr> 
                            <td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff"> 
                                <table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> 
                                    <tr> 
                                        <td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 10px 0 10px 24px; vertical-align: middle; padding-left: 0"> 
                                            <table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt"> 
                                                <tr> 
                                                    <td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"> <a href="http://jira.qos.ch/browse/LOGBACK-1118#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="cid:jira-generated-image-static-comment-icon-2f457ccf-fa9b-47e0-b5cf-0aea9bdf5035" alt="Add Comment" title="Add Comment" height="16" width="16" border="0" style="vertical-align: middle" /> </a> 
                                                    </td> 
                                                    <td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px"> <a href="http://jira.qos.ch/browse/LOGBACK-1118#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none">Add Comment</a> 
                                                    </td> 
                                                </tr> 
                                            </table> 
                                        </td> 
                                    </tr> 
                                </table> 
                            </td> 
                        </tr> 
                        <!-- there needs to be content in the cell for it to render in some clients --> 
                        <tr> 
                            <td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 5px; line-height: 5px; background-color: #fff; border-top: 0; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; mso-line-height-rule: exactly">
                                 
                            </td> 
                        </tr> 
                    </table> 
                </td> 
            </tr> 
            <tr> 
                <td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px"> 
                    <table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt"> 
                        <tr> 
                            <td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px">
                                 This message was sent by Atlassian JIRA <span id="footer-build-information">(v6.4.12#64027-<span title="e3691cc1283c0f3cef6d65d3ea82d47743692b57" data-commit-id="e3691cc1283c0f3cef6d65d3ea82d47743692b57}">sha1:e3691cc</span>)</span> 
                            </td> 
                            <td id="footer-pattern-logo-desktop-container" valign="top" style="padding: 0px; border-collapse: collapse; padding-left: 20px; vertical-align: top"> 
                                <table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt"> 
                                    <tr> 
                                        <td id="footer-pattern-logo-desktop-padding" style="padding: 0px; border-collapse: collapse; padding-top: 3px"> <img id="footer-pattern-logo-desktop" src="cid:jira-generated-image-static-footer-desktop-logo-f3b2a374-1194-400e-a46f-a8d6ffd95a8d" alt="Atlassian logo" title="Atlassian logo" width="169" height="36" class="image_fix" /> 
                                        </td> 
                                    </tr> 
                                </table> 
                            </td> 
                        </tr> 
                    </table> 
                </td> 
            </tr> 
        </table>   
    </body>
</html>