DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
StandardStreamOutput.cpp
Go to the documentation of this file.
1/*
2 * StandardStreamOutput.cxx
3 * ers
4 *
5 * Created by Serguei Kolos on 02.08.07.
6 * Copyright 2007 CERN. All rights reserved.
7 *
8 */
9#include <iomanip>
10
11#include <ers/Issue.hpp>
13#include <ers/Severity.hpp>
14#include <ers/internal/Util.hpp>
15
16#include <boost/algorithm/string.hpp>
17
18#define FIELD_SEPARATOR "\n\t"
19
20namespace
21{
22 std::function<std::string( const ers::Issue & issue )> getTimeFormatter()
23 {
24 static std::string format = ers::read_from_environment(
25 "DUNEDAQ_ERS_TIMESTAMP_FORMAT", "%Y-%b-%d %H:%M:%S");
26
27 static const std::string precision = ers::read_from_environment(
28 "DUNEDAQ_ERS_TIMESTAMP_PRECISION", "MILLI");
29
30 static const bool isUTC = ::getenv("DUNEDAQ_ERS_TIMESTAMP_UTC");
31
32 if ( boost::algorithm::ifind_first(precision, "NANO") ) {
33 return [](const ers::Issue & issue){
34 return issue.time<std::chrono::nanoseconds>(format, isUTC);
35 };
36 }
37
38 if ( boost::algorithm::ifind_first(precision, "MICRO") ) {
39 return [](const ers::Issue & issue){
40 return issue.time<std::chrono::microseconds>(format, isUTC);
41 };
42 }
43
44 if ( boost::algorithm::ifind_first(precision, "MILLI") ) {
45 return [](const ers::Issue & issue){
46 return issue.time<std::chrono::milliseconds>(format, isUTC);
47 };
48 }
49
50 return [](const ers::Issue & issue) {
51 return issue.time(format, isUTC);
52 };
53 }
54
55 const auto formatted_time = getTimeFormatter();
56}
57
58std::ostream &
59ers::StandardStreamOutput::println( std::ostream & out, const Issue & issue, int verbosity )
60{
61 print( out, issue, verbosity );
62 out << std::endl;
63 return out;
64}
65
66std::ostream &
67ers::StandardStreamOutput::print( std::ostream & out, const Issue & issue, int verbosity )
68{
69 if ( verbosity > -3 )
70 {
71 out << formatted_time( issue ) << " ";
72 }
73
74 if ( verbosity > -2 )
75 {
76 out << ers::to_string( issue.severity() ) << " ";
77 }
78
79 if ( verbosity > -1 )
80 {
81 out << "[" << issue.context().position( verbosity ) << "] ";
82 }
83
84 out << issue.message();
85
86 if ( verbosity > 1 )
87 {
88 out << FIELD_SEPARATOR << "Parameters = ";
89 for ( ers::string_map::const_iterator it = issue.parameters().begin(); it != issue.parameters().end(); ++it )
90 {
91 out << "'" << it->first << "=" << it->second << "' ";
92 }
93
94 out << FIELD_SEPARATOR << "Qualifiers = ";
95 for ( std::vector<std::string>::const_iterator it = issue.qualifiers().begin(); it != issue.qualifiers().end(); ++it )
96 {
97 out << "'" << *it << "' ";
98 }
99 }
100
101 if ( verbosity > 2 )
102 {
103 out << FIELD_SEPARATOR << "host = " << issue.context().host_name()
104 << FIELD_SEPARATOR << "user = " << issue.context().user_name()
105 << " (" << issue.context().user_id() << ")"
106 << FIELD_SEPARATOR << "process id = " << issue.context().process_id()
107 << FIELD_SEPARATOR << "thread id = " << issue.context().thread_id()
108 << FIELD_SEPARATOR << "process wd = " << issue.context().cwd();
109 }
110
111 if ( verbosity > 3 )
112 {
113 std::ios_base::fmtflags flags( out.flags() );
114
115 out << std::left;
116 std::vector<std::string> stack = issue.context().stack();
117 out << FIELD_SEPARATOR << "stack trace of the crashing thread:";
118 for( size_t i = 0; i < stack.size(); i++ )
119 {
120 out << FIELD_SEPARATOR << " #" << std::setw(3) << i << stack[i];
121 }
122 // restore the original state
123 out.flags( flags );
124 }
125
126 if ( issue.cause() )
127 {
128 out << FIELD_SEPARATOR << "was caused by: " << *issue.cause();
129 }
130
131 return out;
132}
#define FIELD_SEPARATOR
virtual const char * user_name() const =0
virtual int user_id() const =0
virtual pid_t thread_id() const =0
virtual const char * host_name() const =0
std::string position(int verbosity=ers::Configuration::instance().verbosity_level()) const
Definition Context.cpp:105
virtual pid_t process_id() const =0
virtual const char * cwd() const =0
std::vector< std::string > stack() const
Definition Context.cpp:84
Base class for any user define issue.
Definition Issue.hpp:69
const Context & context() const
Context of the issue.
Definition Issue.hpp:100
ers::Severity severity() const
severity of the issue
Definition Issue.hpp:112
const std::vector< std::string > & qualifiers() const
return array of qualifiers
Definition Issue.hpp:106
const std::string & message() const
General cause of the issue.
Definition Issue.hpp:103
const string_map & parameters() const
return array of parameters
Definition Issue.hpp:109
std::string time(const std::string &format="%Y-%b-%d %H:%M:%S", bool isUTC=false) const
string representation of local time of the issue
Definition Issue.hpp:218
const Issue * cause() const
return the cause Issue of this Issue
Definition Issue.hpp:97
int read_from_environment(const char *name, int default_value)
Definition Util.cpp:27
std::string to_string(severity s)
static std::ostream & print(std::ostream &out, const Issue &issue, int verbosity)
static std::ostream & println(std::ostream &out, const Issue &issue, int verbosity)