private static void setUpExperimentalLogger(File pathF) throws IOException { Logger.getRootLogger().removeAllAppenders(); log.removeAllAppenders(); PropertyConfigurator.configure("resource/log4jproperties.txt"); FileAppender resultAppender = new FileAppender( new PatternLayout("%m"), new File(pathF, "result.txt").toString(), false); LevelRangeFilter infoFilter = new LevelRangeFilter(); infoFilter.setLevelMin(Level.INFO); infoFilter.setLevelMax(Level.FATAL); infoFilter.setAcceptOnMatch(true); resultAppender.addFilter(infoFilter); log.addAppender(resultAppender); Logger.getLogger(iBench.class).addAppender(resultAppender); }
/** * Creates new GridLog4jRollingFileAppender. * * @return GridLog4jRollingFileAppender. * @throws Exception If error occurred. */ private static Log4jRollingFileAppender createAppender() throws Exception { Log4jRollingFileAppender appender = new Log4jRollingFileAppender(); appender.setLayout(new PatternLayout("[%d{ISO8601}][%-5p][%t][%c{1}] %m%n")); appender.setFile("work/log/ignite.log"); appender.setName(Log4jRollingFileAppender.class.getSimpleName()); LevelRangeFilter lvlFilter = new LevelRangeFilter(); lvlFilter.setLevelMin(Level.DEBUG); lvlFilter.setLevelMax(Level.INFO); appender.addFilter(lvlFilter); return appender; }
/** * Sets up Log4J to write log messages to the console. Low-priority messages * are logged to stdout while high-priority messages go to stderr. */ private void initializeLogging() { // Since logging is static, make sure this is done only once even if // multiple clients are created (e.g., during tests) if (consoleAppender != null) { return; } consoleAppender = new ConsoleAppender(); consoleAppender.setLayout(new PatternLayout(LOG_PATTERN)); consoleAppender.setThreshold(Level.INFO); LevelRangeFilter filter = new LevelRangeFilter(); filter.setLevelMin(Level.TRACE); filter.setLevelMax(Level.INFO); consoleAppender.addFilter(filter); consoleAppender.activateOptions(); org.apache.log4j.Logger.getRootLogger().addAppender(consoleAppender); errorAppender = new ConsoleAppender(); errorAppender.setLayout(new PatternLayout(LOG_PATTERN)); errorAppender.setThreshold(Level.WARN); errorAppender.setTarget(ConsoleAppender.SYSTEM_ERR); errorAppender.activateOptions(); org.apache.log4j.Logger.getRootLogger().addAppender(errorAppender); }
/** * Defines an appender that writes INFO log messages to the console. */ public static void initConsoleLog() { ConsoleAppender consoleAppender = new ConsoleAppender(); consoleAppender.setName("ConsoleLogger"); consoleAppender.setLayout(new PatternLayout(" [%p] %d [%t] %x %c %M - %m%n")); LevelRangeFilter levelRangeFilter = new LevelRangeFilter(); levelRangeFilter.setLevelMax(Level.INFO); levelRangeFilter.setLevelMin(Level.INFO); consoleAppender.addFilter(levelRangeFilter); consoleAppender.activateOptions(); Logger.getRootLogger().addAppender(consoleAppender); }
/** * Defines an appender that writes INFO log messages to the console. */ public static void initConsoleLog() { ConsoleAppender consoleAppender = new ConsoleAppender(); consoleAppender.setName("ConsoleLogger"); consoleAppender.setLayout(new PatternLayout("[%-5p]\t%d\t%c\t%x\t-\t%m%n")); LevelRangeFilter levelRangeFilter = new LevelRangeFilter(); consoleAppender.addFilter(levelRangeFilter); consoleAppender.activateOptions(); Logger.getRootLogger().addAppender(consoleAppender); }
@BeforeClass public static void initLog4j() { BasicConfigurator.resetConfiguration(); BasicConfigurator.configure(); final Layout LAYOUT = new PatternLayout("[ %d{ISO8601} %-5p ] [%c{1}] %m%n"); LevelRangeFilter ERROR_FILTER = new LevelRangeFilter(); ERROR_FILTER.setLevelMin(Level.ERROR); ERROR_FILTER.setLevelMax(Level.FATAL); // everything including ERROR final Appender STDOUT = new ConsoleAppender(LAYOUT, ConsoleAppender.SYSTEM_OUT); // just things <= ERROR final Appender STDERR = new ConsoleAppender(LAYOUT, ConsoleAppender.SYSTEM_ERR); STDERR.addFilter(ERROR_FILTER); final Logger ROOT_LOGGER = Logger.getRootLogger(); ROOT_LOGGER.removeAllAppenders(); ROOT_LOGGER.setLevel(Level.WARN); // don't care about higher ROOT_LOGGER.addAppender(STDOUT); ROOT_LOGGER.addAppender(STDERR); }
public LevelRangeFilter createFilter(Level level) { LevelRangeFilter rangeFilter = new LevelRangeFilter(); rangeFilter.setLevelMin(level); rangeFilter.setLevelMax(Level.FATAL); rangeFilter.setAcceptOnMatch(true); return rangeFilter; }
public static void main(String[] args) throws TwitterException { PatternLayout layoutStandard = new PatternLayout(); layoutStandard.setConversionPattern("[%p] %d %c %M - %m%n"); PatternLayout layoutSimple = new PatternLayout(); layoutSimple.setConversionPattern("%m%n"); // Filter for the statuses: we only want INFO messages LevelRangeFilter filter = new LevelRangeFilter(); filter.setLevelMax(Level.INFO); filter.setLevelMin(Level.INFO); filter.setAcceptOnMatch(true); filter.activateOptions(); TimeBasedRollingPolicy statusesRollingPolicy = new TimeBasedRollingPolicy(); statusesRollingPolicy.setFileNamePattern("statuses.log" + HOUR_ROLL); statusesRollingPolicy.activateOptions(); RollingFileAppender statusesAppender = new RollingFileAppender(); statusesAppender.setRollingPolicy(statusesRollingPolicy); statusesAppender.addFilter(filter); statusesAppender.setLayout(layoutSimple); statusesAppender.activateOptions(); TimeBasedRollingPolicy warningsRollingPolicy = new TimeBasedRollingPolicy(); warningsRollingPolicy.setFileNamePattern("warnings.log" + HOUR_ROLL); warningsRollingPolicy.activateOptions(); RollingFileAppender warningsAppender = new RollingFileAppender(); warningsAppender.setRollingPolicy(statusesRollingPolicy); warningsAppender.setThreshold(Level.WARN); warningsAppender.setLayout(layoutStandard); warningsAppender.activateOptions(); ConsoleAppender consoleAppender = new ConsoleAppender(); consoleAppender.setThreshold(Level.WARN); consoleAppender.setLayout(layoutStandard); consoleAppender.activateOptions(); // configures the root logger Logger rootLogger = Logger.getRootLogger(); rootLogger.setLevel(Level.INFO); rootLogger.removeAllAppenders(); rootLogger.addAppender(consoleAppender); rootLogger.addAppender(statusesAppender); rootLogger.addAppender(warningsAppender); // creates a custom logger and log messages final Logger logger = Logger.getLogger(SimpleStreamCollector.class); TwitterStream twitterStream = new TwitterStreamFactory().getInstance(); RawStreamListener rawListener = new RawStreamListener() { @Override public void onMessage(String rawString) { cnt++; logger.info(rawString); if (cnt % 1000 == 0) { System.out.println(cnt + " messages received."); } } @Override public void onException(Exception ex) { logger.warn(ex); } }; twitterStream.addListener(rawListener); twitterStream.sample(); }
/** * Creates console appender with some reasonable default logging settings. * * @param maxLevel Max logging level. * @return New console appender. */ private Appender createConsoleAppender(Level maxLevel) { String fmt = "[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"; // Configure output that should go to System.out Appender app = new ConsoleAppender(new PatternLayout(fmt), ConsoleAppender.SYSTEM_OUT); LevelRangeFilter lvlFilter = new LevelRangeFilter(); lvlFilter.setLevelMin(Level.TRACE); lvlFilter.setLevelMax(maxLevel); app.addFilter(lvlFilter); return app; }
/** * Testcase for * <a href="http://jira.pentaho.com/browse/MONDRIAN-291"> * Bug MONDRIAN-291, "'unknown usage' messages"</a>. */ public void testUnknownUsages() { if (!MondrianProperties.instance().ReadAggregates.get()) { return; } final Logger logger = Logger.getLogger(AggTableManager.class); propSaver.setAtLeast(logger, org.apache.log4j.Level.WARN); final StringWriter sw = new StringWriter(); final Appender appender = new WriterAppender(new SimpleLayout(), sw); final LevelRangeFilter filter = new LevelRangeFilter(); filter.setLevelMin(org.apache.log4j.Level.WARN); appender.addFilter(filter); logger.addAppender(appender); try { final TestContext testContext = TestContext.instance().withSchema( "<?xml version=\"1.0\"?>\n" + "<Schema name=\"FoodMart\">\n" + "<Cube name=\"Sales Degen\">\n" + " <Table name=\"sales_fact_1997\">\n" + " <AggExclude pattern=\"agg_c_14_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_05_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_g_ms_pcat_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_ll_01_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_c_special_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_03_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_04_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_pl_01_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_lc_06_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_lc_100_sales_fact_1997\"/>\n" + " <AggName name=\"agg_c_10_sales_fact_1997\">\n" + " <AggFactCount column=\"fact_count\"/>\n" + " <AggMeasure name=\"[Measures].[Store Cost]\" column=\"store_cost\" />\n" + " <AggMeasure name=\"[Measures].[Store Sales]\" column=\"store_sales\" />\n" + " </AggName>\n" + " </Table>\n" + " <Dimension name=\"Time\" type=\"TimeDimension\" foreignKey=\"time_id\">\n" + " <Hierarchy hasAll=\"false\" primaryKey=\"time_id\">\n" + " <Table name=\"time_by_day\"/>\n" + " <Level name=\"Year\" column=\"the_year\" type=\"Numeric\" uniqueMembers=\"true\"\n" + " levelType=\"TimeYears\"/>\n" + " <Level name=\"Quarter\" column=\"quarter\" uniqueMembers=\"false\"\n" + " levelType=\"TimeQuarters\"/>\n" + " <Level name=\"Month\" column=\"month_of_year\" uniqueMembers=\"false\" type=\"Numeric\"\n" + " levelType=\"TimeMonths\"/>\n" + " </Hierarchy>\n" + " </Dimension>\n" + " <Dimension name=\"Time Degenerate\">\n" + " <Hierarchy hasAll=\"true\" primaryKey=\"time_id\">\n" + " <Level name=\"day\" column=\"time_id\"/>\n" + " <Level name=\"month\" column=\"product_id\" type=\"Numeric\"/>\n" + " </Hierarchy>" + " </Dimension>" + " <Measure name=\"Store Cost\" column=\"store_cost\" aggregator=\"sum\"\n" + " formatString=\"#,###.00\"/>\n" + " <Measure name=\"Store Sales\" column=\"store_sales\" aggregator=\"sum\"\n" + " formatString=\"#,###.00\"/>\n" + "</Cube>\n" + "</Schema>"); testContext.assertQueryReturns( "select from [Sales Degen]", "Axis #0:\n" + "{}\n" + "225,627.23"); } finally { logger.removeAppender(appender); } // Note that 'product_id' is NOT one of the columns with unknown usage. // It is used as a level in the degenerate dimension [Time Degenerate]. TestContext.assertEqualsVerbose( "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'customer_count' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'month_of_year' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'quarter' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'the_year' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'unit_sales' with unknown usage.\n", sw.toString()); }
public void testUnknownUsages1() { if (!MondrianProperties.instance().ReadAggregates.get()) { return; } final Logger logger = Logger.getLogger(AggTableManager.class); propSaver.setAtLeast(logger, org.apache.log4j.Level.WARN); final StringWriter sw = new StringWriter(); final Appender appender = new WriterAppender(new SimpleLayout(), sw); final LevelRangeFilter filter = new LevelRangeFilter(); filter.setLevelMin(org.apache.log4j.Level.WARN); appender.addFilter(filter); logger.addAppender(appender); try { final TestContext testContext = TestContext.instance().withSchema( "<?xml version=\"1.0\"?>\n" + "<Schema name=\"FoodMart\">\n" + "<Cube name=\"Denormalized Sales\">\n" + " <Table name=\"sales_fact_1997\">\n" + " <AggExclude pattern=\"agg_c_14_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_05_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_g_ms_pcat_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_ll_01_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_c_special_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_04_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_pl_01_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_c_10_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_lc_06_sales_fact_1997\"/>\n" + " <AggName name=\"agg_l_03_sales_fact_1997\">\n" + " <AggFactCount column=\"fact_count\"/>\n" + " <AggMeasure name=\"[Measures].[Store Cost]\" column=\"store_cost\" />\n" + " <AggMeasure name=\"[Measures].[Store Sales]\" column=\"store_sales\" />\n" + " <AggMeasure name=\"[Measures].[Unit Sales]\" column=\"unit_sales\" />\n" + " <AggLevel name=\"[Customer].[Customer ID]\" column=\"customer_id\" />\n" + " <AggForeignKey factColumn=\"time_id\" aggColumn=\"time_id\" />\n" + " </AggName>\n" + " </Table>\n" + " <Dimension name=\"Time\" type=\"TimeDimension\" foreignKey=\"time_id\">\n" + " <Hierarchy hasAll=\"false\" primaryKey=\"time_id\">\n" + " <Table name=\"time_by_day\"/>\n" + " <Level name=\"Year\" column=\"the_year\" type=\"Numeric\" uniqueMembers=\"true\"\n" + " levelType=\"TimeYears\"/>\n" + " <Level name=\"Quarter\" column=\"quarter\" uniqueMembers=\"false\"\n" + " levelType=\"TimeQuarters\"/>\n" + " <Level name=\"Month\" column=\"month_of_year\" uniqueMembers=\"false\" type=\"Numeric\"\n" + " levelType=\"TimeMonths\"/>\n" + " </Hierarchy>\n" + " </Dimension>\n" + " <Dimension name=\"Customer\">\n" + " <Hierarchy hasAll=\"true\" primaryKey=\"customer_id\">\n" + " <Level name=\"Customer ID\" column=\"customer_id\"/>\n" + " </Hierarchy>" + " </Dimension>" + " <Dimension name=\"Product\">\n" + " <Hierarchy hasAll=\"true\" primaryKey=\"product_id\">\n" + " <Level name=\"Product ID\" column=\"product_id\"/>\n" + " </Hierarchy>" + " </Dimension>" + " <Measure name=\"Store Cost\" column=\"store_cost\" aggregator=\"sum\"\n" + " formatString=\"#,###.00\"/>\n" + " <Measure name=\"Store Sales\" column=\"store_sales\" aggregator=\"sum\"\n" + " formatString=\"#,###.00\"/>\n" + " <Measure name=\"Unit Sales\" column=\"unit_sales\" aggregator=\"sum\"\n" + " formatString=\"#,###\"/>\n" + "</Cube>\n" + "</Schema>"); testContext.assertQueryReturns( "select from [Denormalized Sales]", "Axis #0:\n" + "{}\n" + "225,627.23"); } finally { logger.removeAppender(appender); } TestContext.assertEqualsVerbose( "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_l_03_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'time_id' with unknown usage.\n", sw.toString()); }
/** * Testcase for * <a href="http://jira.pentaho.com/browse/MONDRIAN-291"> * Bug MONDRIAN-291, "'unknown usage' messages"</a>. */ public void testUnknownUsages() { if (!MondrianProperties.instance().ReadAggregates.get()) { return; } final Logger logger = Logger.getLogger(AggTableManager.class); final StringWriter sw = new StringWriter(); final Appender appender = new WriterAppender(new SimpleLayout(), sw); final LevelRangeFilter filter = new LevelRangeFilter(); filter.setLevelMin(Level.WARN); appender.addFilter(filter); logger.addAppender(appender); try { TestContext testContext = TestContext.create( "<?xml version=\"1.0\"?>\n" + "<Schema name=\"FoodMart\">\n" + "<Cube name=\"Sales Degen\">\n" + " <Table name=\"sales_fact_1997\">\n" + " <AggExclude pattern=\"agg_c_14_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_05_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_g_ms_pcat_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_ll_01_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_c_special_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_03_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_04_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_pl_01_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_lc_06_sales_fact_1997\"/>\n" + " <AggName name=\"agg_c_10_sales_fact_1997\">\n" + " <AggFactCount column=\"fact_count\"/>\n" + " <AggMeasure name=\"[Measures].[Store Cost]\" column=\"store_cost\" />\n" + " <AggMeasure name=\"[Measures].[Store Sales]\" column=\"store_sales\" />\n" + " </AggName>\n" + " </Table>\n" + " <Dimension name=\"Time\" type=\"TimeDimension\" foreignKey=\"time_id\">\n" + " <Hierarchy hasAll=\"false\" primaryKey=\"time_id\">\n" + " <Table name=\"time_by_day\"/>\n" + " <Level name=\"Year\" column=\"the_year\" type=\"Numeric\" uniqueMembers=\"true\"\n" + " levelType=\"TimeYears\"/>\n" + " <Level name=\"Quarter\" column=\"quarter\" uniqueMembers=\"false\"\n" + " levelType=\"TimeQuarters\"/>\n" + " <Level name=\"Month\" column=\"month_of_year\" uniqueMembers=\"false\" type=\"Numeric\"\n" + " levelType=\"TimeMonths\"/>\n" + " </Hierarchy>\n" + " </Dimension>\n" + " <Dimension name=\"Time Degenerate\">\n" + " <Hierarchy hasAll=\"true\" primaryKey=\"time_id\">\n" + " <Level name=\"day\" column=\"time_id\"/>\n" + " <Level name=\"month\" column=\"product_id\" type=\"Numeric\"/>\n" + " </Hierarchy>" + " </Dimension>" + " <Measure name=\"Store Cost\" column=\"store_cost\" aggregator=\"sum\"\n" + " formatString=\"#,###.00\"/>\n" + " <Measure name=\"Store Sales\" column=\"store_sales\" aggregator=\"sum\"\n" + " formatString=\"#,###.00\"/>\n" + "</Cube>\n" + "</Schema>"); testContext.assertQueryReturns( "select from [Sales Degen]", "Axis #0:\n" + "{}\n" + "225,627.23"); } finally { logger.removeAppender(appender); } // Note that 'product_id' is NOT one of the columns with unknown usage. // It is used as a level in the degenerate dimension [Time Degenerate]. TestContext.assertEqualsVerbose( "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'customer_count' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'month_of_year' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'quarter' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'the_year' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_c_10_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'unit_sales' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_lc_100_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'customer_id' with unknown usage.\n" + "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_lc_100_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'unit_sales' with unknown usage.\n", sw.toString()); }
public void testUnknownUsages1() { if (!MondrianProperties.instance().ReadAggregates.get()) { return; } final Logger logger = Logger.getLogger(AggTableManager.class); final StringWriter sw = new StringWriter(); final Appender appender = new WriterAppender(new SimpleLayout(), sw); final LevelRangeFilter filter = new LevelRangeFilter(); filter.setLevelMin(Level.WARN); appender.addFilter(filter); logger.addAppender(appender); try { TestContext testContext = TestContext.create( "<?xml version=\"1.0\"?>\n" + "<Schema name=\"FoodMart\">\n" + "<Cube name=\"Denormalized Sales\">\n" + " <Table name=\"sales_fact_1997\">\n" + " <AggExclude pattern=\"agg_c_14_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_05_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_g_ms_pcat_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_ll_01_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_c_special_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_l_04_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_pl_01_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_c_10_sales_fact_1997\"/>\n" + " <AggExclude pattern=\"agg_lc_06_sales_fact_1997\"/>\n" + " <AggName name=\"agg_l_03_sales_fact_1997\">\n" + " <AggFactCount column=\"fact_count\"/>\n" + " <AggMeasure name=\"[Measures].[Store Cost]\" column=\"store_cost\" />\n" + " <AggMeasure name=\"[Measures].[Store Sales]\" column=\"store_sales\" />\n" + " <AggMeasure name=\"[Measures].[Unit Sales]\" column=\"unit_sales\" />\n" + " <AggLevel name=\"[Customer].[Customer ID]\" column=\"customer_id\" />\n" + " <AggForeignKey factColumn=\"time_id\" aggColumn=\"time_id\" />\n" + " </AggName>\n" + " </Table>\n" + " <Dimension name=\"Time\" type=\"TimeDimension\" foreignKey=\"time_id\">\n" + " <Hierarchy hasAll=\"false\" primaryKey=\"time_id\">\n" + " <Table name=\"time_by_day\"/>\n" + " <Level name=\"Year\" column=\"the_year\" type=\"Numeric\" uniqueMembers=\"true\"\n" + " levelType=\"TimeYears\"/>\n" + " <Level name=\"Quarter\" column=\"quarter\" uniqueMembers=\"false\"\n" + " levelType=\"TimeQuarters\"/>\n" + " <Level name=\"Month\" column=\"month_of_year\" uniqueMembers=\"false\" type=\"Numeric\"\n" + " levelType=\"TimeMonths\"/>\n" + " </Hierarchy>\n" + " </Dimension>\n" + " <Dimension name=\"Customer\">\n" + " <Hierarchy hasAll=\"true\" primaryKey=\"customer_id\">\n" + " <Level name=\"Customer ID\" column=\"customer_id\"/>\n" + " </Hierarchy>" + " </Dimension>" + " <Dimension name=\"Product\">\n" + " <Hierarchy hasAll=\"true\" primaryKey=\"product_id\">\n" + " <Level name=\"Product ID\" column=\"product_id\"/>\n" + " </Hierarchy>" + " </Dimension>" + " <Measure name=\"Store Cost\" column=\"store_cost\" aggregator=\"sum\"\n" + " formatString=\"#,###.00\"/>\n" + " <Measure name=\"Store Sales\" column=\"store_sales\" aggregator=\"sum\"\n" + " formatString=\"#,###.00\"/>\n" + " <Measure name=\"Unit Sales\" column=\"unit_sales\" aggregator=\"sum\"\n" + " formatString=\"#,###\"/>\n" + "</Cube>\n" + "</Schema>"); testContext.assertQueryReturns( "select from [Denormalized Sales]", "Axis #0:\n" + "{}\n" + "225,627.23"); } finally { logger.removeAppender(appender); } TestContext.assertEqualsVerbose( "WARN - Recognizer.checkUnusedColumns: Candidate aggregate table 'agg_l_03_sales_fact_1997' for fact table 'sales_fact_1997' has a column 'time_id' with unknown usage.\n", sw.toString()); }