Skip to content

Commit 06ba3c8

Browse files
authored
Merge pull request #43 from sy-c/master
v1.3.11
2 parents ff3d614 + 80a277e commit 06ba3c8

File tree

7 files changed

+201
-3
lines changed

7 files changed

+201
-3
lines changed

doc/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ The InfoLogger library allows to inject messages directly from programs, as show
176176
* More information on the API can be found in the headers /opt/o2-InfoLogger/include and the corresponding
177177
documentation generated by Doxygen.
178178
179+
* When using the C++ API, it is recommended to use the macros defined in InfoLoggerMacros.hxx to have the full context defined (severity, level, errno, source file/line) for each message in a compact way.
180+
179181
* Some example calls are available in [the source code](/test/testInfoLogger.cxx)
180182
181183
* There is the possibility to easily redirect FairLogger messages (see InfoLoggerFMQ.hxx) and process stdout/stderr to infologger (see InfoLogger.hxx setStandardRedirection())
@@ -184,8 +186,7 @@ The InfoLogger library allows to inject messages directly from programs, as show
184186
185187
* The tags associated to a message consist of the following fields (which may be left undefined):
186188
* Severity: the kind of message, one of: Info (default), Error, Fatal, Warning, Debug
187-
* Level: the relative visibility of the message and associated target audience to whom is addressed the message: from 1 (important, visible to all) to 99 (low-level debug message, for experts only).
188-
For ALICE Run 2, the following ranges were used to categorize messages in DAQ/ECS: operations (1-5) support (6-10) developer (11-20) debug (21-99).
189+
* Level: the relative visibility of the message and associated target audience to whom is addressed the message: from 1 (important, visible to all) to 99 (low-level debug message, for experts only). The following ranges are defined to categorize messages for a typical production environment: operations (1-5) support (6-10) developer (11-20) trace (21-99). Trace messages are usually not enabled in normal running conditions, and relate to debugging activities (also akin of the 'Debug' severity).
189190
* Timestamp: time at which message was injected (Unix time in seconds since 1.1.1970). Precision goes to the microsecond.
190191
* Hostname: the name of the machine where the message is issued. For concision, the domain name is excluded from this tag, only the base IP host name is kept.
191192
* Rolename: the role name associated to the entity running the process. The same host might run several different roles. Example role name: FLP-TPC-1, EPN-223.

doc/releaseNotes.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,8 @@ This file describes the main feature changes for each InfoLogger released versio
3939

4040
## v1.3.10 - 04/08/2020
4141
- added automatic reconnection from clients to infoLoggerD
42+
43+
## v1.3.11 - 07/08/2020
44+
- added helper definition for typical levels (operations, support, developer, trace)
45+
- added macros for compact writing of log commands with all fields set (severity, level, errno, source file/line). See InfoLoggerMacros.hxx.
46+
- sourceFile field: leading path is removed to keep only short filename.

include/InfoLogger/InfoLogger.hxx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,21 @@ class InfoLogger
154154
Debug = 'D',
155155
Undefined = 'U' };
156156

