Files
openGauss-server/src/include/postmaster/syslogger.h
2021-03-06 12:39:28 +08:00

180 lines
4.7 KiB
C

/* -------------------------------------------------------------------------
*
* syslogger.h
* Exports from postmaster/syslogger.c.
*
* Copyright (c) 2004-2012, PostgreSQL Global Development Group
*
* src/include/postmaster/syslogger.h
*
* -------------------------------------------------------------------------
*/
#ifndef _SYSLOGGER_H
#define _SYSLOGGER_H
#include <limits.h> /* for PIPE_BUF */
/*
* Primitive protocol structure for writing to syslogger pipe(s). The idea
* here is to divide long messages into chunks that are not more than
* PIPE_BUF bytes long, which according to POSIX spec must be written into
* the pipe atomically. The pipe reader then uses the protocol headers to
* reassemble the parts of a message into a single string. The reader can
* also cope with non-protocol data coming down the pipe, though we cannot
* guarantee long strings won't get split apart.
*
* We use non-nul bytes in is_last to make the protocol a tiny bit
* more robust against finding a false double nul byte prologue. But
* we still might find it in the len and/or pid bytes unless we're careful.
*/
#ifdef PIPE_BUF
/* Are there any systems with PIPE_BUF > 64K? Unlikely, but ... */
#if PIPE_BUF > 65536
#define LOGPIPE_CHUNK_SIZE 65536
#else
#define LOGPIPE_CHUNK_SIZE ((int)PIPE_BUF)
#endif
#else /* not defined */
/* POSIX says the value of PIPE_BUF must be at least 512, so use that */
#define LOGPIPE_CHUNK_SIZE 512
#endif
#define PROFILE_LOG_TAG "gs_profile"
#define PROFILE_LOG_SUFFIX ".prf"
#define SLOWQUERY_LOG_TAG "sql_monitor"
#define ASP_LOG_TAG "asp_data"
#define PERF_JOB_TAG "pg_perf"
enum LogType {
/* error log */
LOG_TYPE_ELOG = 0,
/* profiling log */
LOG_TYPE_PLOG,
/* slow query monitor log */
LOG_TYPE_PLAN_LOG,
/* active session profile log */
LOG_TYPE_ASP_LOG,
/* a solider flag, LOG_TYPE_MAXVALID should be <= LOG_TYPE_UPLIMIT */
LOG_TYPE_MAXVALID,
/*
* max value of log type.
* it's stored by CHAR datatype. see LogPipeProtoHeader::logtype
*/
LOG_TYPE_UPLIMIT = 127
};
typedef struct LogControlData {
bool inited;
uint16 ver;
/* rotation request */
volatile sig_atomic_t rotation_requested;
/* to flush buffer request */
volatile sig_atomic_t flush_requested;
/* log directory */
char* log_dir;
/* pattern of log file name */
char* filename_pattern;
char* file_suffix;
/* current log file name and its fd */
char* now_file_name;
FILE* now_file_fd;
/* log chunk buffer */
char* log_buf;
int cur_len;
int max_len;
} LogControlData;
/*
* max length of this node name. this is a arbitrary value.
* just keep it the same with struct NameData.
*/
#define LOG_MAX_NODENAME_LEN 64
#define LOG_MAGICNUM 0x2017091810170000
#define PROTO_HEADER_MAGICNUM 0x123456789ABCDEF0
/*
* current log version about profile log
* advance it when log struct is modified each time.
*/
#define PROFILE_LOG_VERSION 1
/* header data in each binary log file */
typedef struct {
/* must be the first */
unsigned long fst_magic;
uint16 version;
uint8 hostname_len;
uint8 nodename_len;
uint16 timezone_len;
/*
* part1: hostname <- hostname_len
* part2: nodename <- nodename_len
* part3: timezone <- timezone_len
*/
/* must be the last */
unsigned long lst_magic;
} LogFileHeader;
typedef struct {
char nuls[2]; /* always \0\0 */
uint16 len; /* size of this chunk (counts data only) */
char logtype; /* which log type, see LogType */
char is_last; /* last chunk of message? 't' or 'f' ('T' or
* 'F' for CSV case) */
/* writer's pid. be placed the last, and make data 8 bytes alligned */
ThreadId pid;
uint64 magic; /* magic number to check the proto header */
char data[FLEXIBLE_ARRAY_MEMBER]; /* data payload starts here */
} LogPipeProtoHeader;
typedef union {
LogPipeProtoHeader proto;
char filler[LOGPIPE_CHUNK_SIZE];
} LogPipeProtoChunk;
#define LOGPIPE_HEADER_SIZE offsetof(LogPipeProtoHeader, data)
#define LOGPIPE_MAX_PAYLOAD ((int)(LOGPIPE_CHUNK_SIZE - LOGPIPE_HEADER_SIZE))
extern THR_LOCAL bool am_syslogger;
#ifndef WIN32
#else
extern THR_LOCAL HANDLE syslogPipe[2];
#endif
extern ThreadId SysLogger_Start(void);
extern void SysLoggerClose(void);
extern void write_syslogger_file(char* buffer, int count, int dest);
#ifdef EXEC_BACKEND
extern void SysLoggerMain(int fd);
#endif
extern void LogCtlLastFlushBeforePMExit(void);
extern void set_flag_to_flush_buffer(void);
extern void* SQMOpenLogFile(bool *doOpen);
extern void SQMCloseLogFile();
extern void* ASPOpenLogFile(bool *doOpen);
extern void ASPCloseLogFile();
extern void init_instr_log_directory(bool include_nodename, const char* logid);
#endif /* _SYSLOGGER_H */