'All logs are not going to file when file logging enabled

I am trying to configure log4j2 programmatically and i am facing issue with logs coming from my cluster.

Here is the case, when user enable file logging (by passing log path as parameter in this case) all logs should go to File, no console logs. When use disable file logging, all logging should go to console. So I am trying in this:

 public static void initializeLogging(
            boolean vNewVerboseDebugLogging, String vLoggingPath, String vNewWarehouseQueriesLogPath,
            boolean vNoConsoleLogging, boolean vIsEmbeddedHive, boolean isTestSubmission, boolean YarnLogs, boolean debugLogs) throws IOException
    {
    String[] packageGrp = {"org.apache","hive.ql","com.cdcb.cstone"};// this i am using to turn off logging from other packages/classes
    if(vLoggingPath!=null) {
        ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
        RootLoggerComponentBuilder rootLogger = builder.newRootLogger(debugLogs?Level.DEBUG:Level.INFO).addAttribute("additivity", true);
        LayoutComponentBuilder layoutComponentBuilder = builder.newLayout("PatternLayout").addAttribute("pattern",
                (isTestSubmission)?"%-5p [%t]: %m%n":"%d %-5p [%t]: %m%n");
        AppenderComponentBuilder fileAppenderBuilder;
        fileAppenderBuilder = builder.newAppender("LogToRollingFile", "RollingFile")
                .addAttribute("fileName", vLoggingPath)
                .addAttribute("filePattern", vLoggingPath + "-%d{MM-dd-yy-HH}.log")
                .add(layoutComponentBuilder)
                .addComponent(builder.newComponent("Policies")
                        .addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("interval", "1")));
        /*builder.newLogger("com.cdcb.idn.HadoopCluster", (vVerboseDebugLogging)?Level.DEBUG:Level.INFO)
                .add(builder.newAppenderRef("LogToRollingFile"))
                .addAttribute("additivity", false);*/
        for(String packNm: packageGrp)
            addNewLoggerComponent(builder,packNm,builder.newAppenderRef("LogToRollingFile"),Level.OFF);
        builder.add(fileAppenderBuilder);
        rootLogger.add(builder.newAppenderRef("LogToRollingFile"));
        builder.add(rootLogger);
        Configurator.initialize(builder.build()).updateLoggers();
    } else {
        ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
        RootLoggerComponentBuilder rootLogger = builder.newRootLogger(debugLogs?Level.DEBUG:Level.INFO);
        LayoutComponentBuilder layoutComponentBuilder = builder.newLayout("PatternLayout").addAttribute("pattern",
                (isTestSubmission)?"%-5p [%t]: %m%n":"%d %-5p [%t]: %m%n");
        AppenderComponentBuilder vConsoleInfo;
        AppenderComponentBuilder vConsoleProblems;
        if (!vIsEmbeddedHive){
            vConsoleProblems = builder.newAppender("consoleProb", "CONSOLE")
                    .addAttribute("target", ConsoleAppender.Target.SYSTEM_ERR)
                    .add(layoutComponentBuilder);
            builder.newLogger("com.cdcb.idn.HadoopCluster", (vVerboseDebugLogging)?Level.DEBUG:Level.INFO)
                    .add(builder.newAppenderRef("consoleProb"))
                    .addAttribute("additivity", false);
            for(String packNm: packageGrp)
                addNewLoggerComponent(builder,packNm,builder.newAppenderRef("consoleProb"),Level.OFF);
            builder.add(vConsoleProblems);
            rootLogger.add(builder.newAppenderRef("consoleProb"));
            builder.add(rootLogger);
        }
        vConsoleInfo = builder.newAppender("consoleInfo", "CONSOLE")
                .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT)
                .add(layoutComponentBuilder);
        /*builder.newLogger("com.cdcb.idn.HadoopCluster", (vVerboseDebugLogging)?Level.DEBUG:Level.INFO)
                .add(builder.newAppenderRef("consoleInfo"))
                .addAttribute("additivity", false);*/
        for(String packNm: packageGrp)
            addNewLoggerComponent(builder,packNm,builder.newAppenderRef("consoleInfo"),Level.OFF);
        builder.add(vConsoleInfo);
        rootLogger.add(builder.newAppenderRef("consoleInfo"));
        builder.add(rootLogger);
        Configurator.initialize(builder.build()).updateLoggers();
    }
    LOGGER = LogManager.getLogger(HadoopClusterLogging.class);
}

public static ConfigurationBuilder addNewLoggerComponent(ConfigurationBuilder builder, String name, AppenderRefComponentBuilder appenderReferences, Level level) {
        return builder.add(builder.newLogger(name, level)
                .add(appenderReferences)
                .addAttribute("additivity", false));
    }

but the issue here is, when file logging enabled, not all logs going to File, some going to console(for example, logs coming from hadoop cluster). What am i doing wrong here and how can i capture all logs to file when file logging enabled? can come one please help?

One more thing is, how can i disable transitive dependencies logging. Meaning, my logger should log my application logs only, not from from my dependencies. Thank you!



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source