20 #ifndef CRM_LOGGING__H    21 #  define CRM_LOGGING__H    25 #  include <qb/qblog.h>    26 #  include <libxml/tree.h>    36 #    define LOG_TRACE   (LOG_DEBUG+1)    41 #    define LOG_STDOUT  254    46 #    define LOG_NEVER   255    52 #  define crm_extended_logging(t, e) qb_log_ctl((t), QB_LOG_CONF_EXTENDED, (e))    61 crm_extended_logging(
int t, 
int e)
   105                       gboolean to_stderr, 
int argc, 
char **argv, gboolean quiet);
   108 void crm_log_output_fn(
const char *file, 
const char *
function, 
int line, 
int level,
   109                        const char *prefix, 
const char *output);
   112 #define crm_log_output(level, prefix, output)   \   113     crm_log_output_fn(__FILE__, __func__, __LINE__, level, prefix, output)   123 void log_data_element(
int log_level, 
const char *file, 
const char *
function, 
int line,
   124                       const char *prefix, xmlNode * 
data, 
int depth, gboolean formatted);
   136 #if defined(__clang__)   137 #    define CRM_TRACE_INIT_DATA(name)   140 #    define CRM_TRACE_INIT_DATA(name) QB_LOG_INIT_DATA(name)   156 #  define do_crm_log(level, fmt, args...) do {                              \   159                 printf(fmt "\n" , ##args);                                  \   164                 qb_log_from_external_source(__func__, __FILE__, fmt,        \   165                     (level),   __LINE__, 0 , ##args);                       \   180 #  define do_crm_log_unlikely(level, fmt, args...) do {                     \   182             case LOG_STDOUT: case LOG_NEVER:                                \   185                 static struct qb_log_callsite *trace_cs = NULL;             \   186                 if (trace_cs == NULL) {                                     \   187                     trace_cs = qb_log_callsite_get(__func__, __FILE__, fmt, \   188                                                    (level), __LINE__, 0);   \   190                 if (crm_is_callsite_active(trace_cs, (level), 0)) {         \   191                     qb_log_from_external_source(__func__, __FILE__, fmt,    \   192                         (level), __LINE__, 0 , ##args);                     \   199 #  define CRM_LOG_ASSERT(expr) do {                 \   200         if(__unlikely((expr) == FALSE)) {               \   201             static struct qb_log_callsite *core_cs = NULL;              \   202             if(core_cs == NULL) {                                       \   203                 core_cs = qb_log_callsite_get(__func__, __FILE__,       \   204                                               "log-assert", LOG_TRACE,  \   207             crm_abort(__FILE__, __func__, __LINE__, #expr,              \   208                       core_cs?core_cs->targets:FALSE, TRUE);            \   215 #  define CRM_CHECK(expr, failure_action) do {                          \   216         if (__unlikely((expr) == FALSE)) {                              \   217             static struct qb_log_callsite *core_cs = NULL;              \   218             if (core_cs == NULL) {                                      \   219                 core_cs = qb_log_callsite_get(__func__, __FILE__,       \   221                                               LOG_TRACE, __LINE__, 0);  \   223             crm_abort(__FILE__, __func__, __LINE__, #expr,              \   224                 (core_cs? core_cs->targets: FALSE), TRUE);              \   239 #  define do_crm_log_xml(level, text, xml) do {                             \   241             case LOG_STDOUT: case LOG_NEVER:                                \   244                 static struct qb_log_callsite *xml_cs = NULL;               \   245                 if (xml_cs == NULL) {                                       \   246                     xml_cs = qb_log_callsite_get(__func__, __FILE__,        \   247                                         "xml-blob", (level), __LINE__, 0);  \   249                 if (crm_is_callsite_active(xml_cs, (level), 0)) {           \   250                     log_data_element((level), __FILE__, __func__,           \   251                          __LINE__, text, xml, 1, xml_log_option_formatted); \   270 #  define do_crm_log_alias(level, file, function, line, fmt, args...) do {  \   273                 printf(fmt "\n" , ##args);                                  \   278                 qb_log_from_external_source(function, file, fmt, (level),   \   298 #  define crm_perror(level, fmt, args...) do {                              \   303                 const char *err = strerror(errno);                          \   305                 if ((level) <= (int) crm_log_level) {                       \   306                     fprintf(stderr, fmt ": %s (%d)\n" , ##args, err, errno);\   308                 do_crm_log((level), fmt ": %s (%d)" , ##args, err, errno);  \   325 #  define crm_log_tag(level, tag, fmt, args...)    do {                     \   327             case LOG_STDOUT: case LOG_NEVER:                                \   330                 static struct qb_log_callsite *trace_tag_cs = NULL;         \   331                 int converted_tag = g_quark_try_string(tag);                \   332                 if (trace_tag_cs == NULL) {                                 \   333                     trace_tag_cs = qb_log_callsite_get(__func__, __FILE__,  \   334                                     fmt, (level), __LINE__, converted_tag); \   336                 if (crm_is_callsite_active(trace_tag_cs, (level),           \   338                     qb_log_from_external_source(__func__, __FILE__, fmt,    \   339                                 (level), __LINE__, converted_tag , ##args); \   345 #  define crm_emerg(fmt, args...)   qb_log(LOG_EMERG,       fmt , ##args)   346 #  define crm_crit(fmt, args...)    qb_logt(LOG_CRIT,    0, fmt , ##args)   347 #  define crm_err(fmt, args...)     qb_logt(LOG_ERR,     0, fmt , ##args)   348 #  define crm_warn(fmt, args...)    qb_logt(LOG_WARNING, 0, fmt , ##args)   349 #  define crm_notice(fmt, args...)  qb_logt(LOG_NOTICE,  0, fmt , ##args)   350 #  define crm_info(fmt, args...)    qb_logt(LOG_INFO,    0, fmt , ##args)   352 #  define crm_debug(fmt, args...)   do_crm_log_unlikely(LOG_DEBUG, fmt , ##args)   353 #  define crm_trace(fmt, args...)   do_crm_log_unlikely(LOG_TRACE, fmt , ##args)   355 #  define crm_log_xml_crit(xml, text)    do_crm_log_xml(LOG_CRIT,    text, xml)   356 #  define crm_log_xml_err(xml, text)     do_crm_log_xml(LOG_ERR,     text, xml)   357 #  define crm_log_xml_warn(xml, text)    do_crm_log_xml(LOG_WARNING, text, xml)   358 #  define crm_log_xml_notice(xml, text)  do_crm_log_xml(LOG_NOTICE,  text, xml)   359 #  define crm_log_xml_info(xml, text)    do_crm_log_xml(LOG_INFO,    text, xml)   360 #  define crm_log_xml_debug(xml, text)   do_crm_log_xml(LOG_DEBUG,   text, xml)   361 #  define crm_log_xml_trace(xml, text)   do_crm_log_xml(LOG_TRACE,   text, xml)   363 #  define crm_log_xml_explicit(xml, text)  do {                 \   364         static struct qb_log_callsite *digest_cs = NULL;        \   365         digest_cs = qb_log_callsite_get(                        \   366             __func__, __FILE__, text, LOG_TRACE, __LINE__,      \   368         if (digest_cs && digest_cs->targets) {                  \   369             do_crm_log_xml(LOG_TRACE,   text, xml);             \   373 #  define crm_str(x)    (const char*)(x?x:"<null>")   375 #ifndef PCMK__NO_COMPAT   392 #  define do_crm_log_always(level, fmt, args...) do {                       \   394             case LOG_STDOUT: case LOG_NEVER:                                \   397                 qb_log((level), fmt , ##args);                              \   402 #endif // PCMK__NO_COMPAT void crm_write_blackbox(int nsig, struct qb_log_callsite *callsite)
 
