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