157+
/// Some predefined constants that may be used to set the message level
158+
/// (i.e. visibility of the message, based on who reads it)
159+
/// The level is an integer in the 1-99 range (1: topmost visibility)
160+
/// The enum below provides the main boundaries for typical operations,
161+
/// and one may use finer granularity within each range.
162+
/// operations (1-5) support (6-10) developer (11-20) trace (21-99).
163+
/// Trace messages should typically not be enabled in normal running conditions,
164+
/// and usually related to debugging activities (also akin to the 'Debug' severity).
165+
enum Level {
166+
Ops = 1,
167+
Support = 6,
168+
Devel = 11,
169+
Trace = 21
170+
};
171+
157172
///////////////////////
158173
/// C-style interface
159174
///////////////////////
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// Copyright CERN and copyright holders of ALICE O2. This software is
2+
// distributed under the terms of the GNU General Public License v3 (GPL
3+
// Version 3), copied verbatim in the file "COPYING".
4+
//
5+
// See http://alice-o2.web.cern.ch/license for full licensing information.
6+
//
7+
// In applying this license CERN does not waive the privileges and immunities
8+
// granted to it by virtue of its status as an Intergovernmental Organization
9+
// or submit itself to any jurisdiction.
10+
11+
/// \file InfoLoggerMacros.hxx
12+
/// \brief Extensive preprocessor macros definitions for compact expression
13+
/// of log messages.
14+
///
15+
/// \author Sylvain Chapeland, CERN
16+
///
17+
18+
#ifndef INFOLOGGER_INFOLOGGERMACROS_HXX
19+
#define INFOLOGGER_INFOLOGGERMACROS_HXX
20+
21+
#include <InfoLogger/InfoLogger.hxx>
22+
23+
// For readability, using CamelCase convention for the macros' names
24+
// Each macro evaluates to the definition of a static InfoLoggerMessageOption
25+
// that can be used directly in a call to InfoLogger::log() function,
26+
// setting all the relevant options.
27+
// e.g. myLogger.log(Log_Info_Ops,"Hello")
28+
//
29+
// One macro is generated for each combination of Severity and Level,
30+
// with and without error code.
31+
//
32+
// The following macros are defined:
33+
//
34+
// LogInfoOps
35+
// LogInfoSupport
36+
// LogInfoDevel
37+
// LogInfoTrace
38+
// LogErrorOps
39+
// LogErrorSupport
40+
// LogErrorDevel
41+
// LogErrorTrace
42+
// LogWarningOps
43+
// LogWarningSupport
44+
// LogWarningDevel
45+
// LogWarningTrace
46+
// LogFatalOps
47+
// LogFatalSupport
48+
// LogFatalDevel
49+
// LogFatalTrace
50+
// LogDebugOps
51+
// LogDebugSupport
52+
// LogDebugDevel
53+
// LogDebugTrace
54+
//
55+
// LogInfoOps_(errno)
56+
// LogInfoSupport_(errno)
57+
// LogInfoDevel_(errno)
58+
// LogInfoTrace_(errno)
59+
// LogErrorOps_(errno)
60+
// LogErrorSupport_(errno)
61+
// LogErrorDevel_(errno)
62+
// LogErrorTrace_(errno)
63+
// LogWarningOps_(errno)
64+
// LogWarningSupport_(errno)
65+
// LogWarningDevel_(errno)
66+
// LogWarningTrace_(errno)
67+
// LogFatalOps_(errno)
68+
// LogFatalSupport_(errno)
69+
// LogFatalDevel_(errno)
70+
// LogFatalTrace_(errno)
71+
// LogDebugOps_(errno)
72+
// LogDebugSupport_(errno)
73+
// LogDebugDevel_(errno)
74+
// LogDebugTrace_(errno)
75+
76+
77+
#define LogInfoOps AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Info, AliceO2::InfoLogger::InfoLogger::Level::Ops, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
78+
#define LogInfoOps_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Info, AliceO2::InfoLogger::InfoLogger::Level::Ops, errno, __FILE__, __LINE__ }
79+
#define LogInfoSupport AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Info, AliceO2::InfoLogger::InfoLogger::Level::Support, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
80+
#define LogInfoSupport_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Info, AliceO2::InfoLogger::InfoLogger::Level::Support, errno, __FILE__, __LINE__ }
81+
#define LogInfoDevel AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Info, AliceO2::InfoLogger::InfoLogger::Level::Devel, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
82+
#define LogInfoDevel_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Info, AliceO2::InfoLogger::InfoLogger::Level::Devel, errno, __FILE__, __LINE__ }
83+
#define LogInfoTrace AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Info, AliceO2::InfoLogger::InfoLogger::Level::Trace, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
84+
#define LogInfoTrace_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Info, AliceO2::InfoLogger::InfoLogger::Level::Trace, errno, __FILE__, __LINE__ }
85+
86+
87+
#define LogErrorOps AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Error, AliceO2::InfoLogger::InfoLogger::Level::Ops, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
88+
#define LogErrorOps_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Error, AliceO2::InfoLogger::InfoLogger::Level::Ops, errno, __FILE__, __LINE__ }
89+
#define LogErrorSupport AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Error, AliceO2::InfoLogger::InfoLogger::Level::Support, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
90+
#define LogErrorSupport_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Error, AliceO2::InfoLogger::InfoLogger::Level::Support, errno, __FILE__, __LINE__ }
91+
#define LogErrorDevel AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Error, AliceO2::InfoLogger::InfoLogger::Level::Devel, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
92+
#define LogErrorDevel_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Error, AliceO2::InfoLogger::InfoLogger::Level::Devel, errno, __FILE__, __LINE__ }
93+
#define LogErrorTrace AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Error, AliceO2::InfoLogger::InfoLogger::Level::Trace, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
94+
#define LogErrorTrace_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Error, AliceO2::InfoLogger::InfoLogger::Level::Trace, errno, __FILE__, __LINE__ }
95+
96+
97+
#define LogWarningOps AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Warning, AliceO2::InfoLogger::InfoLogger::Level::Ops, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
98+
#define LogWarningOps_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Warning, AliceO2::InfoLogger::InfoLogger::Level::Ops, errno, __FILE__, __LINE__ }
99+
#define LogWarningSupport AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Warning, AliceO2::InfoLogger::InfoLogger::Level::Support, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
100+
#define LogWarningSupport_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Warning, AliceO2::InfoLogger::InfoLogger::Level::Support, errno, __FILE__, __LINE__ }
101+
#define LogWarningDevel AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Warning, AliceO2::InfoLogger::InfoLogger::Level::Devel, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
102+
#define LogWarningDevel_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Warning, AliceO2::InfoLogger::InfoLogger::Level::Devel, errno, __FILE__, __LINE__ }
103+
#define LogWarningTrace AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Warning, AliceO2::InfoLogger::InfoLogger::Level::Trace, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
104+
#define LogWarningTrace_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Warning, AliceO2::InfoLogger::InfoLogger::Level::Trace, errno, __FILE__, __LINE__ }
105+
106+
107+
#define LogFatalOps AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Fatal, AliceO2::InfoLogger::InfoLogger::Level::Ops, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
108+
#define LogFatalOps_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Fatal, AliceO2::InfoLogger::InfoLogger::Level::Ops, errno, __FILE__, __LINE__ }
109+
#define LogFatalSupport AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Fatal, AliceO2::InfoLogger::InfoLogger::Level::Support, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
110+
#define LogFatalSupport_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Fatal, AliceO2::InfoLogger::InfoLogger::Level::Support, errno, __FILE__, __LINE__ }
111+
#define LogFatalDevel AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Fatal, AliceO2::InfoLogger::InfoLogger::Level::Devel, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
112+
#define LogFatalDevel_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Fatal, AliceO2::InfoLogger::InfoLogger::Level::Devel, errno, __FILE__, __LINE__ }
113+
#define LogFatalTrace AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Fatal, AliceO2::InfoLogger::InfoLogger::Level::Trace, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
114+
#define LogFatalTrace_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Fatal, AliceO2::InfoLogger::InfoLogger::Level::Trace, errno, __FILE__, __LINE__ }
115+
116+
117+
#define LogDebugOps AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Debug, AliceO2::InfoLogger::InfoLogger::Level::Ops, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
118+
#define LogDebugOps_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Debug, AliceO2::InfoLogger::InfoLogger::Level::Ops, errno, __FILE__, __LINE__ }
119+
#define LogDebugSupport AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Debug, AliceO2::InfoLogger::InfoLogger::Level::Support, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
120+
#define LogDebugSupport_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Debug, AliceO2::InfoLogger::InfoLogger::Level::Support, errno, __FILE__, __LINE__ }
121+
#define LogDebugDevel AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Debug, AliceO2::InfoLogger::InfoLogger::Level::Devel, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
122+
#define LogDebugDevel_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Debug, AliceO2::InfoLogger::InfoLogger::Level::Devel, errno, __FILE__, __LINE__ }
123+
#define LogDebugTrace AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Debug, AliceO2::InfoLogger::InfoLogger::Level::Trace, AliceO2::InfoLogger::InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }
124+
#define LogDebugTrace_(errno) AliceO2::InfoLogger::InfoLogger::InfoLoggerMessageOption { AliceO2::InfoLogger::InfoLogger::Severity::Debug, AliceO2::InfoLogger::InfoLogger::Level::Trace, errno, __FILE__, __LINE__ }
125+
126+
127+
#endif //INFOLOGGER_INFOLOGGERMACROS_HXX
128+
129+

