1 #include "cetlib/PluginTypeDeducer.h"
2 #include "cetlib/ostream_handle.h"
3 #include "fhiclcpp/ParameterSet.h"
5 #include "messagefacility/MessageService/ELdestination.h"
6 #include "messagefacility/MessageService/ELostreamOutput.h"
7 #include "messagefacility/Utilities/ELseverityLevel.h"
8 #include "messagefacility/Utilities/exception.h"
9 #include "cetlib/compiler_macros.h"
16 #if MESSAGEFACILITY_HEX_VERSION < 0x20201 // format changed to format_ for s67
17 #define format_ format
22 using namespace mf::service;
23 using mf::ELseverityLevel;
31 #if MESSAGEFACILITY_HEX_VERSION >= 0x20103
34 fhicl::TableFragment<ELostreamOutput::Config> elOstrConfig;
35 fhicl::Atom<std::string> delimiter{ fhicl::Name{
"field_delimiter" },fhicl::Comment{
"String to print between each message field" },
" " };
37 using Parameters = fhicl::WrappedTable<Config>;
40 #if MESSAGEFACILITY_HEX_VERSION < 0x20103 // v2_01_03 is s58, pre v2_01_03 is s50
46 virtual void fillPrefix(std::ostringstream&,
const ErrorObj&)
override;
47 virtual void fillUsrMsg(std::ostringstream&,
const ErrorObj&)
override;
48 virtual void fillSuffix(std::ostringstream&,
const ErrorObj&)
override;
51 std::string delimeter_;
63 #if MESSAGEFACILITY_HEX_VERSION < 0x20103 // v2_01_03 is s58, pre v2_01_03 is s50
64 ELFriendly::ELFriendly(
const fhicl::ParameterSet& pset)
65 : ELostreamOutput(pset, cet::ostream_handle{ std::cout },
false)
66 , delimeter_(pset.get<std::string>(
"field_delimeter",
" "))
68 ELFriendly::ELFriendly(Parameters
const& pset)
69 : ELostreamOutput(pset().elOstrConfig(), cet::ostream_handle{ std::cout },
false)
70 , delimeter_(pset().delimiter())
77 void ELFriendly::fillPrefix(std::ostringstream& oss,
const ErrorObj& msg)
83 #if MESSAGEFACILITY_HEX_VERSION < 0x20201 // format changed to format_ for s67
84 format_.preambleMode =
true;
87 auto const& xid = msg.xid();
90 auto app = xid.application();
91 auto module = xid.module();
92 auto subroutine = xid.subroutine();
93 std::replace(
id.begin(),
id.end(),
' ',
'-');
94 std::replace(app.begin(), app.end(),
' ',
'-');
95 std::replace(module.begin(), module.end(),
' ',
'-');
96 std::replace(subroutine.begin(), subroutine.end(),
' ',
'-');
98 emitToken(oss,
"%MSG");
99 emitToken(oss, xid.severity().getSymbol());
100 emitToken(oss, delimeter_);
102 emitToken(oss, msg.idOverflow());
104 emitToken(oss, delimeter_);
108 if (format_.want(SERIAL))
110 std::ostringstream s;
112 emitToken(oss,
"[serial #" + s.str() +
"]");
113 emitToken(oss, delimeter_);
118 bool needAspace =
true;
119 if (format_.want(EPILOGUE_SEPARATE))
121 if (module.length() + subroutine.length() > 0)
123 emitToken(oss,
"\n");
126 else if (format_.want(TIMESTAMP) && !format_.want(TIME_SEPARATE))
128 emitToken(oss,
"\n");
132 if (format_.want(MODULE) && (module.length() > 0))
136 emitToken(oss, delimeter_);
139 emitToken(oss, module +
" ");
141 if (format_.want(SUBROUTINE) && (subroutine.length() > 0))
145 emitToken(oss, delimeter_);
148 emitToken(oss, subroutine +
"()");
149 emitToken(oss, delimeter_);
154 if (format_.want(TIMESTAMP))
156 if (format_.want(TIME_SEPARATE))
158 emitToken(oss,
"\n");
163 emitToken(oss, delimeter_);
166 emitToken(oss, format_.timestamp(msg.timestamp()));
167 emitToken(oss, delimeter_);
172 if (format_.want(SOME_CONTEXT))
176 emitToken(oss, delimeter_);
179 emitToken(oss, msg.context());
186 void ELFriendly::fillUsrMsg(std::ostringstream& oss, ErrorObj
const& msg)
188 if (!format_.want(TEXT))
return;
190 #if MESSAGEFACILITY_HEX_VERSION < 0x20201 // format changed to format_ for s67
191 format_.preambleMode =
false;
193 auto const usrMsgStart = std::next(msg.items().cbegin(), 4);
194 auto it = msg.items().cbegin();
197 if (
true || !msg.is_verbatim())
201 while (it != usrMsgStart)
203 if (!it->compare(
" ") && !std::next(it)->compare(
"--"))
211 emitToken(oss, *it++);
216 if (format_.want(NO_LINE_BREAKS)) emitToken(oss,
" ==> ");
217 else emitToken(oss,
"",
true);
221 auto const end = msg.items().cend();
222 for (; it != end; ++it)
231 void ELFriendly::fillSuffix(std::ostringstream& oss, ErrorObj
const& msg)
233 if ((
true || !msg.is_verbatim()) && !format_.want(NO_LINE_BREAKS))
235 emitToken(oss,
"\n%MSG");
250 #ifndef EXTERN_C_FUNC_DECLARE_START
251 #define EXTERN_C_FUNC_DECLARE_START extern "C" {
254 EXTERN_C_FUNC_DECLARE_START
255 auto makePlugin(
const std::string&,
256 const fhicl::ParameterSet& pset)
258 return std::make_unique<mfplugins::ELFriendly>(pset);
262 DEFINE_BASIC_PLUGINTYPE_FUNC(mf::service::ELdestination)
Parser-Friendly Message Facility destination plugin