void crm_enable_stderr(int enable)
 
void log_data_element(int log_level, const char *file, const char *function, int line, const char *prefix, xmlNode *data, int depth, gboolean formatted)
 
bool pcmk__config_warning
 
gboolean crm_log_init(const char *entity, uint8_t level, gboolean daemon, gboolean to_stderr, int argc, char **argv, gboolean quiet)
 
unsigned int crm_trace_nonlog
 
gboolean crm_log_cli_init(const char *entity)
 
void crm_bump_log_level(int argc, char **argv)
Make logging more verbose.
 
void crm_log_deinit(void)
 
int daemon(int nochdir, int noclose)
 
void crm_log_output_fn(const char *file, const char *function, int line, int level, const char *prefix, const char *output)
 
void crm_enable_blackbox(int nsig)
 
void crm_log_args(int argc, char **argv)
Log the command line (once)
 
unsigned int set_crm_log_level(unsigned int level)
 
void crm_log_preinit(const char *entity, int argc, char **argv)
 
gboolean crm_is_callsite_active(struct qb_log_callsite *cs, uint8_t level, uint32_t tags)
 
unsigned int get_crm_log_level(void)
 
unsigned int crm_log_level
 
void crm_disable_blackbox(int nsig)
 
gboolean crm_add_logfile(const char *filename)
 
void crm_update_callsites(void)