RemoteLogger.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938
  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/RemoteLogger.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 += FILE_SEP;
  48. sDyeingDir += DYEING_DIR;
  49. sDyeingDir += FILE_SEP;
  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.empty())
  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("[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 LogPrx &logPrx, const string &sLogObj)
  79. {
  80. _app = sApp;
  81. _server = sServer;
  82. _logPath = sLogPath;
  83. _maxSize = iMaxSize;
  84. _maxNum = iMaxNum;
  85. }
  86. /////////////////////////////////////////////////////////////////////////////////////
  87. LocalRollLogger::~LocalRollLogger()
  88. {
  89. for(auto e : _logger_ex)
  90. {
  91. delete e.second;
  92. }
  93. _logger_ex.clear();
  94. }
  95. void LocalRollLogger::terminate()
  96. {
  97. if (!_terminate)
  98. {
  99. _terminate = true;
  100. _local.terminate();
  101. }
  102. }
  103. void LocalRollLogger::setLogInfo(const string &sApp, const string &sServer, const string &sLogpath, int iMaxSize, int iMaxNum, const CommunicatorPtr &comm, const string &sLogObj)
  104. {
  105. _app = sApp;
  106. _server = sServer;
  107. _logpath = sLogpath;
  108. _logObj = sLogObj;
  109. if(comm && !sLogObj.empty())
  110. {
  111. _logPrx = comm->stringToProxy<LogPrx>(sLogObj);
  112. //单独设置超时时间
  113. _logPrx->tars_timeout(3000);
  114. }
  115. //生成目录
  116. TC_File::makeDirRecursive(_logpath + FILE_SEP + _app + FILE_SEP + _server);
  117. _local.start(1);
  118. //初始化本地循环日志
  119. _logger.init(_logpath + FILE_SEP + _app + FILE_SEP + _server + FILE_SEP + _app + "." + _server, iMaxSize, iMaxNum);
  120. _logger.modFlag(TC_DayLogger::HAS_TIME, false);
  121. _logger.modFlag(TC_DayLogger::HAS_TIME|TC_DayLogger::HAS_LEVEL|TC_DayLogger::HAS_PID, true);
  122. //设置为异步
  123. sync(false);
  124. //设置染色日志信息
  125. _logger.getWriteT().setDyeingLogInfo(sApp, sServer, sLogpath, iMaxSize, iMaxNum, _logPrx, sLogObj);
  126. }
  127. void LocalRollLogger::sync(bool bSync)
  128. {
  129. if(bSync)
  130. {
  131. _logger.unSetupThread();
  132. TC_ThreadRLock lock(_mutex);
  133. for(auto e : _logger_ex)
  134. {
  135. e.second->unSetupThread();
  136. }
  137. }
  138. else
  139. {
  140. _logger.setupThread(&_local);
  141. TC_ThreadRLock lock(_mutex);
  142. for(auto e : _logger_ex)
  143. {
  144. e.second->setupThread(&_local);
  145. }
  146. }
  147. }
  148. void LocalRollLogger::enableDyeing(bool bEnable, const string& sDyeingKey/* = ""*/)
  149. {
  150. _logger.getRoll()->enableDyeing(bEnable, sDyeingKey);
  151. TC_ThreadRLock lock(_mutex);
  152. for(auto e : _logger_ex)
  153. {
  154. e.second->getRoll()->enableDyeing(bEnable, sDyeingKey);
  155. }
  156. }
  157. LocalRollLogger::RollLogger *LocalRollLogger::logger(const string &suffix)
  158. {
  159. unordered_map<string, RollLogger*>::iterator it;
  160. {
  161. TC_ThreadRLock lock(_mutex);
  162. it = _logger_ex.find(suffix);
  163. if (it != _logger_ex.end())
  164. {
  165. return it->second;
  166. }
  167. }
  168. TC_ThreadWLock lock(_mutex);
  169. it = _logger_ex.find(suffix);
  170. if (it != _logger_ex.end())
  171. {
  172. return it->second;
  173. }
  174. RollLogger *logger = new RollLogger();
  175. //初始化本地循环日志
  176. logger->init(_logpath + FILE_SEP + _app + FILE_SEP + _server + FILE_SEP + _app + "." + _server + "." + suffix, _logger.getMaxSize(), _logger.getMaxNum());
  177. logger->modFlag(TC_DayLogger::HAS_TIME, false);
  178. logger->modFlag(TC_DayLogger::HAS_TIME|TC_DayLogger::HAS_LEVEL|TC_DayLogger::HAS_PID, true);
  179. //设置染色日志信息
  180. logger->getWriteT().setDyeingLogInfo(_app, _server, _logpath, _logger.getMaxSize(), _logger.getMaxSize(), _logPrx, _logObj);
  181. _logger_ex[suffix] = logger;
  182. return logger;
  183. }
  184. /////////////////////////////////////////////////////////////////////////////////////
  185. TarsLoggerThread::TarsLoggerThread()
  186. {
  187. _local.start(1);
  188. _remote.start(1);
  189. }
  190. TarsLoggerThread::~TarsLoggerThread()
  191. {
  192. terminate();
  193. }
  194. void TarsLoggerThread::terminate()
  195. {
  196. if (!_terminate)
  197. {
  198. _terminate = true;
  199. //先刷新本地日志
  200. _local.flush();
  201. //再刷新远程日志, 保证不会丢日志
  202. _remote.flush();
  203. //终止
  204. _local.terminate();
  205. _remote.terminate();
  206. }
  207. }
  208. TC_LoggerThreadGroup* TarsLoggerThread::local()
  209. {
  210. return &_local;
  211. }
  212. TC_LoggerThreadGroup* TarsLoggerThread::remote()
  213. {
  214. return &_remote;
  215. }
  216. /////////////////////////////////////////////////////////////////////////////////////
  217. RemoteTimeWriteT::RemoteTimeWriteT():_timeWrite(NULL)
  218. {
  219. }
  220. RemoteTimeWriteT::~RemoteTimeWriteT()
  221. {
  222. }
  223. void RemoteTimeWriteT::setTimeWriteT(TimeWriteT *pTimeWrite)
  224. {
  225. _timeWrite = pTimeWrite;
  226. }
  227. void RemoteTimeWriteT::operator()(ostream &of, const deque<pair<size_t, string> > &buffer)
  228. {
  229. const static uint32_t len = 2000;
  230. //写远程日志
  231. if(_timeWrite->_logPrx && !buffer.empty())
  232. {
  233. //大于50w条, 直接抛弃掉,否则容易导致内存泄漏
  234. if(buffer.size() > 500000)
  235. {
  236. _timeWrite->writeError(buffer);
  237. return;
  238. }
  239. vector<string> v;
  240. v.reserve(len);
  241. deque<pair<size_t, string> >::const_iterator it = buffer.begin();
  242. while(it != buffer.end())
  243. {
  244. v.push_back(it->second);
  245. ++it;
  246. //每次最多同步len条
  247. if(v.size() >= len)
  248. {
  249. sync2remote(v);
  250. v.clear();
  251. v.reserve(len);
  252. }
  253. }
  254. if(v.size() > 0)
  255. {
  256. sync2remote(v);
  257. }
  258. }
  259. }
  260. void RemoteTimeWriteT::sync2remote(const vector<string> &v)
  261. {
  262. try
  263. {
  264. //此处传递set信息到远程logserver
  265. LogInfo stInfo;
  266. stInfo.appname = _timeWrite->_app;
  267. stInfo.servername = _timeWrite->_server;
  268. stInfo.sFilename = _timeWrite->_file;
  269. stInfo.sFormat = _timeWrite->_format;
  270. stInfo.setdivision = _timeWrite->_setDivision;
  271. stInfo.bHasSufix = _timeWrite->_hasSufix;
  272. stInfo.bHasAppNamePrefix = _timeWrite->_hasAppNamePrefix;
  273. stInfo.sConcatStr = _timeWrite->_concatStr;
  274. stInfo.bHasSquareBracket = _timeWrite->_hasSquareBracket;
  275. stInfo.sSepar = _timeWrite->_separ;
  276. stInfo.sLogType = _timeWrite->_logType;
  277. _timeWrite->_logPrx->loggerbyInfo(stInfo,v, ServerConfig::Context);
  278. if (_timeWrite->_reportSuccPtr)
  279. {
  280. _timeWrite->_reportSuccPtr->report(v.size());
  281. }
  282. }
  283. catch(exception &ex)
  284. {
  285. TLOGERROR("[write to remote log server error:" << ex.what() << ": buffer size:" << v.size() << "]"<< endl);
  286. _timeWrite->writeError(v);
  287. if (_timeWrite->_reportFailPtr)
  288. {
  289. _timeWrite->_reportFailPtr->report(v.size());
  290. }
  291. }
  292. }
  293. void RemoteTimeWriteT::sync2remoteDyeing(const vector<string> &v)
  294. {
  295. try
  296. {
  297. _timeWrite->_logPrx->logger(DYEING_DIR, DYEING_FILE, "", _timeWrite->_format, v, ServerConfig::Context);
  298. }
  299. catch(exception &ex)
  300. {
  301. TLOGERROR("[write dyeing log to remote log server error:" << ex.what() << ": buffer size:" << v.size() << "]" << endl);
  302. _timeWrite->writeError(v);
  303. }
  304. }
  305. /////////////////////////////////////////////////////////////////////////////////////
  306. //
  307. TimeWriteT::~TimeWriteT()
  308. {
  309. if(_remoteTimeLogger)
  310. {
  311. delete _remoteTimeLogger;
  312. }
  313. }
  314. TimeWriteT::TimeWriteT() : _remoteTimeLogger(NULL), _local(true), _remote(true), _dyeingTimeLogger(NULL),_setDivision(""),
  315. _hasSufix(true),_hasAppNamePrefix(true),_concatStr("_"),_separ("|"),_hasSquareBracket(false),_logType("")
  316. {
  317. }
  318. 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)
  319. {
  320. _logPrx = logPrx;
  321. _app = sApp;
  322. _server = sServer;
  323. _format = sFormat;
  324. _file = sFile;
  325. _setDivision = setdivision;
  326. _logType = sLogType;
  327. _reportSuccPtr = reportSuccPtr;
  328. _reportFailPtr = reportFailPtr;
  329. string sAppSrvName = _hasAppNamePrefix?(_app + "." + _server):"";
  330. _filePath = sLogpath + FILE_SEP + _app + FILE_SEP + _server + FILE_SEP + sAppSrvName;
  331. if(!_file.empty())
  332. {
  333. _filePath += (_hasAppNamePrefix?_concatStr:"") + sFile;
  334. }
  335. string sDyeingDir = sLogpath;
  336. sDyeingDir += FILE_SEP;
  337. sDyeingDir += DYEING_DIR;
  338. sDyeingDir += FILE_SEP;
  339. _dyeingFilePath = sDyeingDir;
  340. _remoteTimeLogger = new RemoteTimeLogger();
  341. _remoteTimeLogger->init(_filePath, _format,_hasSufix,_concatStr,NULL,true);
  342. _remoteTimeLogger->modFlag(0xffff, false);
  343. _remoteTimeLogger->setSeparator(_separ);
  344. _remoteTimeLogger->enableSqareWrapper(_hasSquareBracket);
  345. _remoteTimeLogger->setupThread(TarsLoggerThread::getInstance()->remote());
  346. _remoteTimeLogger->getWriteT().setTimeWriteT(this);
  347. if(!_local)
  348. {
  349. initError();
  350. }
  351. }
  352. void TimeWriteT::initDyeingLog()
  353. {
  354. TC_File::makeDirRecursive(_dyeingFilePath);
  355. string sDyeingFile = _dyeingFilePath;
  356. sDyeingFile += FILE_SEP;
  357. sDyeingFile += DYEING_FILE;
  358. _dyeingTimeLogger = new DyeingTimeLogger();
  359. _dyeingTimeLogger->init(sDyeingFile, _format);
  360. _dyeingTimeLogger->modFlag(0xffff, false);
  361. }
  362. void TimeWriteT::setLogPrx(const LogPrx &logPrx)
  363. {
  364. _logPrx = logPrx;
  365. }
  366. void TimeWriteT::initError()
  367. {
  368. //远程错误日志
  369. _logger.init(_filePath + ".remote.error", _format);
  370. _logger.modFlag(0xffff, false);
  371. }
  372. void TimeWriteT::enableLocal(bool bEnable)
  373. {
  374. _local = bEnable;
  375. if(!_local)
  376. {
  377. initError();
  378. }
  379. }
  380. void TimeWriteT::operator()(ostream &of, const deque<pair<size_t, string> > &buffer)
  381. {
  382. if(_local && of && !buffer.empty())
  383. {
  384. try
  385. {
  386. _wt(of, buffer);
  387. }
  388. catch(...)
  389. {
  390. }
  391. }
  392. if(_remote && _remoteTimeLogger && !buffer.empty())
  393. {
  394. deque<pair<size_t, string> >::const_iterator it = buffer.begin();
  395. while(it != buffer.end())
  396. {
  397. _remoteTimeLogger->any() << it->second;
  398. ++it;
  399. }
  400. }
  401. vector<string> vDyeingLog;
  402. deque<pair<size_t, string> >::const_iterator it = buffer.begin();
  403. while(it != buffer.end())
  404. {
  405. if(it->first != 0)
  406. {
  407. if(!_dyeingTimeLogger)
  408. {
  409. initDyeingLog();
  410. }
  411. _dyeingTimeLogger->any() << _app << "." << _server << "|" << it->second;
  412. vDyeingLog.push_back(_app + "." + _server + "|" + it->second);
  413. }
  414. ++it;
  415. }
  416. if(_logPrx && !vDyeingLog.empty())
  417. {
  418. try
  419. {
  420. _logPrx->logger(DYEING_DIR, DYEING_FILE, "day", "%Y%m%d", vDyeingLog, ServerConfig::Context);
  421. }
  422. catch(exception &ex)
  423. {
  424. TLOGERROR("[dyeing log write to remote log server error:" << ex.what() << "]" << endl);
  425. }
  426. }
  427. }
  428. void TimeWriteT::writeError(const vector<string> &buffer)
  429. {
  430. if(!_local)
  431. {
  432. for(size_t i = 0; i < buffer.size(); i++)
  433. {
  434. _logger.any() << buffer[i];
  435. }
  436. }
  437. // //告警
  438. // string sInfo = _app + "." + _server + "|";
  439. // sInfo += ServerConfig::LocalIp + "|sync log to remote tarslog error";
  440. // FDLOG("tarserror") << sInfo <<endl;
  441. //TARS_NOTIFY_ERROR(sInfo);
  442. }
  443. void TimeWriteT::writeError(const deque<pair<size_t, string> > &buffer)
  444. {
  445. if(!_local)
  446. {
  447. deque<pair<size_t, string> >::const_iterator it = buffer.begin();
  448. while(it != buffer.end())
  449. {
  450. _logger.any() << it->second;
  451. ++it;
  452. }
  453. }
  454. // //告警
  455. // string sInfo = _app + "." + _server + "|";
  456. // sInfo += ServerConfig::LocalIp + "|sync log to remote tarslog error(buffer.size>500000)";
  457. // FDLOG("tarserror") << sInfo <<endl;
  458. //TARS_NOTIFY_ERROR(sInfo);
  459. }
  460. /////////////////////////////////////////////////////////////////////////////////////
  461. RemoteTimeLogger::RemoteTimeLogger() : _defaultLogger(NULL),_hasSufix(true),_hasAppNamePrefix(true),_concatStr("_"),_separ("|"),_hasSquareBracket(false),_local(true),_remote(true)
  462. {
  463. }
  464. RemoteTimeLogger::~RemoteTimeLogger()
  465. {
  466. terminate();
  467. }
  468. void RemoteTimeLogger::terminate()
  469. {
  470. if (!_terminate)
  471. {
  472. _terminate = true;
  473. if (_defaultLogger != NULL)
  474. {
  475. delete _defaultLogger;
  476. }
  477. auto it = _loggers.begin();
  478. while (it != _loggers.end())
  479. {
  480. delete it->second;
  481. ++it;
  482. }
  483. _loggers.clear();
  484. }
  485. }
  486. void RemoteTimeLogger::initTimeLogger(TimeLogger *pTimeLogger, const string &sFile, const string &sFormat,const LogTypePtr& logTypePtr)
  487. {
  488. string sAppSrvName;
  489. string sFilePath;
  490. if(_app.empty() && _server.empty())
  491. {
  492. sAppSrvName = "";
  493. if(_logpath.empty())
  494. {
  495. sFilePath = sAppSrvName;
  496. }
  497. else
  498. {
  499. sFilePath = _logpath + FILE_SEP + sAppSrvName;
  500. }
  501. _hasAppNamePrefix = false;
  502. }
  503. else
  504. {
  505. sAppSrvName = _hasAppNamePrefix?(_app + "." + _server):"";
  506. sFilePath = _logpath + FILE_SEP + _app + FILE_SEP + _server + FILE_SEP + sAppSrvName;
  507. }
  508. // string sAppSrvName = _hasAppNamePrefix?(_app + "." + _server):"";
  509. // string sFilePath = _logpath + "/" + _app + "/" + _server + "/" + sAppSrvName;
  510. if(!sFile.empty())
  511. {
  512. sFilePath += (_hasAppNamePrefix?_concatStr:"") + sFile;
  513. }
  514. //本地日志格式
  515. pTimeLogger->init(sFilePath, sFormat,_hasSufix,_concatStr,logTypePtr,!_local);
  516. pTimeLogger->modFlag(0xffff, false);
  517. pTimeLogger->modFlag(TC_DayLogger::HAS_TIME, true);
  518. pTimeLogger->setSeparator(_separ);
  519. pTimeLogger->enableSqareWrapper(_hasSquareBracket);
  520. pTimeLogger->setupThread(TarsLoggerThread::getInstance()->local());
  521. //远程日志格式
  522. pTimeLogger->getWriteT().enableSufix(_hasSufix);
  523. pTimeLogger->getWriteT().enablePrefix(_hasAppNamePrefix);
  524. pTimeLogger->getWriteT().setFileNameConcatStr(_concatStr);
  525. pTimeLogger->getWriteT().setSeparator(_separ);
  526. pTimeLogger->getWriteT().enableSqareWrapper(_hasSquareBracket);
  527. pTimeLogger->getWriteT().enableLocal(_local);
  528. pTimeLogger->getWriteT().enableRemote(_remote);
  529. string sLogType = "";
  530. if(logTypePtr)
  531. {
  532. sLogType = logTypePtr->toString();
  533. }
  534. ////////////
  535. PropertyReportPtr reportSuccPtr = NULL;
  536. PropertyReportPtr reportFailPtr = NULL;
  537. if (_remote && _logStatReport)
  538. {
  539. string sKey = _app + "." + _server + "." + sFile;
  540. reportSuccPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_succ", PropertyReport::sum());
  541. reportFailPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_fail", PropertyReport::sum());
  542. }
  543. pTimeLogger->getWriteT().setLogInfo(_logPrx, _app, _server, sFile, _logpath, sFormat, _setDivision, sLogType, reportSuccPtr, reportFailPtr);
  544. }
  545. void RemoteTimeLogger::initTimeLogger(TimeLogger *pTimeLogger,const string &sApp, const string &sServer, const string &sFile, const string &sFormat,const LogTypePtr& logTypePtr)
  546. {
  547. // string sAppSrvName = _hasAppNamePrefix?(sApp + "." + sServer):"";
  548. // string sFilePath = _logpath + "/" + sApp + "/" + sServer + "/" + sAppSrvName;
  549. string sAppSrvName;
  550. string sFilePath;
  551. if(sApp.empty() && sServer.empty())
  552. {
  553. sAppSrvName = "";
  554. if(_logpath.empty())
  555. {
  556. sFilePath = sAppSrvName;
  557. }
  558. else
  559. {
  560. sFilePath = _logpath + FILE_SEP + sAppSrvName;
  561. }
  562. _hasAppNamePrefix = false;
  563. }
  564. else
  565. {
  566. sAppSrvName = _hasAppNamePrefix?(sApp + "." + sServer):"";
  567. sFilePath = _logpath + FILE_SEP + sApp + FILE_SEP + sServer + FILE_SEP + sAppSrvName;
  568. }
  569. if(!sFile.empty())
  570. {
  571. sFilePath += (_hasAppNamePrefix?_concatStr:"") + sFile;
  572. }
  573. //本地日志格式
  574. pTimeLogger->init(sFilePath,sFormat,_hasSufix,_concatStr,logTypePtr,!_local);
  575. pTimeLogger->modFlag(0xffff, false);
  576. pTimeLogger->modFlag(TC_DayLogger::HAS_TIME, true);
  577. pTimeLogger->setSeparator(_separ);
  578. pTimeLogger->enableSqareWrapper(_hasSquareBracket);
  579. pTimeLogger->setupThread(TarsLoggerThread::getInstance()->local());
  580. //远程日志格式
  581. pTimeLogger->getWriteT().enableSufix(_hasSufix);
  582. pTimeLogger->getWriteT().enablePrefix(_hasAppNamePrefix);
  583. pTimeLogger->getWriteT().setFileNameConcatStr(_concatStr);
  584. pTimeLogger->getWriteT().setSeparator(_separ);
  585. pTimeLogger->getWriteT().enableSqareWrapper(_hasSquareBracket);
  586. pTimeLogger->getWriteT().enableLocal(_local);
  587. pTimeLogger->getWriteT().enableRemote(_remote);
  588. string sLogType = "";
  589. if(logTypePtr)
  590. {
  591. sLogType = logTypePtr->toString();
  592. }
  593. PropertyReportPtr reportSuccPtr = NULL;
  594. PropertyReportPtr reportFailPtr = NULL;
  595. if (_remote && _logStatReport)
  596. {
  597. string sKey = _app + "." + _server + "." + sFile;
  598. reportSuccPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_succ", PropertyReport::sum());
  599. reportFailPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_fail", PropertyReport::sum());
  600. }
  601. pTimeLogger->getWriteT().setLogInfo(_logPrx, sApp, sServer, sFile, _logpath, sFormat, _setDivision, sLogType, reportSuccPtr, reportFailPtr);
  602. }
  603. void RemoteTimeLogger::setLogInfo(const CommunicatorPtr &comm, const string &obj, const string &sApp, const string &sServer, const string &sLogpath, const string& setdivision, const bool &bLogStatReport)
  604. {
  605. _app = sApp;
  606. _server = sServer;
  607. _logpath = sLogpath;
  608. _comm = comm;
  609. _setDivision = setdivision;
  610. _logStatReport = bLogStatReport;
  611. if(!obj.empty())
  612. {
  613. _logPrx = _comm->stringToProxy<LogPrx>(obj);
  614. //单独设置超时时间
  615. _logPrx->tars_timeout(3000);
  616. if(_defaultLogger)
  617. {
  618. _defaultLogger->getWriteT().setLogPrx(_logPrx);
  619. }
  620. }
  621. //创建本地目录
  622. TC_File::makeDirRecursive(_logpath + FILE_SEP + _app + FILE_SEP + _server);
  623. }
  624. void RemoteTimeLogger::initFormat(const string &sFile, const string &sFormat,const LogTypePtr& logTypePtr)
  625. {
  626. if(sFile.empty())
  627. {
  628. if(!_defaultLogger)
  629. {
  630. _defaultLogger = new TimeLogger();
  631. }
  632. initTimeLogger(_defaultLogger, "", sFormat,logTypePtr);
  633. }
  634. else
  635. {
  636. string s = _app + FILE_SEP + _server + FILE_SEP + sFile;
  637. Lock lock(*this);
  638. auto it = _loggers.find(s);
  639. if( it == _loggers.end())
  640. {
  641. TimeLogger *p = new TimeLogger();
  642. initTimeLogger(p, sFile, sFormat,logTypePtr);
  643. _loggers[s] = p;
  644. return;
  645. }
  646. initTimeLogger(it->second, sFile, sFormat,logTypePtr);
  647. }
  648. }
  649. void RemoteTimeLogger::initFormat(const string &sApp, const string &sServer,const string &sFile, const string &sFormat,const LogTypePtr& logTypePtr)
  650. {
  651. string s = sApp + FILE_SEP + sServer + FILE_SEP+ sFile;
  652. if (sFile.empty())
  653. {
  654. if (!_defaultLogger)
  655. {
  656. _defaultLogger = new TimeLogger();
  657. initTimeLogger(_defaultLogger, "", "%Y%m%d");
  658. }
  659. }
  660. else
  661. {
  662. Lock lock(*this);
  663. auto it = _loggers.find(s);
  664. if (it == _loggers.end())
  665. {
  666. TimeLogger *p = new TimeLogger();
  667. initTimeLogger(p, sApp, sServer, sFile, sFormat, logTypePtr);
  668. _loggers[s] = p;
  669. return;
  670. }
  671. initTimeLogger(it->second, sApp, sServer, sFile, sFormat, logTypePtr);
  672. }
  673. }
  674. RemoteTimeLogger::TimeLogger* RemoteTimeLogger::logger(const string &sFile)
  675. {
  676. if(sFile.empty())
  677. {
  678. if(!_defaultLogger)
  679. {
  680. _defaultLogger = new TimeLogger();
  681. initTimeLogger(_defaultLogger, "", "%Y%m%d");
  682. }
  683. return _defaultLogger;
  684. }
  685. string s = _app + FILE_SEP + _server + FILE_SEP + sFile;
  686. Lock lock(*this);
  687. auto it = _loggers.find(s);
  688. if (it == _loggers.end())
  689. {
  690. TimeLogger *p = new TimeLogger();
  691. initTimeLogger(p, sFile, "%Y%m%d");
  692. _loggers[s] = p;
  693. return p;
  694. }
  695. return it->second;
  696. }
  697. RemoteTimeLogger::TimeLogger* RemoteTimeLogger::logger(const string &sApp, const string &sServer,const string &sFile)
  698. {
  699. string s = sApp + FILE_SEP + sServer + FILE_SEP+ sFile;
  700. if (sFile.empty())
  701. {
  702. if (!_defaultLogger)
  703. {
  704. _defaultLogger = new TimeLogger();
  705. initTimeLogger(_defaultLogger, "", "%Y%m%d");
  706. }
  707. return _defaultLogger;
  708. }
  709. else
  710. {
  711. Lock lock(*this);
  712. auto it = _loggers.find(s);
  713. if (it == _loggers.end())
  714. {
  715. TimeLogger *p = new TimeLogger();
  716. initTimeLogger(p, sApp, sServer, sFile, "%Y%m%d");
  717. _loggers[s] = p;
  718. return p;
  719. }
  720. return it->second;
  721. }
  722. }
  723. void RemoteTimeLogger::sync(const string &sFile, bool bSync)
  724. {
  725. if(bSync)
  726. {
  727. logger(sFile)->unSetupThread();
  728. }
  729. else
  730. {
  731. logger(sFile)->setupThread(TarsLoggerThread::getInstance()->local());
  732. }
  733. }
  734. void RemoteTimeLogger::enableRemote(const string &sFile, bool bEnable)
  735. {
  736. logger(sFile)->getWriteT().enableRemote(bEnable);
  737. }
  738. void RemoteTimeLogger::enableRemoteEx(const string &sApp, const string &sServer,const string &sFile, bool bEnable)
  739. {
  740. logger(sApp,sServer,sFile)->getWriteT().enableRemote(bEnable);
  741. }
  742. void RemoteTimeLogger::enableLocal(const string &sFile, bool bEnable)
  743. {
  744. logger(sFile)->getWriteT().enableLocal(bEnable);
  745. logger(sFile)->setRemote(!bEnable);
  746. }
  747. void RemoteTimeLogger::enableLocalEx(const string &sApp, const string &sServer,const string &sFile, bool bEnable)
  748. {
  749. logger(sApp,sServer,sFile)->getWriteT().enableLocal(bEnable);
  750. logger(sApp,sServer,sFile)->setRemote(!bEnable);
  751. }
  752. TarsDyeingSwitch::~TarsDyeingSwitch()
  753. {
  754. if(_needDyeing)
  755. {
  756. LocalRollLogger::getInstance()->enableDyeing(false);
  757. ServantProxyThreadData * td = ServantProxyThreadData::getData();
  758. assert(NULL != td);
  759. if (td)
  760. {
  761. td->_data._dyeing = false;
  762. td->_data._dyeingKey = "";
  763. }
  764. }
  765. }
  766. bool TarsDyeingSwitch::getDyeingKey(string & sDyeingkey)
  767. {
  768. ServantProxyThreadData * td = ServantProxyThreadData::getData();
  769. assert(NULL != td);
  770. if (td && td->_data._dyeing == true)
  771. {
  772. sDyeingkey = td->_data._dyeingKey;
  773. return true;
  774. }
  775. return false;
  776. }
  777. void TarsDyeingSwitch::enableDyeing(const string & sDyeingKey)
  778. {
  779. LocalRollLogger::getInstance()->enableDyeing(true);
  780. ServantProxyThreadData * td = ServantProxyThreadData::getData();
  781. assert(NULL != td);
  782. if(td)
  783. {
  784. td->_data._dyeing = true;
  785. td->_data._dyeingKey = sDyeingKey;
  786. }
  787. _needDyeing = true;
  788. _dyeingKey = sDyeingKey;
  789. }
  790. }