1
#pragma once
2

            
3
#include <sys/types.h>
4

            
5
#include "envoy/access_log/access_log.h"
6

            
7
#include "source/extensions/access_loggers/common/access_log_base.h"
8
#include "source/extensions/access_loggers/dynamic_modules/access_log_config.h"
9

            
10
namespace Envoy {
11
namespace Extensions {
12
namespace AccessLoggers {
13
namespace DynamicModules {
14

            
15
/**
16
 * Thread-local logger wrapper for per-thread module instances.
17
 */
18
struct ThreadLocalLogger : public ThreadLocal::ThreadLocalObject {
19
  ThreadLocalLogger(envoy_dynamic_module_type_access_logger_module_ptr logger,
20
                    DynamicModuleAccessLogConfigSharedPtr config, uint32_t worker_index);
21
  ~ThreadLocalLogger() override;
22

            
23
public:
24
  /**
25
   * Helper to get the `this` pointer as a void pointer.
26
   */
27
12
  void* thisAsVoidPtr() { return static_cast<void*>(this); }
28

            
29
public:
30
  envoy_dynamic_module_type_access_logger_module_ptr logger_;
31
  DynamicModuleAccessLogConfigSharedPtr config_;
32
  const Formatter::Context* log_context_ = nullptr;
33
  const StreamInfo::StreamInfo* stream_info_ = nullptr;
34
  uint32_t worker_index_;
35
};
36

            
37
/**
38
 * Access log instance that delegates to a dynamic module.
39
 */
40
class DynamicModuleAccessLog : public Common::ImplBase {
41
public:
42
  DynamicModuleAccessLog(AccessLog::FilterPtr&& filter,
43
                         DynamicModuleAccessLogConfigSharedPtr config,
44
                         ThreadLocal::SlotAllocator& tls);
45

            
46
private:
47
  void emitLog(const Formatter::Context& context,
48
               const StreamInfo::StreamInfo& stream_info) override;
49

            
50
  DynamicModuleAccessLogConfigSharedPtr config_;
51
  ThreadLocal::SlotPtr tls_slot_;
52
};
53

            
54
} // namespace DynamicModules
55
} // namespace AccessLoggers
56
} // namespace Extensions
57
} // namespace Envoy