📄 timebasedrollingtest.cpp
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include <log4cxx/rolling/rollingfileappender.h>#include <log4cxx/logger.h>#include <log4cxx/consoleappender.h>#include <log4cxx/logmanager.h>#include <log4cxx/patternlayout.h>#include <log4cxx/rolling/timebasedrollingpolicy.h>#include <log4cxx/helpers/simpledateformat.h>#include <iostream>#include <log4cxx/helpers/stringhelper.h>#include "../util/compare.h"#include "../logunit.h"#include <apr_strings.h>#ifndef INT64_C#define INT64_C(x) x ## LL#endif#include <apr_time.h>using namespace log4cxx;using namespace log4cxx::helpers;using namespace log4cxx::rolling;/** * A rather exhaustive set of tests. Tests include leaving the ActiveFileName * argument blank, or setting it, with and without compression, and tests * with or without stopping/restarting the RollingFileAppender. * * The regression tests log a few times using a RollingFileAppender. Then, * they predict the names of the files which sould be generated and compare * them with witness files. * * <pre> Compression ActiveFileName Stop/Restart Test1 NO BLANK NO Test2 NO BLANK YES Test3 YES BLANK NO Test4 NO SET YES Test5 NO SET NO Test6 YES SET NO * </pre> * */LOGUNIT_CLASS(TimeBasedRollingTest) { LOGUNIT_TEST_SUITE(TimeBasedRollingTest); LOGUNIT_TEST(test1); LOGUNIT_TEST(test2); LOGUNIT_TEST(test3); LOGUNIT_TEST(test4); LOGUNIT_TEST(test5); LOGUNIT_TEST(test6); LOGUNIT_TEST_SUITE_END(); static LoggerPtr logger;public: void setUp() { LoggerPtr root(Logger::getRootLogger()); root->addAppender( new ConsoleAppender(new PatternLayout( LOG4CXX_STR("%d{ABSOLUTE} [%t] %level %c{2}#%M:%L - %m%n")))); } void tearDown() { LogManager::shutdown(); } /** * Test rolling without compression, activeFileName left blank, no stop/start */ void test1() { PatternLayoutPtr layout(new PatternLayout(LOG4CXX_STR("%c{1} - %m%n"))); RollingFileAppenderPtr rfa(new RollingFileAppender()); rfa->setLayout(layout); LogString datePattern(LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss")); TimeBasedRollingPolicyPtr tbrp(new TimeBasedRollingPolicy()); tbrp->setFileNamePattern(LOG4CXX_STR("output/test1-%d{yyyy-MM-dd_HH_mm_ss}")); Pool p; tbrp->activateOptions(p); rfa->setRollingPolicy(tbrp); rfa->activateOptions(p); logger->addAppender(rfa); SimpleDateFormat sdf(datePattern); LogString filenames[4]; Pool pool; apr_time_t now = apr_time_now(); { for (int i = 0; i < 4; i++) { filenames[i] = LOG4CXX_STR("output/test1-"); sdf.format(filenames[i], now, p); now += APR_USEC_PER_SEC; } } std::cout << "Waiting until next second and 100 millis."; delayUntilNextSecond(100); std::cout << "Done waiting."; { for (int i = 0; i < 5; i++) { std::string message("Hello---"); message.append(pool.itoa(i)); LOG4CXX_DEBUG(logger, message); apr_sleep(APR_USEC_PER_SEC/2); } } for (int i = 0; i < 4; i++) { LogString witness(LOG4CXX_STR("witness/rolling/tbr-test1.")); StringHelper::toString(i, pool, witness); LOGUNIT_ASSERT(Compare::compare(filenames[i], File(witness))); } } /** * No compression, with stop/restart, activeFileName left blank */ void test2() { LogString datePattern(LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss")); PatternLayoutPtr layout1(new PatternLayout(LOG4CXX_STR("%c{1} - %m%n"))); RollingFileAppenderPtr rfa1(new RollingFileAppender()); rfa1->setLayout(layout1); TimeBasedRollingPolicyPtr tbrp1(new TimeBasedRollingPolicy()); tbrp1->setFileNamePattern(LOG4CXX_STR("output/test2-%d{yyyy-MM-dd_HH_mm_ss}")); Pool pool; tbrp1->activateOptions(pool); rfa1->setRollingPolicy(tbrp1); rfa1->activateOptions(pool); logger->addAppender(rfa1); SimpleDateFormat sdf(datePattern); LogString filenames[4]; apr_time_t now = apr_time_now(); { for (int i = 0; i < 4; i++) { filenames[i] = LOG4CXX_STR("output/test2-"); sdf.format(filenames[i], now, pool); now += APR_USEC_PER_SEC; } } delayUntilNextSecond(100); { for (int i = 0; i <= 2; i++) { std::string message("Hello---"); message.append(pool.itoa(i)); LOG4CXX_DEBUG(logger, message); apr_sleep(APR_USEC_PER_SEC/2); } } logger->removeAppender(rfa1); rfa1->close(); PatternLayoutPtr layout2(new PatternLayout(LOG4CXX_STR("%c{1} - %m%n"))); RollingFileAppenderPtr rfa2 = new RollingFileAppender(); rfa2->setLayout(layout2); TimeBasedRollingPolicyPtr tbrp2 = new TimeBasedRollingPolicy(); tbrp2->setFileNamePattern(LOG4CXX_STR("output/test2-%d{yyyy-MM-dd_HH_mm_ss}")); tbrp2->activateOptions(pool); rfa2->setRollingPolicy(tbrp2); rfa2->activateOptions(pool); logger->addAppender(rfa2); { for (int i = 3; i <= 4; i++) { std::string message("Hello---"); message.append(pool.itoa(i)); LOG4CXX_DEBUG(logger, message); apr_sleep(APR_USEC_PER_SEC/2); } } for (int i = 0; i < 4; i++) { LogString witness(LOG4CXX_STR("witness/rolling/tbr-test2.")); StringHelper::toString(i, pool, witness); LOGUNIT_ASSERT(Compare::compare(filenames[i], File(witness))); } } /** * With compression, activeFileName left blank, no stop/restart */ void test3() { Pool p; PatternLayoutPtr layout = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n")); RollingFileAppenderPtr rfa = new RollingFileAppender(); rfa->setAppend(false); rfa->setLayout(layout); LogString datePattern = LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss"); TimeBasedRollingPolicyPtr tbrp = new TimeBasedRollingPolicy(); tbrp->setFileNamePattern(LogString(LOG4CXX_STR("output/test3-%d{")) + datePattern + LogString(LOG4CXX_STR("}.gz"))); tbrp->activateOptions(p); rfa->setRollingPolicy(tbrp); rfa->activateOptions(p); logger->addAppender(rfa); DateFormatPtr sdf = new SimpleDateFormat(datePattern); LogString filenames[4]; apr_time_t now = apr_time_now(); { for (int i = 0; i < 4; i++) { filenames[i] = LOG4CXX_STR("output/test3-"); sdf->format(filenames[i], now, p); filenames[i].append(LOG4CXX_STR(".gz")); now += APR_USEC_PER_SEC; } } filenames[3].resize(filenames[3].size() - 3); delayUntilNextSecond(100); { for (int i = 0; i < 5; i++) { std::string message("Hello---"); message.append(p.itoa(i)); LOG4CXX_DEBUG(logger, message); apr_sleep(APR_USEC_PER_SEC/2); } } LOGUNIT_ASSERT_EQUAL(true, File(filenames[0]).exists(p)); LOGUNIT_ASSERT_EQUAL(true, File(filenames[1]).exists(p)); LOGUNIT_ASSERT_EQUAL(true, File(filenames[2]).exists(p)); LOGUNIT_ASSERT_EQUAL(true, Compare::compare(File(filenames[3]), File(LOG4CXX_STR("witness/rolling/tbr-test3.3")))); } /** * Without compression, activeFileName set, with stop/restart */ void test4() { LogString datePattern = LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss"); PatternLayoutPtr layout1 = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n")); RollingFileAppenderPtr rfa1 = new RollingFileAppender(); rfa1->setLayout(layout1); Pool pool; TimeBasedRollingPolicyPtr tbrp1 = new TimeBasedRollingPolicy(); rfa1->setFile(LOG4CXX_STR("output/test4.log")); tbrp1->setFileNamePattern(LOG4CXX_STR("output/test4-%d{yyyy-MM-dd_HH_mm_ss}")); tbrp1->activateOptions(pool); rfa1->setRollingPolicy(tbrp1); rfa1->activateOptions(pool); logger->addAppender(rfa1); SimpleDateFormat sdf(datePattern); LogString filenames[4]; apr_time_t now = apr_time_now(); { for (int i = 0; i < 3; i++) { filenames[i] = LOG4CXX_STR("output/test4-"); sdf.format(filenames[i], now, pool); now += APR_USEC_PER_SEC; } } filenames[3] = LOG4CXX_STR("output/test4.log"); std::cout << "Waiting until next second and 100 millis."; delayUntilNextSecond(100); std::cout << "Done waiting."; { for (int i = 0; i <= 2; i++) { std::string message("Hello---"); message.append(pool.itoa(i)); LOG4CXX_DEBUG(logger, message); apr_sleep(APR_USEC_PER_SEC/2); } } logger->removeAppender(rfa1); rfa1->close(); PatternLayoutPtr layout2 = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n")); RollingFileAppenderPtr rfa2 = new RollingFileAppender(); rfa2->setLayout(layout2); TimeBasedRollingPolicyPtr tbrp2 = new TimeBasedRollingPolicy(); tbrp2->setFileNamePattern(LOG4CXX_STR("output/test4-%d{yyyy-MM-dd_HH_mm_ss}")); rfa2->setFile(LOG4CXX_STR("output/test4.log")); tbrp2->activateOptions(pool); rfa2->setRollingPolicy(tbrp2); rfa2->activateOptions(pool); logger->addAppender(rfa2); { for (int i = 3; i <= 4; i++) { std::string message("Hello---"); message.append(pool.itoa(i)); LOG4CXX_DEBUG(logger, message); apr_sleep(APR_USEC_PER_SEC/2); } } for (int i = 0; i < 4; i++) { LogString witness(LOG4CXX_STR("witness/rolling/tbr-test4.")); StringHelper::toString(i, pool, witness); LOGUNIT_ASSERT(Compare::compare(filenames[i], File(witness))); } } /** * No compression, activeFileName set, without stop/restart */ void test5() { PatternLayoutPtr layout = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n")); RollingFileAppenderPtr rfa = new RollingFileAppender(); rfa->setLayout(layout); LogString datePattern(LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss")); TimeBasedRollingPolicyPtr tbrp = new TimeBasedRollingPolicy(); tbrp->setFileNamePattern(LOG4CXX_STR("output/test5-%d{yyyy-MM-dd_HH_mm_ss}")); rfa->setFile(LOG4CXX_STR("output/test5.log")); Pool pool; tbrp->activateOptions(pool); rfa->setRollingPolicy(tbrp); rfa->activateOptions(pool); logger->addAppender(rfa); SimpleDateFormat sdf(datePattern); LogString filenames[4]; apr_time_t now = apr_time_now(); { for (int i = 0; i < 3; i++) { filenames[i] = LOG4CXX_STR("output/test5-"); sdf.format(filenames[i], now, pool); now += APR_USEC_PER_SEC; } } filenames[3] = LOG4CXX_STR("output/test5.log"); std::cout << "Waiting until next second and 100 millis."; delayUntilNextSecond(100); std::cout << "Done waiting."; { for (int i = 0; i < 5; i++) { std::string message("Hello---"); message.append(pool.itoa(i)); LOG4CXX_DEBUG(logger, message); apr_sleep(APR_USEC_PER_SEC/2); } } for (int i = 0; i < 4; i++) { LogString witness(LOG4CXX_STR("witness/rolling/tbr-test5.")); StringHelper::toString(i, pool, witness); LOGUNIT_ASSERT(Compare::compare(filenames[i], File(witness))); } } /** * With compression, activeFileName set, no stop/restart, */ void test6() { Pool p; PatternLayoutPtr layout = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n")); RollingFileAppenderPtr rfa = new RollingFileAppender(); rfa->setAppend(false); rfa->setLayout(layout); LogString datePattern = LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss"); TimeBasedRollingPolicyPtr tbrp = new TimeBasedRollingPolicy(); tbrp->setFileNamePattern(LogString(LOG4CXX_STR("output/test6-%d{")) + datePattern + LogString(LOG4CXX_STR("}.gz"))); rfa->setFile(LOG4CXX_STR("output/test6.log")); tbrp->activateOptions(p); rfa->setRollingPolicy(tbrp); rfa->activateOptions(p); logger->addAppender(rfa); DateFormatPtr sdf = new SimpleDateFormat(datePattern); LogString filenames[4]; apr_time_t now = apr_time_now(); { for (int i = 0; i < 3; i++) { filenames[i] = LOG4CXX_STR("output/test6-"); sdf->format(filenames[i], now, p); filenames[i].append(LOG4CXX_STR(".gz")); now += APR_USEC_PER_SEC; } } filenames[3] = LOG4CXX_STR("output/test6.log"); delayUntilNextSecond(100); { for (int i = 0; i < 5; i++) { std::string message("Hello---"); message.append(p.itoa(i)); LOG4CXX_DEBUG(logger, message); apr_sleep(APR_USEC_PER_SEC/2); } } LOGUNIT_ASSERT_EQUAL(true, File(filenames[0]).exists(p)); LOGUNIT_ASSERT_EQUAL(true, File(filenames[1]).exists(p)); LOGUNIT_ASSERT_EQUAL(true, File(filenames[2]).exists(p)); LOGUNIT_ASSERT_EQUAL(true, Compare::compare(File(filenames[3]), File(LOG4CXX_STR("witness/rolling/tbr-test6.3")))); } void delayUntilNextSecond(int millis) { apr_time_t now = apr_time_now(); apr_time_t next = ((now / APR_USEC_PER_SEC) + 1) * APR_USEC_PER_SEC + millis * 1000L; apr_sleep(next - now); } void delayUntilNextMinute(int seconds) { apr_time_t now = apr_time_now(); apr_time_t next = ((now / APR_USEC_PER_SEC) + 1) * APR_USEC_PER_SEC + seconds * 1000000L; apr_sleep(next - now); }};LoggerPtr TimeBasedRollingTest::logger(Logger::getLogger("org.apache.log4j.TimeBasedRollingTest"));LOGUNIT_TEST_SUITE_REGISTRATION(TimeBasedRollingTest);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -