109typedef struct LoggerThreadStoreNode_ {
114typedef TAILQ_HEAD(LoggerThreadStore_, LoggerThreadStoreNode_) LoggerThreadStore;
124typedef struct OutputFileRolloverFlag_ {
132TAILQ_HEAD(, OutputFileRolloverFlag_) output_file_rotation_flags =
145typedef struct OnLoggingReadyCallbackNode_ {
154static TAILQ_HEAD(, OnLoggingReadyCallbackNode_)
176 module->conf_name = conf_name;
177 module->InitFunc = InitFunc;
185 FatalError(
"Fatal error encountered in OutputRegisterModule. Exiting...");
209 module->logger_id = id;
211 module->conf_name = conf_name;
212 module->InitFunc = InitFunc;
213 module->PacketLogFunc = output_module_functions->LogFunc;
214 module->PacketFlushFunc = output_module_functions->FlushFunc;
215 module->PacketConditionFunc = output_module_functions->ConditionFunc;
216 module->ThreadInit = output_module_functions->ThreadInitFunc;
217 module->ThreadDeinit = output_module_functions->ThreadDeinitFunc;
223 FatalError(
"Fatal error encountered. Exiting...");
248 module->logger_id = id;
250 module->conf_name = conf_name;
251 module->parent_name = parent_name;
252 module->InitSubFunc = InitFunc;
253 module->PacketLogFunc = output_logger_functions->LogFunc;
254 module->PacketFlushFunc = output_logger_functions->FlushFunc;
255 module->PacketConditionFunc = output_logger_functions->ConditionFunc;
256 module->ThreadInit = output_logger_functions->ThreadInitFunc;
257 module->ThreadDeinit = output_logger_functions->ThreadDeinitFunc;
263 FatalError(
"Fatal error encountered. Exiting...");
274static void OutputRegisterTxModuleWrapper(
LoggerId id,
const char *
name,
const char *conf_name,
288 module->logger_id = id;
290 module->conf_name = conf_name;
291 module->InitFunc = InitFunc;
292 module->TxLogFunc = TxLogFunc;
293 module->TxLogCondition = TxLogCondition;
294 module->alproto = alproto;
295 module->tc_log_progress = tc_log_progress;
296 module->ts_log_progress = ts_log_progress;
297 module->ThreadInit = ThreadInit;
298 module->ThreadDeinit = ThreadDeinit;
304 FatalError(
"Fatal error encountered. Exiting...");
307static void OutputRegisterTxSubModuleWrapper(
LoggerId id,
const char *parent_name,
const char *
name,
321 module->logger_id = id;
323 module->conf_name = conf_name;
324 module->parent_name = parent_name;
325 module->InitSubFunc = InitFunc;
326 module->TxLogFunc = TxLogFunc;
327 module->TxLogCondition = TxLogCondition;
328 module->alproto = alproto;
329 module->tc_log_progress = tc_log_progress;
330 module->ts_log_progress = ts_log_progress;
331 module->ThreadInit = ThreadInit;
332 module->ThreadDeinit = ThreadDeinit;
335 SCLogDebug(
"Tx logger for alproto %d \"%s\" registered.", alproto,
name);
338 FatalError(
"Fatal error encountered. Exiting...");
353 OutputRegisterTxModuleWrapper(
id,
name, conf_name, InitFunc, alproto, TxLogFunc, -1, -1,
354 TxLogCondition, ThreadInit, ThreadDeinit);
361 OutputRegisterTxSubModuleWrapper(
id, parent_name,
name, conf_name, InitFunc, alproto, TxLogFunc,
362 -1, -1, TxLogCondition, ThreadInit, ThreadDeinit);
377 OutputRegisterTxModuleWrapper(
id,
name, conf_name, InitFunc, alproto, TxLogFunc,
378 tc_log_progress, ts_log_progress, NULL, ThreadInit, ThreadDeinit);
383 int tc_log_progress,
int ts_log_progress,
ThreadInitFunc ThreadInit,
386 OutputRegisterTxSubModuleWrapper(
id, parent_name,
name, conf_name, InitFunc, alproto, TxLogFunc,
387 tc_log_progress, ts_log_progress, NULL, ThreadInit, ThreadDeinit);
402 OutputRegisterTxModuleWrapper(
id,
name, conf_name, InitFunc, alproto, TxLogFunc, -1, -1, NULL,
403 ThreadInit, ThreadDeinit);
410 OutputRegisterTxSubModuleWrapper(
id, parent_name,
name, conf_name, InitFunc, alproto, TxLogFunc,
411 -1, -1, NULL, ThreadInit, ThreadDeinit);
426 if (
unlikely(FileLogFunc == NULL)) {
435 module->logger_id = id;
437 module->conf_name = conf_name;
438 module->parent_name = parent_name;
439 module->InitSubFunc = InitFunc;
440 module->FileLogFunc = FileLogFunc;
441 module->ThreadInit = ThreadInit;
442 module->ThreadDeinit = ThreadDeinit;
448 FatalError(
"Fatal error encountered. Exiting...");
463 if (
unlikely(FiledataLogFunc == NULL)) {
472 module->logger_id = id;
474 module->conf_name = conf_name;
475 module->InitFunc = InitFunc;
476 module->FiledataLogFunc = FiledataLogFunc;
477 module->ThreadInit = ThreadInit;
478 module->ThreadDeinit = ThreadDeinit;
484 FatalError(
"Fatal error encountered. Exiting...");
499 if (
unlikely(FlowLogFunc == NULL)) {
508 module->logger_id = id;
510 module->conf_name = conf_name;
511 module->parent_name = parent_name;
512 module->InitSubFunc = InitFunc;
513 module->FlowLogFunc = FlowLogFunc;
514 module->ThreadInit = ThreadInit;
515 module->ThreadDeinit = ThreadDeinit;
521 FatalError(
"Fatal error encountered. Exiting...");
537 if (
unlikely(StreamingLogFunc == NULL)) {
546 module->logger_id = id;
548 module->conf_name = conf_name;
549 module->InitFunc = InitFunc;
550 module->StreamingLogFunc = StreamingLogFunc;
551 module->stream_type = stream_type;
552 module->ThreadInit = ThreadInit;
553 module->ThreadDeinit = ThreadDeinit;
559 FatalError(
"Fatal error encountered. Exiting...");
574 if (
unlikely(StatsLogFunc == NULL)) {
583 module->logger_id = id;
585 module->conf_name = conf_name;
586 module->InitFunc = InitFunc;
587 module->StatsLogFunc = StatsLogFunc;
588 module->ThreadInit = ThreadInit;
589 module->ThreadDeinit = ThreadDeinit;
595 FatalError(
"Fatal error encountered. Exiting...");
610 if (
unlikely(StatsLogFunc == NULL)) {
619 module->logger_id = id;
621 module->conf_name = conf_name;
622 module->parent_name = parent_name;
623 module->InitSubFunc = InitFunc;
624 module->StatsLogFunc = StatsLogFunc;
625 module->ThreadInit = ThreadInit;
626 module->ThreadDeinit = ThreadDeinit;
632 FatalError(
"Fatal error encountered. Exiting...");
646 if (strcmp(module->conf_name, conf_name) == 0)
666 SCFree(simple_json_applayer_loggers);
667 simple_json_applayer_loggers = NULL;
670static int drop_loggers = 0;
696 SCLogError(
"Failed to allocate memory to register file rotation flag");
699 flag_entry->flag = flag;
719 for (entry =
TAILQ_FIRST(&output_file_rotation_flags); entry != NULL;
722 if (entry->flag == flag) {
723 TAILQ_REMOVE(&output_file_rotation_flags, entry, entries);
761 SCLogError(
"Failed to allocate memory for callback node");
765 node->callback = callback;
782 if (node->callback) {
783 (*node->callback)(node->arg);
790 LoggerThreadStore *thread_store = (LoggerThreadStore *)thread_data;
793 while (logger && thread_store_node) {
795 logger->
FlushFunc(
tv, p, thread_store_node->thread_data);
798 thread_store_node =
TAILQ_NEXT(thread_store_node, entries);
805 LoggerThreadStore *thread_store = (LoggerThreadStore *)thread_data;
808 while (logger && thread_store_node) {
809 logger->
LogFunc(
tv, p, thread_store_node->thread_data);
812 thread_store_node =
TAILQ_NEXT(thread_store_node, entries);
819 LoggerThreadStore *thread_store =
SCCalloc(1,
sizeof(*thread_store));
820 if (thread_store == NULL) {
824 *data = (
void *)thread_store;
829 void *child_thread_data = NULL;
833 SCCalloc(1,
sizeof(*thread_store_node));
834 if (thread_store_node == NULL) {
840 thread_store_node->thread_data = child_thread_data;
850 if (thread_data == NULL)
853 LoggerThreadStore *thread_store = (LoggerThreadStore *)thread_data;
856 while (logger && thread_store_node) {
861 thread_store_node =
TAILQ_NEXT(thread_store_node, entries);
865 while ((thread_store_node =
TAILQ_FIRST(thread_store)) != NULL) {
867 SCFree(thread_store_node);
880 if (logger == NULL) {
890static void OutputRegisterActiveLogger(
RootLogger *reg)
893 if (logger == NULL) {
909 OutputRegisterActiveLogger(logger);
919 while ((logger =
TAILQ_FIRST(&active_loggers)) != NULL) {
934 return &simple_json_applayer_loggers[alproto];
939static void RegisterSimpleJsonApplayerLogger(
942 simple_json_applayer_loggers[alproto].
LogTx = LogTx;
944 simple_json_applayer_loggers[alproto].
name =
name;
956 if (
unlikely(simple_json_applayer_loggers == NULL)) {
957 FatalError(
"Failed to allocate simple_json_applayer_loggers");
962 RegisterSimpleJsonApplayerLogger(
976 RegisterSimpleJsonApplayerLogger(
978 RegisterSimpleJsonApplayerLogger(
981 RegisterSimpleJsonApplayerLogger(
988 RegisterSimpleJsonApplayerLogger(
990 RegisterSimpleJsonApplayerLogger(
992 RegisterSimpleJsonApplayerLogger(
996 RegisterSimpleJsonApplayerLogger(
1013 void *state,
void *tx, uint64_t tx_id,
int dir)
1026 if (!al->
LogTx(tx, js)) {
1041 void *state,
void *tx, uint64_t tx_id)
1043 return JsonGenericLogger(
tv, thread_data, p, f, state, tx, tx_id,
LOG_DIR_PACKET);
1047 void *state,
void *tx, uint64_t tx_id)
1049 return JsonGenericLogger(
tv, thread_data, p, f, state, tx, tx_id,
LOG_DIR_FLOW);
1052#define ARRAY_CAP_STEP 16
1054static size_t preregistered_loggers_nb = 0;
1055static size_t preregistered_loggers_cap = 0;
1063 if (preregistered_loggers_nb == preregistered_loggers_cap) {
1071 preregistered_loggers = tmp;
1073 preregistered_loggers[preregistered_loggers_nb] = reg_data;
1074 preregistered_loggers_nb++;
1078static TxLogger JsonLoggerFromDir(uint8_t dir)
1081 return JsonGenericDirPacketLogger;
1084 return JsonGenericDirFlowLogger;
1136 SCLogDebug(
"modbus json logger registered.");
1240 if (
SCConfGetNode(
"app-layer.protocols.bittorrent-dht") != NULL) {
1249 for (
size_t i = 0; i < preregistered_loggers_nb; i++) {
1252 preregistered_loggers[i].alproto, JsonLoggerFromDir(preregistered_loggers[i].dir),
1255 "%s JSON logger registered.",
AppProtoToString(preregistered_loggers[i].alproto));
1256 RegisterSimpleJsonApplayerLogger(preregistered_loggers[i].alproto,
void AlertDebugLogRegister(void)
void AlertFastLogRegister(void)
void AlertSyslogRegister(void)
Function to register the AlertSyslog module.
bool EveFTPDataAddMetadata(void *vtx, SCJsonBuilder *jb)
struct HtpBodyChunk_ * next
const char * AppProtoToString(AppProto alproto)
Maps the ALPROTO_*, to its string equivalent.
bool SSHTxLogCondition(ThreadVars *tv, const Packet *p, void *state, void *tx, uint64_t tx_id)
SCConfNode * SCConfGetNode(const char *name)
Get a SCConfNode by name.
void LogCustomFormatRegister(void)
void LogHttpLogRegister(void)
void PcapLogRegister(void)
void LogStatsLogRegister(void)
void LogTcpDataLogRegister(void)
void LogTlsLogRegister(void)
void LogTlsStoreRegister(void)
bool(* EveJsonSimpleTxLogFunc)(const void *, void *)
void EveStreamLogRegister(void)
void OutputFileLoggerRegister(void)
int(* SCFileLogger)(ThreadVars *, void *thread_data, const Packet *, const File *, void *tx, const uint64_t tx_id, uint8_t direction)
void OutputFiledataLoggerRegister(void)
int(* SCFiledataLogger)(ThreadVars *, void *thread_data, const Packet *, File *, void *tx, const uint64_t tx_id, const uint8_t *, uint32_t, uint8_t, uint8_t dir)
File-data logger function pointer type.
void OutputFilestoreRegister(void)
int(* FlowLogger)(ThreadVars *, void *thread_data, Flow *f)
Flow logger function pointer type.
void JsonAlertLogRegister(void)
void JsonAnomalyLogRegister(void)
void JsonArpLogRegister(void)
OutputInitResult OutputJsonLogInitSub(SCConfNode *conf, OutputCtx *parent_ctx)
TmEcode JsonLogThreadInit(ThreadVars *t, const void *initdata, void **data)
TmEcode JsonLogThreadDeinit(ThreadVars *t, void *data)
void JsonDCERPCLogRegister(void)
void JsonDHCPLogRegister(void)
bool AlertJsonDnp3(void *vtx, SCJsonBuilder *js)
void JsonDNP3LogRegister(void)
void JsonDnsLogRegister(void)
void JsonDoh2LogRegister(void)
bool AlertJsonDoh2(void *txptr, SCJsonBuilder *js)
bool AlertJsonDns(void *txptr, SCJsonBuilder *js)
void JsonDropLogRegister(void)
void JsonFileLogRegister(void)
void JsonFlowLogRegister(void)
void JsonFrameLogRegister(void)
bool EveFTPLogCommand(void *vtx, SCJsonBuilder *jb)
void JsonHttpLogRegister(void)
void JsonIKELogRegister(void)
void JsonMdnsLogRegister(void)
bool AlertJsonMdns(void *txptr, SCJsonBuilder *js)
bool JsonMQTTAddMetadata(void *vtx, SCJsonBuilder *js)
void JsonMQTTLogRegister(void)
void JsonNetFlowLogRegister(void)
void JsonNFSLogRegister(void)
void JsonPgsqlLogRegister(void)
bool JsonPgsqlAddMetadata(void *vtx, SCJsonBuilder *jb)
void JsonSMBLogRegister(void)
void JsonSmtpLogRegister(void)
void JsonStatsLogRegister(void)
void JsonTlsLogRegister(void)
bool JsonTlsLogJSONExtended(void *vtx, SCJsonBuilder *tjs)
SCJsonBuilder * CreateEveHeader(const Packet *p, enum SCOutputJsonLogDirection dir, const char *event_type, JsonAddrInfo *addr, OutputJsonCtx *eve_ctx)
void OutputJsonRegister(void)
void OutputJsonBuilderBuffer(ThreadVars *tv, const Packet *p, Flow *f, SCJsonBuilder *js, OutputJsonThreadCtx *ctx)
void LuaLogRegister(void)
void OutputPacketLoggerRegister(void)
int(* StatsLogger)(ThreadVars *, void *thread_data, const StatsTable *)
void OutputStreamingLoggerRegister(void)
int(* SCStreamingLogger)(ThreadVars *, void *thread_data, const Flow *f, const uint8_t *data, uint32_t data_len, uint64_t tx_id, uint8_t flags)
void OutputTxLoggerRegister(void)
bool(* TxLoggerCondition)(ThreadVars *, const Packet *, void *state, void *tx, uint64_t tx_id)
Transaction logger condition function pointer type.
int(* TxLogger)(ThreadVars *, void *thread_data, const Packet *, Flow *f, void *state, void *tx, uint64_t tx_id)
Transaction logger function pointer type.
void OutputRegisterPacketSubModule(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, OutputPacketLoggerFunctions *output_logger_functions)
Register a packet output sub-module.
int OutputDropLoggerEnable(void)
void OutputRegisterStreamingModule(LoggerId id, const char *name, const char *conf_name, OutputInitFunc InitFunc, SCStreamingLogger StreamingLogFunc, enum SCOutputStreamingType stream_type, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a streaming data output module.
void OutputRegisterFileRotationFlag(int *flag)
Register a flag for file rotation notification.
void OutputNotifyFileRotation(void)
Notifies all registered file rotation notification flags.
void OutputSetupActiveLoggers(void)
void OutputRegisterRootLoggers(void)
Register all root loggers.
void OutputUnregisterFileRotationFlag(int *flag)
Unregister a file rotation flag.
void OutputRegisterTxModuleWithCondition(LoggerId id, const char *name, const char *conf_name, OutputInitFunc InitFunc, AppProto alproto, TxLogger TxLogFunc, TxLoggerCondition TxLogCondition, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a tx output module with condition.
EveJsonSimpleAppLayerLogger * SCEveJsonSimpleGetLogger(AppProto alproto)
void OutputRegisterStatsModule(LoggerId id, const char *name, const char *conf_name, OutputInitFunc InitFunc, StatsLogger StatsLogFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a stats data output module.
void OutputRegisterTxModule(LoggerId id, const char *name, const char *conf_name, OutputInitFunc InitFunc, AppProto alproto, TxLogger TxLogFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a tx output module.
void OutputRegisterTxSubModuleWithProgress(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, AppProto alproto, TxLogger TxLogFunc, int tc_log_progress, int ts_log_progress, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
void OutputRegisterRootLogger(ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit, OutputLogFunc LogFunc, OutputGetActiveCountFunc ActiveCntFunc)
void OutputRegisterTxSubModuleWithCondition(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, AppProto alproto, TxLogger TxLogFunc, TxLoggerCondition TxLogCondition, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
struct RootLogger_ RootLogger
void OutputRegisterTxSubModule(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, AppProto alproto, TxLogger TxLogFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
void OutputRegisterLoggers(void)
Register all non-root logging modules.
void OutputRegisterFileSubModule(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, SCFileLogger FileLogFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a file output sub-module.
OnLoggingReadyCallbackNode
void OutputDeregisterAll(void)
Deregister all modules. Useful for a memory clean exit.
void OutputRegisterTxModuleWithProgress(LoggerId id, const char *name, const char *conf_name, OutputInitFunc InitFunc, AppProto alproto, TxLogger TxLogFunc, int tc_log_progress, int ts_log_progress, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a tx output module with progress.
void OutputDropLoggerDisable(void)
TmEcode OutputLoggerThreadDeinit(ThreadVars *tv, void *thread_data)
void OutputClearActiveLoggers(void)
void OutputRegisterFiledataModule(LoggerId id, const char *name, const char *conf_name, OutputInitFunc InitFunc, SCFiledataLogger FiledataLogFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a file data output module.
void OutputRegisterPacketModule(LoggerId id, const char *name, const char *conf_name, OutputInitFunc InitFunc, OutputPacketLoggerFunctions *output_module_functions)
Register a packet output module.
TmEcode OutputLoggerThreadInit(ThreadVars *tv, const void *initdata, void **data)
TmEcode OutputLoggerLog(ThreadVars *tv, Packet *p, void *thread_data)
TmEcode OutputLoggerFlush(ThreadVars *tv, Packet *p, void *thread_data)
int SCOutputEvePreRegisterLogger(EveJsonTxLoggerRegistrationData reg_data)
OutputModule * OutputGetModuleByConfName(const char *conf_name)
Get an output module by name.
void TmModuleLoggerRegister(void)
void OutputRegisterStatsSubModule(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, StatsLogger StatsLogFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a stats data output sub-module.
void SCOnLoggingReady(void)
Invokes all registered logging ready callbacks.
void OutputRegisterFlowSubModule(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, FlowLogger FlowLogFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
Register a flow output sub-module.
int SCRegisterOnLoggingReady(SCOnLoggingReadyCallback callback, void *arg)
Register a callback to be called when logging is ready.
OutputModuleList output_modules
TmEcode(* OutputFlushFunc)(ThreadVars *, Packet *, void *)
void OutputRegisterModule(const char *, const char *, OutputInitFunc)
uint32_t(* OutputGetActiveCountFunc)(void)
OutputInitResult(* OutputInitFunc)(SCConfNode *)
OutputInitResult(* OutputInitSubFunc)(SCConfNode *, OutputCtx *)
TmEcode(* OutputLogFunc)(ThreadVars *, Packet *, void *)
void(* SCOnLoggingReadyCallback)(void *arg)
#define TAILQ_FOREACH(var, head, field)
#define TAILQ_FOREACH_SAFE(var, head, field, tvar)
#define TAILQ_HEAD(name, type)
#define TAILQ_INSERT_TAIL(head, elm, field)
#define TAILQ_FIRST(head)
#define TAILQ_REMOVE(head, elm, field)
#define TAILQ_NEXT(elm, field)
#define TAILQ_HEAD_INITIALIZER(head)
#define TAILQ_ENTRY(type)
EveJsonSimpleTxLogFunc LogTx
AppProto alproto
application level protocol
PacketLogCondition ConditionFunc
OutputFlushFunc FlushFunc
OutputGetActiveCountFunc ActiveCntFunc
ThreadInitFunc ThreadInit
ThreadDeinitFunc ThreadDeinit
Per thread variable structure.
#define SCMUTEX_INITIALIZER
#define SCMutexUnlock(mut)
TmEcode(* ThreadDeinitFunc)(ThreadVars *, void *)
TmEcode(* ThreadInitFunc)(ThreadVars *, const void *, void **)
#define SCLogError(...)
Macro used to log ERROR messages.
#define SCRealloc(ptr, sz)