PLCnext API Documentation  21.0.0.35466
LogManager.hpp
1 //
3 // Copyright PHOENIX CONTACT Electronics GmbH
4 //
6 #pragma once
7 #include "Arp/System/Core/Arp.h"
8 #include "Arp/System/Core/event.hxx"
9 #include "Arp/System/Core/TypeName.hxx"
10 #include "Arp/System/Core/AppDomainSingleton.hxx"
11 #include "Arp/System/Commons/Threading/Mutex.hpp"
12 #include "Arp/System/Commons/Diagnostics/Logging/LogLevel.hpp"
13 #include "Arp/System/Commons/Diagnostics/Logging/LogInfo.hpp"
14 #include "Arp/System/Commons/Diagnostics/Logging/Internal/LogAdapter.hpp"
15 #include <new>
16 #include <atomic>
17 
18 // forwards
19 namespace log4cplus
20 {
21 class Initializer;
22 class Hierarchy;
23 class Logger;
24 }
25 
26 namespace Arp { namespace System { namespace Commons { namespace Diagnostics { namespace Logging
27 {
28 
29 // forwards
30 namespace Internal
31 {
32 class LogEventAppender;
33 }
34 class LoggerBase;
35 
36 // singleton log manager class
37 class LogManager : public AppDomainSingleton<LogManager>
38 {
39  friend class LoggerBase;
40  friend class Internal::LogAdapter;
41  friend class AppDomainSingleton<LogManager>;
42 
43 private: // typedefs/usings
46  using LogAdapter = Internal::LogAdapter;
47  using LogEventAppenderPtr = std::shared_ptr<Internal::LogEventAppender>;
49  using AppendDelegate = delegate<void(const LogInfo&)>;
50 
51 private:
52  LogManager(void);
53  LogManager(const LogManager&) = delete;
54  ~LogManager(void);
55  LogManager& operator=(const LogManager&) = delete;
56 
57 public: // singleton operations
58  static void AssignAppDomain(AppDomain& otherDomain);
59  static void Create(const char* configFileName);
60  static void Create(bool enableConsoleLogging, const char* logFileName = nullptr);
61  static void Create(LogLevel logLevel, bool enableConsoleLogging, const char* logFileName = nullptr);
62  static void Create(const char* layoutPattern, bool enableConsoleLogging, const char* logFileName = nullptr);
63  static void Create(LogLevel logLevel, const char* layoutPattern, bool enableConsoleLogging, const char* logFileName = nullptr);
64  static void Dispose(void);
65 
66 public: // setter/getter
67  void SetRootLevel(LogLevel value);
68  LogLevel GetRootLevel(void);
69  Mutex& GetSyncRoot(void); // TODO:SDK: make private
70 
71 public: // operations
72  LogAdapter CreateLogAdapter(const char* loggerName); // TODO:SDK: make private
73  void AddAppendDelegate(AppendDelegate appendDelegate);
74  void RemoveAppendDelegate(AppendDelegate appendDelegate);
75 
76 private: // methods
77  void Initialize(LogLevel rootLevel, log4cplus::Logger& rootLogger);
78  log4cplus::Logger GetLoggerInstance(const char* loggerName);
79  bool HasAppendEvent(void);
80  void FireAppendEvent(const LogInfo& logInfo);
81 
82 private: // fields
83  Mutex syncRoot;
84  LogAdapter::Ptr rootLogAdapterPtr;
85  log4cplus::Hierarchy* pRootHierarchy;
86  log4cplus::Initializer* pInitializer;
87 
88 private: // static event fields: TODO:SDK: make non static appendEventEnabled
89  static std::atomic<size_t> appendEventCounter;
90  static AppendEvent appendEvent;
91 
92 private: // const static data
93  static const char* const defaultLayoutPattern;
94 };
95 
97 // inline methods of class LogManager
98 
99 inline void LogManager::SetRootLevel(LogLevel value)
100 {
101  this->rootLogAdapterPtr->SetLogLevel(value);
102 }
103 
104 inline LogLevel LogManager::GetRootLevel()
105 {
106  // OR: do not call LogAdapter::GetLogLevel() - this would cause a cyclic method invocation
107  return this->rootLogAdapterPtr->logLevel;
108 }
109 
110 inline LogManager::Mutex& LogManager::GetSyncRoot()
111 {
112  return this->syncRoot;
113 }
114 
115 inline bool LogManager::HasAppendEvent()
116 {
117  return appendEventCounter > 0;
118 }
119 
120 inline void LogManager::Create(bool enableConsoleLogging, const char* logFileName)
121 {
122  Create(LogLevel::Default, nullptr, enableConsoleLogging, logFileName);
123 }
124 
125 inline void LogManager::Create(LogLevel logLevel, bool enableConsoleLogging, const char* logFileName)
126 {
127  Create(logLevel, nullptr, enableConsoleLogging, logFileName);
128 }
129 
130 inline void LogManager::Create(const char* layoutPattern, bool enableConsoleLogging, const char* logFileName)
131 {
132  Create(LogLevel::Default, layoutPattern, enableConsoleLogging, logFileName);
133 }
134 
135 }}}}} // end of namesapce Arp::System::Commons::Diagnostics::Logging
Mutual exclusion object to prevent data from concurrent modifications.
Definition: Mutex.hpp:25
This class represents a single application domain for each process and is implemented as singleton...
Definition: AppDomain.hpp:122
Use this class to register and invoke several delegates (function pointer in OOP design).
Definition: event.hxx:32
Root namespace for the PLCnext API
This class implements the singleton pattern for singletons with process wide scope.
Definition: AppDomainSingleton.hxx:24
System components used by the System, Device, Plc or Io domains.
Definition: LogAdapter.hpp:14