4848#include < Configuration/ConfigurationInterface.h>
4949#include < Configuration/ConfigurationFactory.h>
5050#include < Monitoring/MonitoringFactory.h>
51- #include < InfoLogger/InfoLogger.hxx>
5251
5352#include < fairmq/Device.h>
5453#include < fairmq/shmem/Monitor.h>
5958#include < cstdlib>
6059#include < cstring>
6160
62- using AliceO2::InfoLogger::InfoLogger;
63- using AliceO2::InfoLogger::InfoLoggerContext;
6461using o2::configuration::ConfigurationFactory;
6562using o2::configuration::ConfigurationInterface;
6663using o2::monitoring::Monitoring;
@@ -76,12 +73,6 @@ using Value = o2::monitoring::tags::Value;
7673namespace o2 ::framework
7774{
7875
79- // / This is a global service because read only
80- template <>
81- struct ServiceKindExtractor <InfoLoggerContext> {
82- constexpr static ServiceKind kind = ServiceKind::Global;
83- };
84-
8576#define MONITORING_QUEUE_SIZE 100
8677o2::framework::ServiceSpec CommonServices::monitoringSpec ()
8778{
@@ -200,154 +191,9 @@ o2::framework::ServiceSpec CommonServices::datatakingContextSpec()
200191 .kind = ServiceKind::Serial};
201192}
202193
203- o2::framework::ServiceSpec CommonServices::infologgerContextSpec ()
204- {
205- return ServiceSpec{
206- .name = " infologger-contex" ,
207- .init = simpleServiceInit<InfoLoggerContext, InfoLoggerContext>(),
208- .configure = noConfiguration (),
209- .start = [](ServiceRegistry& services, void * service) {
210- auto & infoLoggerContext = services.get <InfoLoggerContext>();
211- auto run = services.get <RawDeviceService>().device ()->fConfig ->GetProperty <std::string>(" runNumber" , " unspecified" );
212- infoLoggerContext.setField (InfoLoggerContext::FieldName::Run, run);
213- auto partition = services.get <RawDeviceService>().device ()->fConfig ->GetProperty <std::string>(" environment_id" , " unspecified" );
214- infoLoggerContext.setField (InfoLoggerContext::FieldName::Partition, partition);
215- },
216- .kind = ServiceKind::Serial};
217- }
218-
219- // Creates the sink for FairLogger / InfoLogger integration
220- auto createInfoLoggerSinkHelper (InfoLogger* logger, InfoLoggerContext* ctx)
221- {
222- return [logger,
223- ctx](const std::string& content, const fair::LogMetaData& metadata) {
224- // translate FMQ metadata
225- InfoLogger::InfoLogger::Severity severity = InfoLogger::Severity::Undefined;
226- int level = InfoLogger::undefinedMessageOption.level ;
227-
228- if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::nolog)) {
229- // discard
230- return ;
231- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::fatal)) {
232- severity = InfoLogger::Severity::Fatal;
233- level = 1 ;
234- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::error)) {
235- severity = InfoLogger::Severity::Error;
236- level = 3 ;
237- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::alarm)) {
238- severity = InfoLogger::Severity::Warning;
239- level = 4 ;
240- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::important)) {
241- severity = InfoLogger::Severity::Info;
242- level = 5 ;
243- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::warn)) {
244- severity = InfoLogger::Severity::Warning;
245- level = 6 ;
246- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::state)) {
247- severity = InfoLogger::Severity::Info;
248- level = 8 ;
249- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::info)) {
250- severity = InfoLogger::Severity::Info;
251- level = 10 ;
252- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::debug)) {
253- severity = InfoLogger::Severity::Debug;
254- level = 11 ;
255- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::debug1)) {
256- severity = InfoLogger::Severity::Debug;
257- level = 12 ;
258- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::debug2)) {
259- severity = InfoLogger::Severity::Debug;
260- level = 13 ;
261- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::debug3)) {
262- severity = InfoLogger::Severity::Debug;
263- level = 14 ;
264- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::debug4)) {
265- severity = InfoLogger::Severity::Debug;
266- level = 15 ;
267- } else if (metadata.severity_name == fair::Logger::SeverityName (fair::Severity::trace)) {
268- severity = InfoLogger::Severity::Debug;
269- level = 50 ;
270- }
271-
272- InfoLogger::InfoLoggerMessageOption opt = {
273- severity,
274- level,
275- InfoLogger::undefinedMessageOption.errorCode ,
276- metadata.file .c_str (),
277- atoi (metadata.line .c_str ())};
278-
279- if (logger) {
280- logger->log (opt, *ctx, " %s" , content.c_str ());
281- }
282- };
283- };
284-
285194struct MissingService {
286195};
287196
288- o2::framework::ServiceSpec CommonServices::infologgerSpec ()
289- {
290- return ServiceSpec{
291- .name = " infologger" ,
292- .init = [](ServiceRegistry& services, DeviceState&, fair::mq::ProgOptions& options) -> ServiceHandle {
293- auto infoLoggerMode = options.GetPropertyAsString (" infologger-mode" );
294- auto infoLoggerSeverity = options.GetPropertyAsString (" infologger-severity" );
295- if (infoLoggerSeverity.empty () == false && options.GetPropertyAsString (" infologger-mode" ) == " " ) {
296- LOGP (info, " Using O2_INFOLOGGER_MODE=infoLoggerD since infologger-severity is set" );
297- infoLoggerMode = " infoLoggerD" ;
298- }
299- if (infoLoggerMode != " " ) {
300- setenv (" O2_INFOLOGGER_MODE" , infoLoggerMode.c_str (), 1 );
301- }
302- char const * infoLoggerEnv = getenv (" O2_INFOLOGGER_MODE" );
303- if (infoLoggerEnv == nullptr || strcmp (infoLoggerEnv, " none" ) == 0 ) {
304- return ServiceHandle{.hash = TypeIdHelpers::uniqueId<MissingService>(),
305- .instance = nullptr ,
306- .kind = ServiceKind::Serial,
307- .name = " infologger" };
308- }
309- InfoLogger* infoLoggerService = nullptr ;
310- try {
311- infoLoggerService = new InfoLogger;
312- } catch (...) {
313- LOGP (error, " Unable to initialise InfoLogger with O2_INFOLOGGER_MODE={}." , infoLoggerMode);
314- return ServiceHandle{.hash = TypeIdHelpers::uniqueId<MissingService>(),
315- .instance = nullptr ,
316- .kind = ServiceKind::Serial,
317- .name = " infologger" };
318- }
319- auto infoLoggerContext = &services.get <InfoLoggerContext>();
320- // Only print the first 10 characters and the last 18 if the
321- // string length is greater than 32 bytes.
322- auto truncate = [](std::string in) -> std::string {
323- if (in.size () < 32 ) {
324- return in;
325- }
326- char name[32 ];
327- memcpy (name, in.data (), 10 );
328- name[10 ] = ' .' ;
329- name[11 ] = ' .' ;
330- name[12 ] = ' .' ;
331- memcpy (name + 13 , in.data () + in.size () - 18 , 18 );
332- name[31 ] = 0 ;
333- return name;
334- };
335- infoLoggerContext->setField (InfoLoggerContext::FieldName::Facility, truncate (services.get <DeviceSpec const >().name ));
336- infoLoggerContext->setField (InfoLoggerContext::FieldName::System, std::string (" DPL" ));
337- infoLoggerService->setContext (*infoLoggerContext);
338-
339- if (infoLoggerSeverity != " " ) {
340- fair::Logger::AddCustomSink (" infologger" , infoLoggerSeverity, createInfoLoggerSinkHelper (infoLoggerService, infoLoggerContext));
341- }
342- return ServiceHandle{.hash = TypeIdHelpers::uniqueId<InfoLogger>(),
343- .instance = infoLoggerService,
344- .kind = ServiceKind::Serial,
345- .name = " infologger" };
346- },
347- .configure = noConfiguration (),
348- .kind = ServiceKind::Serial};
349- }
350-
351197o2::framework::ServiceSpec CommonServices::configurationSpec ()
352198{
353199 return ServiceSpec{
@@ -917,8 +763,6 @@ std::vector<ServiceSpec> CommonServices::defaultServices(int numThreads)
917763 driverClientSpec (),
918764 datatakingContextSpec (),
919765 monitoringSpec (),
920- infologgerContextSpec (),
921- infologgerSpec (),
922766 configurationSpec (),
923767 controlSpec (),
924768 rootFileSpec (),
@@ -936,16 +780,19 @@ std::vector<ServiceSpec> CommonServices::defaultServices(int numThreads)
936780 decongestionSpec (),
937781 CommonMessageBackends::rawBufferBackendSpec ()};
938782
783+ std::string loadableServicesStr = " O2FrameworkDataTakingSupport:InfoLoggerContext,O2FrameworkDataTakingSupport:InfoLogger" ;
939784 // Load plugins depending on the environment
940785 std::vector<LoadableService> loadableServices = {};
941786 char * loadableServicesEnv = getenv (" DPL_LOAD_SERVICES" );
942787 // String to define the services to load is:
943788 //
944789 // library1:name1,library2:name2,...
945790 if (loadableServicesEnv) {
946- loadableServices = ServiceHelpers::parseServiceSpecString (loadableServicesEnv) ;
947- ServiceHelpers::loadFromPlugin (loadableServices, specs) ;
791+ loadableServicesStr += " , " ;
792+ loadableServicesStr += loadableServicesEnv ;
948793 }
794+ loadableServices = ServiceHelpers::parseServiceSpecString (loadableServicesStr.c_str ());
795+ ServiceHelpers::loadFromPlugin (loadableServices, specs);
949796 // I should make it optional depending wether the GUI is there or not...
950797 specs.push_back (CommonServices::guiMetricsSpec ());
951798 if (numThreads) {
0 commit comments