blob: f5aab90b6039e0e90330fcfe3d3bd31eb4445615 [file] [log] [blame]
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
#include <sys/time.h>
#include "common/evl_sqlog_eventnum.h"
#include "tminfo.h"
#include "tmlogging.h"
#include "seabed/logalt.h"
#include "CommonLogger.h"
int gv_dual_logging = 1; // Write to both SeaLog and stdout by default
static std::string TM_COMPONENT = "TM";
static bool gv_log4cxx_initialized = false;
int tm_init_logging()
{
// Log4cxx logging
MS_Mon_Process_Info_Type proc_info;
msg_mon_get_process_info_detail(NULL, &proc_info);
int myNid = proc_info.nid;
char logNameSuffix[32];
sprintf( logNameSuffix, "_%d.log", myNid );
CommonLogger::instance().initLog4cxx("log4cxx.trafodion.tm.config",logNameSuffix);
gv_log4cxx_initialized = true;
ms_getenv_int ("TM_DUAL_LOGGING", &gv_dual_logging);
return gv_dual_logging;
}
int tm_log_write(int pv_event_type, posix_sqlog_severity_t pv_severity, char *err_string, char *exception_stack, long transid)
{
char my_processName[MS_MON_MAX_PROCESS_NAME+1];
int my_nid,my_pid;
logLevel ll_severity = LL_INFO;
getTMLoggingHeaderInfo(pv_severity, ll_severity, my_processName, sizeof(my_processName), my_nid, my_pid);
if (! gv_log4cxx_initialized) {
tm_log_stdout(pv_event_type, pv_severity, err_string, 0, transid,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, exception_stack);
return -1;
}
if (exception_stack == NULL)
CommonLogger::log(TM_COMPONENT, ll_severity, "Node: %d Pid: %d Name: %s TransId: %Ld Event: %d Message: %s ",
my_nid, my_pid, my_processName, transid, pv_event_type, err_string);
else
CommonLogger::log(TM_COMPONENT, ll_severity, "Node: %d Pid: %d Name: %s TransId: %Ld Event: %d Message: Error at %s caused by exception %s ",
my_nid, my_pid, my_processName, transid, pv_event_type, err_string, exception_stack);
return 0;
}
int tm_log_event(int event_id,
posix_sqlog_severity_t severity,
const char *temp_string,
int error_code,
int rmid,
int dtmid,
int seq_num,
int msgid,
int xa_error,
int pool_size,
int pool_elems,
int msg_retries,
int pool_high,
int pool_low,
int pool_max,
int tx_state,
int data,
int data1,
int64 data2,
const char *string1,
int node,
int msgid2,
int offset,
int tm_event_msg,
uint data4)
{
int rc = 0;
char la_buf[DTM_STRING_BUF_SIZE];
if (gv_dual_logging || (! gv_log4cxx_initialized))
{
tm_log_stdout(event_id, severity, temp_string, error_code, -1, rmid, dtmid, seq_num, msgid, xa_error,
pool_size, pool_elems, msg_retries, pool_high, pool_low, pool_max, tx_state,
data, data1, data2, string1, node, msgid2, offset, tm_event_msg, data4);
if (! gv_log4cxx_initialized)
return -1;
}
char my_processName[MS_MON_MAX_PROCESS_NAME+1];
int my_nid,my_pid;
logLevel ll_severity = LL_INFO;
getTMLoggingHeaderInfo(severity, ll_severity, my_processName, sizeof(my_processName), my_nid, my_pid);
la_buf[0] = '\0';
if (msgid != -1)
sprintf(la_buf, ", msgid=%d",msgid);
if (xa_error != -1)
sprintf(la_buf+strlen(la_buf), ", XAERR=%d",xa_error);
if (pool_size != -1)
sprintf(la_buf+strlen(la_buf), ", pool_size=%d",pool_size);
if (pool_elems != -1)
sprintf(la_buf+strlen(la_buf), ", elements in pool=%d",pool_elems);
if (msg_retries != -1)
sprintf(la_buf+strlen(la_buf), ", msg retries=%d",msg_retries);
if (pool_high != -1)
sprintf(la_buf+strlen(la_buf), ", pool_high_ss=%d",pool_high);
if (pool_low != -1)
sprintf(la_buf+strlen(la_buf), ", pool_low_ss=%d",pool_low);
if (pool_max != -1)
sprintf(la_buf+strlen(la_buf), ", pool_max_size=%d",pool_max);
if (tx_state != -1)
sprintf(la_buf+strlen(la_buf), ", Txn State=%d",tx_state);
if (data != -1)
sprintf(la_buf+strlen(la_buf), ", data=%d",data);
if (data1 != -1)
sprintf(la_buf+strlen(la_buf), ", data1=%d",data1);
if (data2 != -1)
sprintf(la_buf+strlen(la_buf), ", data2=" PFLL,data2);
if (node != -1)
sprintf(la_buf+strlen(la_buf), ", node=%d",node);
if (msgid2 != -1)
sprintf(la_buf+strlen(la_buf), ", msgid2=%d",msgid2);
if (offset != -1)
sprintf(la_buf+strlen(la_buf), ", offset=%d",offset);
if (tm_event_msg != -1)
sprintf(la_buf+strlen(la_buf), ", tm_event_msg=%d",tm_event_msg);
if (data4 != 0)
sprintf(la_buf+strlen(la_buf), ", data4=%u",data4);
CommonLogger::log(TM_COMPONENT, ll_severity, "Node: %d Pid: %d Name: %s TransId: %d,%d,%d Event: %d Message: %s %s %s",
my_nid, my_pid, my_processName, rmid, dtmid, seq_num, event_id, temp_string, (string1 == NULL ? "" : string1), la_buf);
return rc;
}
int tm_log_stdout(int event_id,
posix_sqlog_severity_t severity,
const char *temp_string,
int error_code,
int64 transid,
int rmid,
int dtmid,
int seq_num,
int msgid,
int xa_error,
int pool_size,
int pool_elems,
int msg_retries,
int pool_high,
int pool_low,
int pool_max,
int tx_state,
int data,
int data1,
int64 data2,
const char *string1,
int node,
int msgid2,
int offset,
int tm_event_msg,
uint data4)
{
time_t current_time;
char timestamp[50];
char my_name[MS_MON_MAX_PROCESS_NAME];
int my_nid,my_pid;
int error = 0;
logLevel ll_severity = LL_INFO;
current_time = time(NULL);
ctime_r(&current_time,timestamp);
timestamp[strlen(timestamp)-1] = '\0';
printf("%s ", timestamp);
getTMLoggingHeaderInfo(severity, ll_severity, my_name, sizeof(my_name), my_nid, my_pid);
printf("(%s,%u,%u) ",my_name,my_nid,my_pid);
printf("Event %s(%d), Sev ", temp_string, event_id);
switch (severity)
{
case SQ_LOG_EMERG: printf("EMERGENCY");
break;
case SQ_LOG_ALERT: printf("ALERT");
break;
case SQ_LOG_CRIT: printf("CRITICAL");
break;
case SQ_LOG_ERR: printf("ERROR");
break;
case SQ_LOG_WARNING: printf("WARNING");
break;
case SQ_LOG_NOTICE: printf("NOTICE");
break;
case SQ_LOG_INFO: printf("INFO");
break;
case SQ_LOG_DEBUG: printf("DEBUG");
break;
default: printf("%d Unknown", severity);
}
if (error_code != -1)
printf(", Error=%d",error_code);
if (rmid != -1)
printf(", rmid=%d",rmid);
if (dtmid != -1)
printf(", dtmid=%d",dtmid);
if (seq_num != -1)
printf(", seqnum=%d",seq_num);
if (msgid != -1)
printf(", msgid=%d",msgid);
if (xa_error != -1)
printf(", XAERR=%d",xa_error);
if (pool_size != -1)
printf(", pool_size=%d",pool_size);
if (pool_elems != -1)
printf(", elements in pool=%d",pool_elems);
if (msg_retries != -1)
printf(", msg retries=%d",msg_retries);
if (pool_high != -1)
printf(", pool_high_ss=%d",pool_high);
if (pool_low != -1)
printf(", pool_low_ss=%d",pool_low);
if (pool_max != -1)
printf(", pool_max_size=%d",pool_max);
if (tx_state != -1)
printf(", Txn State=%d",tx_state);
if (data != -1)
printf(", data=%d",data);
if (data1 != -1)
printf(", data1=%d",data1);
if (data2 != -1)
printf(", data2=" PFLL,data2);
if (string1 != NULL)
printf(", string1=%s",string1);
if (node != -1)
printf(", node=%d",node);
if (msgid2 != -1)
printf(", msgid2=%d",msgid2);
if (offset != -1)
printf(", offset=%d",offset);
if (tm_event_msg != -1)
printf(", tm_event_msg=%d",tm_event_msg);
if (data4 != 0)
printf(", data4=%u",data4);
printf("\n");
return error;
}
void getTMLoggingHeaderInfo(posix_sqlog_severity_t severity, logLevel &ll_severity, char *processName, int processNameLen, int &my_nid, int &my_pid)
{
char my_name[MS_MON_MAX_PROCESS_NAME+1];
int error;
error = msg_mon_get_my_process_name( my_name, sizeof(my_name) );
if (error == 0) {
error = msg_mon_get_process_info( my_name, &my_nid, &my_pid );
if (error != 0) {
my_nid = -1;
my_pid = -1;
}
}
else
strcpy(my_name, "UNKNOWN");
int len = strlen(my_name);
if (len < processNameLen)
len = processNameLen-1;
strncpy(processName, my_name, len);
processName[len] = '\0';
switch (severity) {
case SQ_LOG_EMERG:
ll_severity = LL_FATAL;
break;
case SQ_LOG_ALERT:
ll_severity = LL_WARN;
break;
case SQ_LOG_CRIT:
ll_severity = LL_FATAL;
break;
case SQ_LOG_ERR:
ll_severity = LL_ERROR;
break;
case SQ_LOG_WARNING:
ll_severity = LL_WARN;
break;
case SQ_LOG_NOTICE:
ll_severity = LL_INFO;
break;
case SQ_LOG_INFO:
ll_severity = LL_INFO;
break;
case SQ_LOG_DEBUG:
ll_severity = LL_DEBUG;
break;
default:
ll_severity = LL_INFO;
break;
}
return;
}