src/InfoLogger.cxx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,15 @@ int InfoLogger::Impl::pushMessage(const InfoLoggerMessageOption& options, const
379379
InfoLoggerMessageHelperSetValue(msg, msgHelper.ix_errcode, Int, options.errorCode);
380380
}
381381
if (options.sourceFile != undefinedMessageOption.sourceFile) {
382-
InfoLoggerMessageHelperSetValue(msg, msgHelper.ix_errsource, String, options.sourceFile);
382+
// trim directory path to keep it short
383+
const char *shortName=options.sourceFile;
384+
for (int i=(int)strlen(options.sourceFile)-1; i>=0; i--) {
385+
if (options.sourceFile[i]=='/') {
386+
shortName=&options.sourceFile[i+1];
387+
break;
388+
}
389+
}
390+
InfoLoggerMessageHelperSetValue(msg, msgHelper.ix_errsource, String, shortName);
383391
}
384392
if (options.sourceLine != undefinedMessageOption.sourceLine) {
385393
InfoLoggerMessageHelperSetValue(msg, msgHelper.ix_errline, Int, options.sourceLine);

src/infoLoggerGenerateMacros.tcl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/usr/bin/tclsh
2+
3+
# generate macros for compact writing of infologger expressions
4+
5+
6+
# namespace
7+
set ns "AliceO2::InfoLogger::"
8+
9+
# severity
10+
set lSeverity {Info Error Warning Fatal Debug}
11+
12+
# level
13+
set lLevel {Ops Support Devel Trace}
14+
15+
16+
foreach s $lSeverity {
17+
foreach l $lLevel {
18+
puts "// Log${s}${l}"
19+
}
20+
}
21+
puts "//"
22+
foreach s $lSeverity {
23+
foreach l $lLevel {
24+
puts "// Log${s}${l}_(errno)"
25+
}
26+
}
27+
28+
29+
foreach s $lSeverity {
30+
puts "\n"
31+
foreach l $lLevel {
32+
# one without error code
33+
puts "#define Log${s}${l} ${ns}InfoLogger::InfoLoggerMessageOption { ${ns}InfoLogger::Severity::${s}, ${ns}InfoLogger::Level::${l}, ${ns}InfoLogger::undefinedMessageOption.errorCode, __FILE__, __LINE__ }"
34+
# one with error code
35+
puts "#define Log${s}${l}_(errno) ${ns}InfoLogger::InfoLoggerMessageOption { ${ns}InfoLogger::Severity::${s}, ${ns}InfoLogger::Level::${l}, errno, __FILE__, __LINE__ }"
36+
}
37+
}

test/testInfoLogger.cxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <InfoLogger/InfoLogger.hxx>
1717
#include <boost/format.hpp>
1818
#include <InfoLoggerErrorCodes.h>
19+
#include <InfoLogger/InfoLoggerMacros.hxx>
1920

2021
using namespace AliceO2::InfoLogger;
2122

@@ -55,5 +56,7 @@ int main()
5556
theLog << LOGINFO(10) << "infoLogger message test with source code info, level 10" << InfoLogger::endm;
5657
theLog << LOGERROR(10, 999) << "infoLogger error message test with source code info, level 10 errcode 999" << InfoLogger::endm;
5758

59+
theLog.log(LogInfoDevel, "Test message with InfoLoggerMessageOption macro");
60+
5861
return 0;
5962
}

0 commit comments

Comments
 (0)