You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Pavel Pereslegin (JIRA)" <ji...@apache.org> on 2018/10/11 16:38:00 UTC

[jira] [Updated] (IGNITE-8570) Create lighter version of GridStringLogger

     [ https://issues.apache.org/jira/browse/IGNITE-8570?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Pavel Pereslegin updated IGNITE-8570:
-------------------------------------
    Description: 
_+Problem with current GridStringLogger implementation+_: 
 Most usages of {{GridStringLogger}} in test assumes the following scenario. First, it is set as a logger for some Ignite node. 
 Then, after some activity on that node, log content is searched for some predefined strings. 
 {{GridStringLogger}} uses {{StringBuilder}} of bounded size internally to store log contents, older contents gets dropped on exaustion. 
 Thus, changes that add more logging may damage some independent tests that use {{GridStringLogger}}.

 

+_The suggestion for new implementation:_+
 The suggestion is to implement and use another test logger conforming to these requirements:
 * It does not accumulate any logs(actually, it will print no logs to anywhere)
 * It allows to set the listener that fires when log message matches certain regular expression,

_+Proposed design+_, pseudocode:

```
 public class ListeningTestLogger implements IgniteLogger {
 …
    public void registerListener(Consumer<String> lsnr);

    public void unregisterListener(Consumer<String> lsnr);
    
    public void clearListeners();
…
 }
 ```
In 99.9% cases we at some point we should validate listener precondition. For example, default precondition for {{substring listener}} - "_does log have any messages containing such substring?_". So, listener should support validation. 

```
interface LogListener extends Consumer<String> {
    void check() throws AssertionError;
}
```

To simplify creation of common case listeners (substring, regular expression and predicate) should be introduced special listener builder.

+_Sample logger usage_+:

```
ListeningTestLogger log = new ListeningTestLogger(false, super.log);
// Create listener that should match "hello" (2 times) and "Ignite" (case insensitive, at least one time)
LogListener lsnr = LogListener.matches("hello").times(2).andMatches(Pattern.compile(""(?i)ignite")).build();
log.registerListener(lsnr);
...
lsnr.check();
```

  was:
_+Problem with current GridStringLogger implementation+_: 
 Most usages of {{GridStringLogger}} in test assumes the following scenario. First, it is set as a logger for some Ignite node. 
 Then, after some activity on that node, log content is searched for some predefined strings. 
 {{GridStringLogger}} uses {{StringBuilder}} of bounded size internally to store log contents, older contents gets dropped on exaustion. 
 Thus, changes that add more logging may damage some independent tests that use {{GridStringLogger}}.

 

+_The suggestion for new implementation:_+
 The suggestion is to implement and use another test logger conforming to these requirements:
 * It does not accumulate any logs(actually, it will print no logs to anywhere)
 * It allows to set the listener that fires when log message matches certain regular expression, {{Matcher}} can be passed to the listener

 

_+Proposed design+_, pseudocode:

```
 Class GridRegexpLogger implements IgniteLogger{
 …
 debug(String str){
 if (/* str matches pattern. */)
   \{ /* notify listeners. */ }
}
 …
 listen("regexp", IgniteInClosure<String> loggerListener)// listener receives message
{ /* registers listener. */ }

listenDebug("regexp", loggerListener)
{ /* registers listener for debug output only. */ }

…
 }
 ```

+_Sample regexp logger usage_+:

```
 GridRegexpLogger logger;

logger.listen(“regexp”, new GridRegexpListener());
logger.listenDebug("regexp", new GridRegexpListener());
 ```


> Create lighter version of GridStringLogger
> ------------------------------------------
>
>                 Key: IGNITE-8570
>                 URL: https://issues.apache.org/jira/browse/IGNITE-8570
>             Project: Ignite
>          Issue Type: Improvement
>    Affects Versions: 2.4
>            Reporter: Andrey Kuznetsov
>            Assignee: Pavel Pereslegin
>            Priority: Major
>             Fix For: 2.8
>
>
> _+Problem with current GridStringLogger implementation+_: 
>  Most usages of {{GridStringLogger}} in test assumes the following scenario. First, it is set as a logger for some Ignite node. 
>  Then, after some activity on that node, log content is searched for some predefined strings. 
>  {{GridStringLogger}} uses {{StringBuilder}} of bounded size internally to store log contents, older contents gets dropped on exaustion. 
>  Thus, changes that add more logging may damage some independent tests that use {{GridStringLogger}}.
>  
> +_The suggestion for new implementation:_+
>  The suggestion is to implement and use another test logger conforming to these requirements:
>  * It does not accumulate any logs(actually, it will print no logs to anywhere)
>  * It allows to set the listener that fires when log message matches certain regular expression,
> _+Proposed design+_, pseudocode:
> ```
>  public class ListeningTestLogger implements IgniteLogger {
>  …
>     public void registerListener(Consumer<String> lsnr);
>     public void unregisterListener(Consumer<String> lsnr);
>     
>     public void clearListeners();
> …
>  }
>  ```
> In 99.9% cases we at some point we should validate listener precondition. For example, default precondition for {{substring listener}} - "_does log have any messages containing such substring?_". So, listener should support validation. 
> ```
> interface LogListener extends Consumer<String> {
>     void check() throws AssertionError;
> }
> ```
> To simplify creation of common case listeners (substring, regular expression and predicate) should be introduced special listener builder.
> +_Sample logger usage_+:
> ```
> ListeningTestLogger log = new ListeningTestLogger(false, super.log);
> // Create listener that should match "hello" (2 times) and "Ignite" (case insensitive, at least one time)
> LogListener lsnr = LogListener.matches("hello").times(2).andMatches(Pattern.compile(""(?i)ignite")).build();
> log.registerListener(lsnr);
> ...
> lsnr.check();
> ```



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)