Project at job (written in Java) uses: 1. spring-context 5.0.6 2. spring-test 5.0.6 3. log4j-api 2.11 4. log4j-core 2.11 5. log4j-jcl (as a bridge to get log events from Spring's bowels and to utilize logger in test classes, obtained from extending *AbstractTestNGSpringContextTests*) 6.
... and some other dependencies like Selenium, MyBatis, TestNG to write autotests ... So, I wrote YAML configuration file and everything works as I want (loggers bind to appenders, appenders write log data to files), but root logger consumes all log events from child loggers even if its own log level is WARN and child's one is DEBUG or TRACE. Of course, I can use workaround - simply set *additivity* to *false*, but I don't like to turn off log event propagation - it is quite useful and that's why I want root logger to behave as expected by default - to pass *more* specific log levels and ignore *less* specific log events from the child loggers. Clarify this, please. Thanks in advance. *YAML configuration file: * Configuration: name: samsonpost-logging-configuration Properties: Property: name: log-path value: "logs" Appenders: Console: name: stdout target: SYSTEM_OUT PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n" File: - name: sp_sql filename: ${log-path}/sp_sql.log append: false immediateFlush: true PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n" - name: php_execute_script filename: ${log-path}/php_execute_script.log append: false PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n" - name: js_execute_script filename: ${log-path}/js_execute_script.log append: false PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n" - name: test filename: ${log-path}/test.log append: false PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n" - name: log_files_operation filename: ${log-path}/log_files_operation.log append: false PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n" - name: webdriver filename: ${log-path}/webdriver.log append: false PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n" Loggers: Root: level: WARN AppenderRef: ref: stdout Logger: - name: ExecutePHPScript level: DEBUG AppenderRef: ref: php_execute_script - name: ExecuteJSScript level: DEBUG AppenderRef: ref: js_execute_script - name: services level: INFO AppenderRef: ref: test - name: db.entity.sp.core level: DEBUG additivity: false AppenderRef: ref: sp_sql - name: wd level: DEBUG additivity: false AppenderRef: ref: webdriver *POM.xml* <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>samsonpost</groupId> <artifactId>samsonpost-htmlelements</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <aspectj.version>1.8.5</aspectj.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <org.springframework.version>5.0.6.RELEASE</org.springframework.version> </properties> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>ru.yandex.qatools.htmlelements</groupId> <artifactId>htmlelements-java</artifactId> <version>1.19</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.12.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.33</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>2.9.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>2.11.0</version> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.21.0</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-testng</artifactId> <version>2.21.0</version> </dependency> </dependencies> </plugin> </plugins> </build></project> *Example of a test class:* package services.requestInt; import common.UserID;import constants.UrlsConst;import db.entity.sp.services.requestInt.RequestIntService;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;import org.testng.annotations.Test;import po.sp.blocks.popUpWindow.SelectionPopUp;import po.sp.blocks.popUpWindow.elements.SelectUserPopUpElements;import po.sp.pages.authorization.AuthorizePage;import po.sp.pages.services.documents.softdev.IntCreateNewOrderPage;import po.sp.pages.services.documents.softdev.IntDetailOrderPage;import po.sp.pages.services.documents.softdev.IntListOrderPage;import project.init.SpringConfiguration;import wd.wait.DriverWaitElement; import static constants.UrlsConst.LIST_REQUEST_INT_PORTAL;import static services.requestInt.cfg.RequestIntMissionProperty.*; @ContextConfiguration(classes = SpringConfiguration.class)public class RejectOrderByManagerOrApprover extends AbstractTestNGSpringContextTests { @Autowired private IntListOrderPage intListOrderPage; @Autowired private IntCreateNewOrderPage intCreateNewOrderPage; @Autowired private IntDetailOrderPage intDetailOrderPage; @Autowired private SelectionPopUp<SelectUserPopUpElements> popUpSelectUser; @Autowired private AuthorizePage authorizePage; @Autowired private WebDriver driver; @Autowired private RequestIntService requestIntService; private Integer orderOrdinalNumber; @Test public void createOrder() { logger.info("Создаём заказ под Грибановым и отправляем менеджеру на согласование"); authorizePage.authById(UserID.GRIBANOV.getUserId()); driver.get(LIST_REQUEST_INT_PORTAL); DriverWaitElement.waitElementToBeClickable(driver, By.xpath(".//a[@for-tests='link-create']"), 15); intListOrderPage.createNewOrder(); driver.switchTo().frame(driver.findElement(By.cssSelector(".side-panel-iframe"))); intCreateNewOrderPage.selectProject(PROJECT_NAME); intCreateNewOrderPage.setProblem(SITE_PROBLEM); intCreateNewOrderPage.setSolution(SITE_SOLUTION); intCreateNewOrderPage.addApprover(); popUpSelectUser.setUser("Верещагин"); popUpSelectUser.clickUserById(UserID.VERETSHAGIN); intCreateNewOrderPage.saveOrder(); intDetailOrderPage.sendToManagerForApproval(); } @Test(dependsOnMethods = "createOrder") public void rejectByManager() { logger.info("Авторизуемся под менеджером (Новосельцев) и отклоняем заказ"); authorizePage.authById(UserID.NOVOSELTSEV.getUserId()); orderOrdinalNumber = Integer.valueOf(requestIntService.findLastRequest().getCode()); driver.get(UrlsConst.DETAIL_REQUEST_INT_PORTAL + orderOrdinalNumber.toString() + "&IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER"); intDetailOrderPage.clickButtonRejectByManager(); // Авторизуемся под Грибановым, вводим описание проблемы logger.info("Авторизуемся под Грибановым, вводим описание проблемы, отправляем менеджеру на согласование"); authorizePage.authById(UserID.GRIBANOV.getUserId()); driver.get(UrlsConst.DETAIL_REQUEST_INT_PORTAL + orderOrdinalNumber.toString() + "&IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER"); intDetailOrderPage.clickButtonEdit(); intCreateNewOrderPage.setProblem(SITE_REJECT_PROBLEM); intCreateNewOrderPage.attachFile(FILE_UPLOAD); intCreateNewOrderPage.saveOrder(); intDetailOrderPage.sendToManagerForApproval(); // Авторизуемся под Новосельцевым и согласовываем logger.info("Авторизуемся под мендежером (Новосельцев) и согласовываем"); authorizePage.authById(UserID.NOVOSELTSEV.getUserId()); driver.get(UrlsConst.DETAIL_REQUEST_INT_PORTAL + orderOrdinalNumber.toString() + "&IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER"); intDetailOrderPage.clickButtonApprove(); // Авторизуемся под Верещагиным и отклоняем logger.info("Авторизуемся под Верещагиным и отклоняем"); authorizePage.authById(UserID.VERETSHAGIN.getUserId()); driver.get(UrlsConst.DETAIL_REQUEST_INT_PORTAL + orderOrdinalNumber.toString() + "&IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER"); intDetailOrderPage.setCommentToTask("Захотел и отменил!"); intDetailOrderPage.clickButtonRejectByApprover(); // Авторизуемся под Грибановым logger.info("Авторизуемся под Грибановым"); authorizePage.authById(UserID.GRIBANOV.getUserId()); driver.get(UrlsConst.DETAIL_REQUEST_INT_PORTAL + orderOrdinalNumber.toString() + "&IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER"); intDetailOrderPage.clickButtonEdit(); intCreateNewOrderPage.setProblem("Ну такое себе"); intCreateNewOrderPage.saveOrder(); }} *stdout output:* "C:\Program Files\Java\jdk-9.0.4\bin\java" -ea -Dspring.profiles.active=chrome -Dlog4j2.disableJmx=true -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=53036:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\plugins\testng\lib\testng-plugin.jar;D:\samsonpost\target\test-classes;D:\samsonpost\target\classes;C:\Users\glukhov\.m2\repository\ru\yandex\qatools\htmlelements\htmlelements-java\1.19\htmlelements-java-1.19.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-java\3.12.0\selenium-java-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-api\3.12.0\selenium-api-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-chrome-driver\3.12.0\selenium-chrome-driver-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-edge-driver\3.12.0\selenium-edge-driver-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-firefox-driver\3.12.0\selenium-firefox-driver-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-ie-driver\3.12.0\selenium-ie-driver-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-opera-driver\3.12.0\selenium-opera-driver-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-remote-driver\3.12.0\selenium-remote-driver-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-safari-driver\3.12.0\selenium-safari-driver-3.12.0.jar;C:\Users\glukhov\.m2\repository\org\seleniumhq\selenium\selenium-support\3.12.0\selenium-support-3.12.0.jar;C:\Users\glukhov\.m2\repository\net\bytebuddy\byte-buddy\1.8.3\byte-buddy-1.8.3.jar;C:\Users\glukhov\.m2\repository\org\testng\testng\6.14.3\testng-6.14.3.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-context\5.0.6.RELEASE\spring-context-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-aop\5.0.6.RELEASE\spring-aop-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-beans\5.0.6.RELEASE\spring-beans-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-core\5.0.6.RELEASE\spring-core-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-jcl\5.0.6.RELEASE\spring-jcl-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-expression\5.0.6.RELEASE\spring-expression-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-tx\5.0.6.RELEASE\spring-tx-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-test\5.0.6.RELEASE\spring-test-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\org\springframework\spring-jdbc\5.0.6.RELEASE\spring-jdbc-5.0.6.RELEASE.jar;C:\Users\glukhov\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.5\jackson-databind-2.9.5.jar;C:\Users\glukhov\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\glukhov\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.5\jackson-core-2.9.5.jar;C:\Users\glukhov\.m2\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.9.5\jackson-dataformat-yaml-2.9.5.jar;C:\Users\glukhov\.m2\repository\org\yaml\snakeyaml\1.18\snakeyaml-1.18.jar;C:\Users\glukhov\.m2\repository\org\apache\logging\log4j\log4j-jcl\2.11.0\log4j-jcl-2.11.0.jar;C:\Users\glukhov\.m2\repository\org\apache\logging\log4j\log4j-api\2.11.0\log4j-api-2.11.0.jar;C:\Users\glukhov\.m2\repository\org\apache\logging\log4j\log4j-core\2.11.0\log4j-core-2.11.0.jar;C:\Users\glukhov\.m2\repository\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar;C:\Users\glukhov\.m2\repository\org\apache\commons\commons-exec\1.3\commons-exec-1.3.jar;C:\Users\glukhov\.m2\repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;C:\Users\glukhov\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\glukhov\.m2\repository\com\google\code\gson\gson\2.8.2\gson-2.8.2.jar;C:\Users\glukhov\.m2\repository\com\google\guava\guava\23.6-jre\guava-23.6-jre.jar;C:\Users\glukhov\.m2\repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;C:\Users\glukhov\.m2\repository\org\checkerframework\checker-compat-qual\2.0.0\checker-compat-qual-2.0.0.jar;C:\Users\glukhov\.m2\repository\com\google\errorprone\error_prone_annotations\2.1.3\error_prone_annotations-2.1.3.jar;C:\Users\glukhov\.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;C:\Users\glukhov\.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.14\animal-sniffer-annotations-1.14.jar;C:\Users\glukhov\.m2\repository\org\apache\httpcomponents\httpclient\4.5.3\httpclient-4.5.3.jar;C:\Users\glukhov\.m2\repository\org\apache\httpcomponents\httpcore\4.4.6\httpcore-4.4.6.jar;C:\Users\glukhov\.m2\repository\com\squareup\okhttp3\okhttp\3.9.1\okhttp-3.9.1.jar;C:\Users\glukhov\.m2\repository\com\squareup\okio\okio\1.13.0\okio-1.13.0.jar;C:\Users\glukhov\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;C:\Users\glukhov\.m2\repository\com\beust\jcommander\1.72\jcommander-1.72.jar;C:\Users\glukhov\.m2\repository\org\apache-extras\beanshell\bsh\2.0b6\bsh-2.0b6.jar;C:\Users\glukhov\.m2\repository\com\alibaba\fastjson\1.2.33\fastjson-1.2.33.jar;C:\Users\glukhov\.m2\repository\org\mybatis\mybatis-spring\1.3.2\mybatis-spring-1.3.2.jar;C:\Users\glukhov\.m2\repository\org\mybatis\mybatis\3.4.6\mybatis-3.4.6.jar;C:\Users\glukhov\.m2\repository\org\aspectj\aspectjweaver\1.8.13\aspectjweaver-1.8.13.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\plugins\testng\lib\jcommander.jar" org.testng.RemoteTestNGStarter -usedefaultlisteners false -socket53035 @w@C:\Users\glukhov\AppData\Local\Temp2\idea_working_dirs_testng.tmp -temp C:\Users\glukhov\AppData\Local\Temp2\idea_testng.tmp WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (file:/C:/Users/glukhov/.m2/repository/org/springframework/spring-core/5.0.6.RELEASE/spring-core-5.0.6.RELEASE.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future releaseStarting ChromeDriver 2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb) on port 3968Only local connections are allowed.июн. 07, 2018 5:15:40 ПП org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS2018-06-07 17:15:41,448 INFO - Создаём заказ под Грибановым и отправляем менеджеру на согласование2018-06-07 17:16:28,646 INFO - Авторизуемся под менеджером (Новосельцев) и отклоняем заказ2018-06-07 17:16:40,269 INFO - Авторизуемся под Грибановым, вводим описание проблемы, отправляем менеджеру на согласование2018-06-07 17:17:18,522 INFO - Авторизуемся под мендежером (Новосельцев) и согласовываем2018-06-07 17:17:28,654 INFO - Авторизуемся под Верещагиным и отклоняем2018-06-07 17:17:40,732 INFO - Авторизуемся под Грибановым ===============================================Default SuiteTotal tests run: 2, Failures: 0, Skips: 0=============================================== Process finished with exit code 0