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