[ 
https://issues.apache.org/jira/browse/IGNITE-8570?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16534902#comment-16534902
 ] 

Alexey Kuznetsov commented on IGNITE-8570:
------------------------------------------

[~andrey-kuznetsov] [~agura] hi

I have a concern regarding logger implementation, its as follows
when listeners are set :
{code:java}
log.listenError("regexp", loggerListener);//listens only error messages
log.listenWarning("regexp", loggerListener);// only warning messages
{code}
Both listeners are stored in common list.

When messages are logged:
{code:java}
log.debug("")
log.error("");
log.warning("")
{code}
then list of listeners is traversed every time the message is logged.
This brings great performance drop. 
Imagine if we want to listen only warnings, and when node is started all info 
and debug loggings are executed and list is traversed every time.

The better solution would be to have 5 lists for : error, debug, warning, info, 
trace levels.
And when 
{code:java}
log.listenWarning
{code} is called, listener is added to warning-list.
In this case no performance drop.

What do you think on the second solution ?



> 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: Alexey Kuznetsov
>            Priority: Major
>             Fix For: 2.7
>
>
> _+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", loggerListener)
> { /* registers listener. */ }
> listenDebug("regexp", loggerListener)
> { /* registers listener for debug output only. */ }
> …
> waitFor("regexp", timeout)
> { /* like GridTestUtils.waitForCondition(), waits for regexp to occure in 
> logs. */ }
> …
>  }
>  ```
> +_Sample regexp logger usage_+:
> ```
>  GridRegexpLogger logger;
> logger.listen(“regexp”, new GridRegexpListener());
>  logger.waitFor("regexp", 100);
>  ```



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

Reply via email to