TarsLogger.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #include "servant/TarsLogger.h"
  17. #include "servant/Communicator.h"
  18. #include "servant/Application.h"
  19. namespace tars
  20. {
  21. int RollWriteT::_dyeingThread = 0;
  22. int TimeWriteT::_dyeing = 0;
  23. /////////////////////////////////////////////////////////////////////////////////////
  24. RollWriteT::RollWriteT():_dyeingRollLogger(NULL), _maxSize(10000), _maxNum(1), _logPrx(NULL)
  25. {
  26. }
  27. RollWriteT::~RollWriteT()
  28. {
  29. if(_dyeingRollLogger)
  30. {
  31. delete _dyeingRollLogger;
  32. }
  33. }
  34. void RollWriteT::operator()(ostream &of, const deque<pair<size_t, string> > &ds)
  35. {
  36. vector<string> vRemoteDyeing;
  37. deque<pair<size_t, string> >::const_iterator it = ds.begin();
  38. while(it != ds.end())
  39. {
  40. of << it->second;
  41. //染色线程id不存在
  42. if(it->first != 0)
  43. {
  44. if(!_dyeingRollLogger)
  45. {
  46. string sDyeingDir = _logPath;
  47. sDyeingDir += "/";
  48. sDyeingDir += DYEING_DIR;
  49. sDyeingDir += "/";
  50. string sDyeingFile = sDyeingDir;
  51. sDyeingFile += DYEING_FILE;
  52. TC_File::makeDirRecursive(sDyeingDir);
  53. //初始化染色循环日志
  54. _dyeingRollLogger = new TC_RollLogger();
  55. _dyeingRollLogger->init(sDyeingFile, _maxSize, _maxNum);
  56. _dyeingRollLogger->modFlag(TC_DayLogger::HAS_TIME, false);
  57. _dyeingRollLogger->modFlag(TC_DayLogger::HAS_TIME|TC_DayLogger::HAS_LEVEL|TC_DayLogger::HAS_PID, true);
  58. _dyeingRollLogger->setLogLevel("DEBUG");
  59. }
  60. _dyeingRollLogger->roll(make_pair(it->first, _app + "." + _server + "|" + it->second ));
  61. vRemoteDyeing.push_back(_app + "." + _server + "|" + it->second);
  62. }
  63. ++it;
  64. }
  65. of.flush();
  66. if(_logPrx && vRemoteDyeing.size() > 0)
  67. {
  68. try
  69. {
  70. _logPrx->logger(DYEING_DIR, DYEING_FILE, "roll", "%Y%m%d", vRemoteDyeing, ServerConfig::Context);
  71. }
  72. catch(exception &ex)
  73. {
  74. TLOGERROR("[TARS] dyeing log write to remote log server error:" << ex.what() << endl);
  75. }
  76. }
  77. }
  78. void RollWriteT::setDyeingLogInfo(const string &sApp, const string &sServer, const string & sLogPath, int iMaxSize, int iMaxNum, const CommunicatorPtr &comm, const string &sLogObj)
  79. {
  80. _app = sApp;
  81. _server = sServer;
  82. _logPath = sLogPath;
  83. _maxSize = iMaxSize;
  84. _maxNum = iMaxNum;
  85. if(comm && !sLogObj.empty())
  86. {
  87. _logPrx = comm->stringToProxy<LogPrx>(sLogObj);
  88. //单独设置超时时间
  89. _logPrx->tars_timeout(3000);
  90. }
  91. }
  92. /////////////////////////////////////////////////////////////////////////////////////
  93. void TarsRollLogger::setLogInfo(const string &sApp, const string &sServer, const string &sLogpath, int iMaxSize, int iMaxNum, const CommunicatorPtr &comm, const string &sLogObj)
  94. {
  95. _app = sApp;
  96. _server = sServer;
  97. _logpath = sLogpath;
  98. //生成目录
  99. TC_File::makeDirRecursive(_logpath + "/" + _app + "/" + _server);
  100. _local.start(1);
  101. //初始化本地循环日志
  102. _logger.init(_logpath + "/" + _app + "/" + _server + "/" + _app + "." + _server, iMaxSize, iMaxNum);
  103. _logger.modFlag(TC_DayLogger::HAS_TIME, false);
  104. _logger.modFlag(TC_DayLogger::HAS_TIME|TC_DayLogger::HAS_LEVEL|TC_DayLogger::HAS_PID, true);
  105. //设置为异步
  106. sync(false);
  107. //设置染色日志信息
  108. _logger.getWriteT().setDyeingLogInfo(sApp, sServer, sLogpath, iMaxSize, iMaxNum, comm, sLogObj);
  109. }
  110. void TarsRollLogger::sync(bool bSync)
  111. {
  112. if(bSync)
  113. {
  114. _logger.unSetupThread();
  115. }
  116. else
  117. {
  118. _logger.setupThread(&_local);
  119. }
  120. }
  121. void TarsRollLogger::enableDyeing(bool bEnable, const string& sDyeingKey/* = ""*/)
  122. {
  123. _logger.getRoll()->enableDyeing(bEnable, sDyeingKey);
  124. }
  125. /////////////////////////////////////////////////////////////////////////////////////
  126. TarsLoggerThread::TarsLoggerThread()
  127. {
  128. _local.start(1);
  129. _remote.start(1);
  130. }
  131. TarsLoggerThread::~TarsLoggerThread()
  132. {
  133. //先刷新本地日志
  134. _local.flush();
  135. //再刷新远程日志, 保证不会丢日志
  136. _remote.flush();
  137. }
  138. TC_LoggerThreadGroup* TarsLoggerThread::local()
  139. {
  140. return &_local;
  141. }
  142. TC_LoggerThreadGroup* TarsLoggerThread::remote()
  143. {
  144. return &_remote;
  145. }
  146. /////////////////////////////////////////////////////////////////////////////////////
  147. RemoteTimeWriteT::RemoteTimeWriteT():_timeWrite(NULL)
  148. {
  149. }
  150. RemoteTimeWriteT::~RemoteTimeWriteT()
  151. {
  152. }
  153. void RemoteTimeWriteT::setTimeWriteT(TimeWriteT *pTimeWrite)
  154. {
  155. _timeWrite = pTimeWrite;
  156. }
  157. void RemoteTimeWriteT::operator()(ostream &of, const deque<pair<size_t, string> > &buffer)
  158. {
  159. const static uint32_t len = 2000;
  160. //写远程日志
  161. if(_timeWrite->_logPrx && !buffer.empty())
  162. {
  163. //大于50w条, 直接抛弃掉,否则容易导致内存泄漏
  164. if(buffer.size() > 500000)
  165. {
  166. _timeWrite->writeError(buffer);
  167. return;
  168. }
  169. vector<string> v;
  170. v.reserve(len);
  171. deque<pair<size_t, string> >::const_iterator it = buffer.begin();
  172. while(it != buffer.end())
  173. {
  174. v.push_back(it->second);
  175. ++it;
  176. //每次最多同步len条
  177. if(v.size() >= len)
  178. {
  179. sync2remote(v);
  180. v.clear();
  181. v.reserve(len);
  182. }
  183. }
  184. if(v.size() > 0)
  185. {
  186. sync2remote(v);
  187. }
  188. }
  189. }
  190. void RemoteTimeWriteT::sync2remote(const vector<string> &v)
  191. {
  192. try
  193. {
  194. //此处传递set信息到远程logserver
  195. LogInfo stInfo;
  196. stInfo.appname = _timeWrite->_app;
  197. stInfo.servername = _timeWrite->_server;
  198. stInfo.sFilename = _timeWrite->_file;
  199. stInfo.sFormat = _timeWrite->_format;
  200. stInfo.setdivision = _timeWrite->_setDivision;
  201. stInfo.bHasSufix = _timeWrite->_hasSufix;
  202. stInfo.bHasAppNamePrefix = _timeWrite->_hasAppNamePrefix;
  203. stInfo.sConcatStr = _timeWrite->_concatStr;
  204. stInfo.bHasSquareBracket = _timeWrite->_hasSquareBracket;
  205. stInfo.sSepar = _timeWrite->_separ;
  206. stInfo.sLogType = _timeWrite->_logType;
  207. _timeWrite->_logPrx->loggerbyInfo(stInfo,v, ServerConfig::Context);
  208. if (_timeWrite->_reportSuccPtr)
  209. {
  210. _timeWrite->_reportSuccPtr->report(v.size());
  211. }
  212. }
  213. catch(exception &ex)
  214. {
  215. TLOGERROR("[TARS] write to remote log server error:" << ex.what() << ": buffer size:" << v.size() << endl);
  216. _timeWrite->writeError(v);
  217. if (_timeWrite->_reportFailPtr)
  218. {
  219. _timeWrite->_reportFailPtr->report(v.size());
  220. }
  221. }
  222. }
  223. void RemoteTimeWriteT::sync2remoteDyeing(const vector<string> &v)
  224. {
  225. try
  226. {
  227. _timeWrite->_logPrx->logger(DYEING_DIR, DYEING_FILE, "", _timeWrite->_format, v, ServerConfig::Context);
  228. }
  229. catch(exception &ex)
  230. {
  231. TLOGERROR("[TARS] write dyeing log to remote log server error:" << ex.what() << ": buffer size:" << v.size() << endl);
  232. _timeWrite->writeError(v);
  233. }
  234. }
  235. /////////////////////////////////////////////////////////////////////////////////////
  236. //
  237. TimeWriteT::~TimeWriteT()
  238. {
  239. if(_remoteTimeLogger)
  240. {
  241. delete _remoteTimeLogger;
  242. }
  243. }
  244. TimeWriteT::TimeWriteT() : _remoteTimeLogger(NULL), _local(true), _remote(true), _dyeingTimeLogger(NULL),_setDivision(""),
  245. _hasSufix(true),_hasAppNamePrefix(true),_concatStr("_"),_separ("|"),_hasSquareBracket(false),_logType("")
  246. {
  247. }
  248. void TimeWriteT::setLogInfo(const LogPrx &logPrx, const string &sApp, const string &sServer, const string &sFile, const string &sLogpath, const string &sFormat, const string& setdivision, const string& sLogType, const PropertyReportPtr &reportSuccPtr, const PropertyReportPtr &reportFailPtr)
  249. {
  250. _logPrx = logPrx;
  251. _app = sApp;
  252. _server = sServer;
  253. _format = sFormat;
  254. _file = sFile;
  255. _setDivision = setdivision;
  256. _logType = sLogType;
  257. _reportSuccPtr = reportSuccPtr;
  258. _reportFailPtr = reportFailPtr;
  259. string sAppSrvName = _hasAppNamePrefix?(_app + "." + _server):"";
  260. _filePath = sLogpath + "/" + _app + "/" + _server + "/" + sAppSrvName;
  261. if(!_file.empty())
  262. {
  263. _filePath += (_hasAppNamePrefix?_concatStr:"") + sFile;
  264. }
  265. string sDyeingDir = sLogpath;
  266. sDyeingDir += "/";
  267. sDyeingDir += DYEING_DIR;
  268. sDyeingDir += "/";
  269. _dyeingFilePath = sDyeingDir;
  270. _remoteTimeLogger = new RemoteTimeLogger();
  271. _remoteTimeLogger->init(_filePath, _format,_hasSufix,_concatStr,NULL,true);
  272. _remoteTimeLogger->modFlag(0xffff, false);
  273. _remoteTimeLogger->setSeparator(_separ);
  274. _remoteTimeLogger->enableSqareWrapper(_hasSquareBracket);
  275. _remoteTimeLogger->setupThread(TarsLoggerThread::getInstance()->remote());
  276. _remoteTimeLogger->getWriteT().setTimeWriteT(this);
  277. if(!_local)
  278. {
  279. initError();
  280. }
  281. }
  282. void TimeWriteT::initDyeingLog()
  283. {
  284. TC_File::makeDirRecursive(_dyeingFilePath);
  285. string sDyeingFile = _dyeingFilePath;
  286. sDyeingFile += "/";
  287. sDyeingFile += DYEING_FILE;
  288. _dyeingTimeLogger = new DyeingTimeLogger();
  289. _dyeingTimeLogger->init(sDyeingFile, _format);
  290. _dyeingTimeLogger->modFlag(0xffff, false);
  291. }
  292. void TimeWriteT::setLogPrx(const LogPrx &logPrx)
  293. {
  294. _logPrx = logPrx;
  295. }
  296. void TimeWriteT::initError()
  297. {
  298. //远程错误日志
  299. _logger.init(_filePath + ".remote.error", _format);
  300. _logger.modFlag(0xffff, false);
  301. }
  302. void TimeWriteT::enableLocal(bool bEnable)
  303. {
  304. _local = bEnable;
  305. if(!_local)
  306. {
  307. initError();
  308. }
  309. }
  310. void TimeWriteT::operator()(ostream &of, const deque<pair<size_t, string> > &buffer)
  311. {
  312. if(_local && of && !buffer.empty())
  313. {
  314. try
  315. {
  316. _wt(of, buffer);
  317. }
  318. catch(...)
  319. {
  320. }
  321. }
  322. if(_remote && _remoteTimeLogger && !buffer.empty())
  323. {
  324. deque<pair<size_t, string> >::const_iterator it = buffer.begin();
  325. while(it != buffer.end())
  326. {
  327. _remoteTimeLogger->any() << it->second;
  328. ++it;
  329. }
  330. }
  331. vector<string> vDyeingLog;
  332. deque<pair<size_t, string> >::const_iterator it = buffer.begin();
  333. while(it != buffer.end())
  334. {
  335. if(it->first != 0)
  336. {
  337. if(!_dyeingTimeLogger)
  338. {
  339. initDyeingLog();
  340. }
  341. _dyeingTimeLogger->any() << _app << "." << _server << "|" << it->second;
  342. vDyeingLog.push_back(_app + "." + _server + "|" + it->second);
  343. }
  344. ++it;
  345. }
  346. if(_logPrx && !vDyeingLog.empty())
  347. {
  348. try
  349. {
  350. _logPrx->logger(DYEING_DIR, DYEING_FILE, "day", "%Y%m%d", vDyeingLog, ServerConfig::Context);
  351. }
  352. catch(exception &ex)
  353. {
  354. TLOGERROR("[TARS] dyeing log write to remote log server error:" << ex.what() << endl);
  355. }
  356. }
  357. }
  358. void TimeWriteT::writeError(const vector<string> &buffer)
  359. {
  360. if(!_local)
  361. {
  362. for(size_t i = 0; i < buffer.size(); i++)
  363. {
  364. _logger.any() << buffer[i];
  365. }
  366. }
  367. //告警
  368. string sInfo = _app + "." + _server + "|";
  369. sInfo += ServerConfig::LocalIp + "|sync log to remote tarslog error";
  370. FDLOG("tarserror") << sInfo <<endl;
  371. //TARS_NOTIFY_ERROR(sInfo);
  372. }
  373. void TimeWriteT::writeError(const deque<pair<size_t, string> > &buffer)
  374. {
  375. if(!_local)
  376. {
  377. deque<pair<size_t, string> >::const_iterator it = buffer.begin();
  378. while(it != buffer.end())
  379. {
  380. _logger.any() << it->second;
  381. ++it;
  382. }
  383. }
  384. //告警
  385. string sInfo = _app + "." + _server + "|";
  386. sInfo += ServerConfig::LocalIp + "|sync log to remote tarslog error(buffer.size>500000)";
  387. FDLOG("tarserror") << sInfo <<endl;
  388. //TARS_NOTIFY_ERROR(sInfo);
  389. }
  390. /////////////////////////////////////////////////////////////////////////////////////
  391. TarsTimeLogger::TarsTimeLogger() : _defaultLogger(NULL),_hasSufix(true),_hasAppNamePrefix(true),_concatStr("_"),_separ("|"),_hasSquareBracket(false),_local(true),_remote(true)
  392. {
  393. }
  394. TarsTimeLogger::~TarsTimeLogger()
  395. {
  396. if(_defaultLogger != NULL)
  397. {
  398. delete _defaultLogger;
  399. }
  400. map<string, TimeLogger*>::iterator it = _loggers.begin();
  401. while(it != _loggers.end())
  402. {
  403. delete it->second;
  404. ++it;
  405. }
  406. _loggers.clear();
  407. }
  408. void TarsTimeLogger::initTimeLogger(TimeLogger *pTimeLogger, const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr)
  409. {
  410. string sAppSrvName = _hasAppNamePrefix?(_app + "." + _server):"";
  411. string sFilePath = _logpath + "/" + _app + "/" + _server + "/" + sAppSrvName;
  412. if(!sFile.empty())
  413. {
  414. sFilePath += (_hasAppNamePrefix?_concatStr:"") + sFile;
  415. }
  416. //本地日志格式
  417. pTimeLogger->init(sFilePath, sFormat,_hasSufix,_concatStr,logTypePtr,!_local);
  418. pTimeLogger->modFlag(0xffff, false);
  419. pTimeLogger->modFlag(TC_DayLogger::HAS_TIME, true);
  420. pTimeLogger->setSeparator(_separ);
  421. pTimeLogger->enableSqareWrapper(_hasSquareBracket);
  422. pTimeLogger->setupThread(TarsLoggerThread::getInstance()->local());
  423. //远程日志格式
  424. pTimeLogger->getWriteT().enableSufix(_hasSufix);
  425. pTimeLogger->getWriteT().enablePrefix(_hasAppNamePrefix);
  426. pTimeLogger->getWriteT().setFileNameConcatStr(_concatStr);
  427. pTimeLogger->getWriteT().setSeparator(_separ);
  428. pTimeLogger->getWriteT().enableSqareWrapper(_hasSquareBracket);
  429. pTimeLogger->getWriteT().enableLocal(_local);
  430. pTimeLogger->getWriteT().enableRemote(_remote);
  431. string sLogType = "";
  432. if(logTypePtr)
  433. {
  434. sLogType = logTypePtr->toString();
  435. }
  436. PropertyReportPtr reportSuccPtr = NULL;
  437. PropertyReportPtr reportFailPtr = NULL;
  438. if (_remote && _logStatReport)
  439. {
  440. string sKey = _app + "." + _server + "." + sFile;
  441. reportSuccPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_succ", PropertyReport::sum());
  442. reportFailPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_fail", PropertyReport::sum());
  443. }
  444. pTimeLogger->getWriteT().setLogInfo(_logPrx, _app, _server, sFile, _logpath, sFormat, _setDivision, sLogType, reportSuccPtr, reportFailPtr);
  445. }
  446. void TarsTimeLogger::initTimeLogger(TimeLogger *pTimeLogger,const string &sApp, const string &sServer, const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr)
  447. {
  448. string sAppSrvName = _hasAppNamePrefix?(sApp + "." + sServer):"";
  449. string sFilePath = _logpath + "/" + sApp + "/" + sServer + "/" + sAppSrvName;
  450. if(!sFile.empty())
  451. {
  452. sFilePath += (_hasAppNamePrefix?_concatStr:"") + sFile;
  453. }
  454. //本地日志格式
  455. pTimeLogger->init(sFilePath,sFormat,_hasSufix,_concatStr,logTypePtr,!_local);
  456. pTimeLogger->modFlag(0xffff, false);
  457. pTimeLogger->modFlag(TC_DayLogger::HAS_TIME, true);
  458. pTimeLogger->setSeparator(_separ);
  459. pTimeLogger->enableSqareWrapper(_hasSquareBracket);
  460. pTimeLogger->setupThread(TarsLoggerThread::getInstance()->local());
  461. //远程日志格式
  462. pTimeLogger->getWriteT().enableSufix(_hasSufix);
  463. pTimeLogger->getWriteT().enablePrefix(_hasAppNamePrefix);
  464. pTimeLogger->getWriteT().setFileNameConcatStr(_concatStr);
  465. pTimeLogger->getWriteT().setSeparator(_separ);
  466. pTimeLogger->getWriteT().enableSqareWrapper(_hasSquareBracket);
  467. pTimeLogger->getWriteT().enableLocal(_local);
  468. pTimeLogger->getWriteT().enableRemote(_remote);
  469. string sLogType = "";
  470. if(logTypePtr)
  471. {
  472. sLogType = logTypePtr->toString();
  473. }
  474. PropertyReportPtr reportSuccPtr = NULL;
  475. PropertyReportPtr reportFailPtr = NULL;
  476. if (_remote && _logStatReport)
  477. {
  478. string sKey = _app + "." + _server + "." + sFile;
  479. reportSuccPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_succ", PropertyReport::sum());
  480. reportFailPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_fail", PropertyReport::sum());
  481. }
  482. pTimeLogger->getWriteT().setLogInfo(_logPrx, sApp, sServer, sFile, _logpath, sFormat, _setDivision, sLogType, reportSuccPtr, reportFailPtr);
  483. }
  484. void TarsTimeLogger::setLogInfo(const CommunicatorPtr &comm, const string &obj, const string &sApp, const string &sServer, const string &sLogpath, const string& setdivision, const bool &bLogStatReport)
  485. {
  486. _app = sApp;
  487. _server = sServer;
  488. _logpath = sLogpath;
  489. _comm = comm;
  490. _setDivision = setdivision;
  491. _logStatReport = bLogStatReport;
  492. if(!obj.empty())
  493. {
  494. _logPrx = _comm->stringToProxy<LogPrx>(obj);
  495. //单独设置超时时间
  496. _logPrx->tars_timeout(3000);
  497. if(_defaultLogger)
  498. {
  499. _defaultLogger->getWriteT().setLogPrx(_logPrx);
  500. }
  501. }
  502. //创建本地目录
  503. TC_File::makeDirRecursive(_logpath + "/" + _app + "/" + _server);
  504. }
  505. void TarsTimeLogger::initFormat(const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr)
  506. {
  507. if(sFile.empty())
  508. {
  509. if(!_defaultLogger)
  510. {
  511. _defaultLogger = new TimeLogger();
  512. }
  513. initTimeLogger(_defaultLogger, "", sFormat,logTypePtr);
  514. }
  515. else
  516. {
  517. string s = _app + "/" + _server + "/"+ sFile;
  518. Lock lock(*this);
  519. map<string, TimeLogger*>::iterator it = _loggers.find(s);
  520. if( it == _loggers.end())
  521. {
  522. TimeLogger *p = new TimeLogger();
  523. initTimeLogger(p, sFile, sFormat,logTypePtr);
  524. _loggers[s] = p;
  525. return;
  526. }
  527. initTimeLogger(it->second, sFile, sFormat,logTypePtr);
  528. }
  529. }
  530. void TarsTimeLogger::initFormat(const string &sApp, const string &sServer,const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr)
  531. {
  532. string s = sApp + "/" + sServer + "/"+ sFile;
  533. Lock lock(*this);
  534. map<string, TimeLogger*>::iterator it = _loggers.find(s);
  535. if( it == _loggers.end())
  536. {
  537. TimeLogger *p = new TimeLogger();
  538. initTimeLogger(p, sApp, sServer, sFile, sFormat,logTypePtr);
  539. _loggers[s] = p;
  540. return;
  541. }
  542. initTimeLogger(it->second, sApp, sServer, sFile, sFormat,logTypePtr);
  543. }
  544. TarsTimeLogger::TimeLogger* TarsTimeLogger::logger(const string &sFile)
  545. {
  546. if(sFile.empty())
  547. {
  548. if(!_defaultLogger)
  549. {
  550. _defaultLogger = new TimeLogger();
  551. initTimeLogger(_defaultLogger, "", "%Y%m%d");
  552. }
  553. return _defaultLogger;
  554. }
  555. string s = _app + "/" + _server + "/"+ sFile;
  556. Lock lock(*this);
  557. map<string, TimeLogger*>::iterator it = _loggers.find(s);
  558. if( it == _loggers.end())
  559. {
  560. TimeLogger *p = new TimeLogger();
  561. initTimeLogger(p, sFile, "%Y%m%d");
  562. _loggers[s] = p;
  563. return p;
  564. }
  565. return it->second;
  566. }
  567. TarsTimeLogger::TimeLogger* TarsTimeLogger::logger(const string &sApp, const string &sServer,const string &sFile)
  568. {
  569. string s = sApp + "/" + sServer + "/"+ sFile;
  570. Lock lock(*this);
  571. map<string, TimeLogger*>::iterator it = _loggers.find(s);
  572. if( it == _loggers.end())
  573. {
  574. TimeLogger *p = new TimeLogger();
  575. initTimeLogger(p, sApp, sServer, sFile, "%Y%m%d");
  576. _loggers[s] = p;
  577. return p;
  578. }
  579. return it->second;
  580. }
  581. void TarsTimeLogger::sync(const string &sFile, bool bSync)
  582. {
  583. if(bSync)
  584. {
  585. logger(sFile)->unSetupThread();
  586. }
  587. else
  588. {
  589. logger(sFile)->setupThread(TarsLoggerThread::getInstance()->local());
  590. }
  591. }
  592. void TarsTimeLogger::enableRemote(const string &sFile, bool bEnable)
  593. {
  594. logger(sFile)->getWriteT().enableRemote(bEnable);
  595. }
  596. void TarsTimeLogger::enableRemoteEx(const string &sApp, const string &sServer,const string &sFile, bool bEnable)
  597. {
  598. logger(sApp,sServer,sFile)->getWriteT().enableRemote(bEnable);
  599. }
  600. void TarsTimeLogger::enableLocal(const string &sFile, bool bEnable)
  601. {
  602. logger(sFile)->getWriteT().enableLocal(bEnable);
  603. logger(sFile)->setRemote(!bEnable);
  604. }
  605. void TarsTimeLogger::enableLocalEx(const string &sApp, const string &sServer,const string &sFile, bool bEnable)
  606. {
  607. logger(sApp,sServer,sFile)->getWriteT().enableLocal(bEnable);
  608. logger(sApp,sServer,sFile)->setRemote(!bEnable);
  609. }
  610. }