Commit 2352c68dd004f3d7fe07db68d7cddfc2c0bbd0cd

Authored by Schwirg László
1 parent 2e68c3e5

- Hangfire beillesztése folyamatban

Vrh.Web.Reporting/Global.asax.cs
1 1 using System;
2 2 using System.Collections.Generic;
  3 +using System.Diagnostics;
  4 +using System.IO;
3 5 using System.Linq;
  6 +using System.Net;
  7 +using System.Threading;
4 8 using System.Web;
5 9 using System.Web.Hosting;
6 10 using System.Web.Mvc;
7 11 using System.Web.Optimization;
8 12 using System.Web.Routing;
  13 +using System.Xml.Linq;
9 14 using Hangfire;
10   -using Vrh.Web.iScheduler;
  15 +using Microsoft.Web.Administration;
  16 +using Vrh.iScheduler;
  17 +using Vrh.Logger;
11 18  
12 19 namespace Vrh.Web.Reporting
13 20 {
14 21 public class MvcApplication : System.Web.HttpApplication
15 22 {
16   - const string HANGFIRESQLDBCONNECTIONSTRINGNAME = "MAINDBLOG4PRO";
17 23 protected void Application_Start()
18 24 {
  25 + (new DCLogEntry(LogLevel.Information, "Vrh.Web.Reporting.MvcApplication.Application_Start")).Write();
19 26 AreaRegistration.RegisterAllAreas();
20 27 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
21 28 RouteConfig.RegisterRoutes(RouteTable.Routes);
22 29 BundleConfig.RegisterBundles(BundleTable.Bundles);
23 30  
24   - HangfireBootstrapper.Instance.SqlDBconnectionstring= Vrh.XmlProcessing.ConnectionStringStore.GetSQL(HANGFIRESQLDBCONNECTIONSTRINGNAME);
25   - HangfireBootstrapper.Instance.Start();
26   - new iSchedulerHangfire(HangfireBootstrapper.Instance._backgroundJobServer);
  31 + //////////////////////////////////////////////////////////////////////////////////////
  32 + ///Enable webApp pool autostart, preload and alwaysrun
  33 + //////////////////////////////////////////////////////////////////////////////////////
  34 + /// For web applications running on servers under your control, either physical or virtual, you can use the auto-start feature of IIS ≥ 7.5 shipped with
  35 + /// Windows Server ≥ 2008 R2. Full setup requires the following steps to be done. Enable automatic start and AlwaysRunning mode for Application pool
  36 + /// and configure Auto - start feature as written below.
  37 + /// Edit the following file: C:\Windows\System32\inetsrv\config\applicationHost.config.
  38 + /// All edits should be made below the <configuration><system.applicationHost> section.
  39 + /// In the <applicationPools> section find the <add name="YourApplicationPoolName"> tag of the application pool to be autostarted.
  40 + /// Add autoStart="true" and startMode="AlwaysRunning" attributes to this <add> tag.
  41 + /// In the <sites><site name="YourWebsiteName"> section find the <application path="/YourWebApplicationName" applicationPool="YourApplicationPoolName"> tag of the web application
  42 + /// running on the application pool with name "YourApplicationPoolName".
  43 + /// Add serviceAutoStartEnabled="true" and serviceAutoStartProvider="AnyNameForYourAutoStartProvider" attributes to this <application> tag.
  44 + /// Here YourWebsiteName is the name of the website where the web application, using the application pool belongs to.
  45 + /// In the <serviceAutoStartProviders> section create the following element:
  46 + /// <add name="AnyNameForYourAutoStartProvider" type="FullTypeNameOfTheAutostartProviderClass, NameOfTheAssemblyContainingTheAutostartProviderClass" />
  47 + /// Here AnyNameForYourAutoStartProvider can be any name, that is suitable for the xml standard.
  48 + /// Here FullTypeNameOfTheAutostartProviderClass is the full type name (with namespace and class name) of the class that matches the IProcessHostPreloadClient interface;
  49 + /// this class should not be within the root class of the mvc application, but for example another class on the same level! For what is in this code the tag is the following:
  50 + /// <add name="ApplicationPreload" type="Vrh.Web.Reporting.ApplicationPreload, Vrh.Web.Reporting" />
  51 + /// Here NameOfTheAssemblyContainingTheAutostartProviderClass is the name of (for example the dll), but without the extension.
  52 + //////////////////////////////////////////////////////////////////////////////////////
  53 +
  54 + (new ApplicationPreload())._Preload();
27 55  
28 56 //Vrh.Web.Menu inicializáló beállításai
29 57 Vrh.Web.Menu.Global.CustomerLogo = "~/Content/Images/Menu_LearLogo.jpg";
30 58 // ! ha azt szeretnénk, hogy a menükezelő kezelje a hitelesítést is,
31 59 // ! akkor ezt itt igaz értékre kell állítani
32 60 Vrh.Web.Menu.Global.IsUseAuthentication = true;
33   -}
34   -
35   - public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
36   - {
37   - public void Preload(string[] parameters)
38   - {
39   - HangfireBootstrapper.Instance.SqlDBconnectionstring= Vrh.XmlProcessing.ConnectionStringStore.GetSQL(HANGFIRESQLDBCONNECTIONSTRINGNAME);
40   - HangfireBootstrapper.Instance.Start();
41   - }
42 61 }
  62 +
  63 +
43 64 protected void Application_End(object sender, EventArgs e)
44 65 {
  66 + (new DCLogEntry(LogLevel.Information, "Vrh.Web.Reporting.MvcApplication.Application_End")).Write();
45 67 HangfireBootstrapper.Instance.Stop();
46 68 }
47 69 /// <summary>
... ... @@ -54,54 +76,200 @@ namespace Vrh.Web.Reporting
54 76 {
55 77 //int i = 1;
56 78 }
57   - public class HangfireBootstrapper : IRegisteredObject
  79 + }
  80 + public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
  81 + {
  82 + public void Preload(string[] parameters)
58 83 {
59   - public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();
60   - public BackgroundJobServer _backgroundJobServer { get; set; }
61   - public string SqlDBconnectionstring { get; set; } = null;
62   - private readonly object _lockObject = new object();
63   - private bool _started;
  84 + (new DCLogEntry(LogLevel.Information, "Vrh.Web.Reporting.ApplicationPreload")).Write();
  85 + _Preload();
  86 + }
  87 + public void _Preload()
  88 + {
  89 + SetupAutoStart(typeof(ApplicationPreload));
  90 + HangfireBootstrapper.Instance.SqlDBconnectionstring = Vrh.XmlProcessing.ConnectionStringStore.GetSQL(HANGFIRESQLDBCONNECTIONSTRINGNAME);
  91 + HangfireBootstrapper.Instance.Start();
  92 + Vrh.iScheduler.Monitor.InitHangfire(HangfireBootstrapper.Instance._backgroundJobServer);
  93 + }
64 94  
  95 + public const string HANGFIRESQLDBCONNECTIONSTRINGNAME = "MAINDBLOG4PRO";
  96 + public const string CONFIGFILEDIRECTORY = @"inetsrv\config";
  97 + public const string CONFIGFILENAME = @"applicationHost.config";
  98 + //public const string FILEPATH = @"C:\temp\applicationHost.config";
  99 + public const string POOLNAME = "Log4ProIS_REPORTING";
  100 + public const string WEBAPPNAME = "/Log4ProIS-REPORTING";
  101 + public const string WEBSITENAME = "Default Web Site";
  102 + public const string AUTOSTARTPROVIDERNAME = "ApplicationPreload";
  103 + public const string AUTOSTARTPROVIDERTYPENAME = "Vrh.Web.Reporting.ApplicationPreload";
  104 + public const string AUTOSTARTPROVIDERASSEMBLYNAME = "Vrh.Web.Reporting";
65 105  
66   - private HangfireBootstrapper()
67   - {
68   - }
  106 + public static bool SetupAutoStart(Type serviceAutoStartProviderType)
  107 + {
  108 + const string SYSTEMAPPLICATIONHOST_ELEMENT = "system.applicationHost";
  109 + const string APPLICATIONPOOLS_ELEMENT = "applicationPools";
  110 + const string SITES_ELEMENT = "sites";
  111 + const string SERVICEAUTOSTARTPROVIDERS_ELEMENT = "serviceAutoStartProviders";
  112 + const string SITE_ELEMENT = "site";
  113 + const string APPLICATION_ELEMENT = "application";
  114 + const string ADD_ELEMENT = "add";
  115 + const string NAME_ATTRIBUTE = "name";
  116 + const string TYPE_ATTRIBUTE = "type";
  117 + const string SERVICEAUTOSTARTENABLED_ATTRIBUTE = "serviceAutoStartEnabled";
  118 + const string SERVICEAUTOSTARTPROVIDER_ATTRIBUTE = "serviceAutoStartProvider";
  119 + const string APPLICATIONPOOL_ATTRIBUTE = "applicationPool";
  120 + const string PATH_ATTRIBUTE = "path";
  121 + const string AUTOSTART_ATTRIBUTE = "autoStart";
  122 + const string STARTMODE_ATTRIBUTE = "startMode";
69 123  
70   - public void Start()
  124 + string applicationpoolname = GetCurrentApplicationPoolName();
  125 + string websitename = System.Web.Hosting.HostingEnvironment.SiteName;
  126 + string webapplicationname = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath;
  127 + string autostartprovidername = (websitename + "____" + applicationpoolname + "____" + webapplicationname).Replace(" ", "_").Replace("-", "_").Replace("/", "_");
  128 + string serviceAutoStartProviderTypeFullName = serviceAutoStartProviderType.FullName;
  129 + string serviceAutoStartProviderAssassemblyName = serviceAutoStartProviderType.Assembly.GetName().Name;
  130 + var le = new DCLogEntry(LogLevel.Information, "Vrh.Web.Reporting.MvcApplication.SetupAutoStart");
  131 + try
71 132 {
72   - lock (_lockObject)
73   - {
74   - if (_started) return;
75   - _started = true;
  133 + string configfilepath = Path.Combine(NativeSystemPath, CONFIGFILEDIRECTORY, CONFIGFILENAME);
  134 + le.AddDataField("configfilepath", configfilepath);
  135 + le.AddDataField("applicationpoolname", applicationpoolname);
  136 + le.AddDataField("websitename", websitename);
  137 + le.AddDataField("webapplicationname", webapplicationname);
  138 + le.AddDataField("serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName);
  139 + le.AddDataField("serviceAutoStartProviderAssassemblyName", serviceAutoStartProviderAssassemblyName);
  140 +
  141 +
  142 + var filecontent = System.IO.File.ReadAllText(configfilepath);
  143 + XElement configxml = XElement.Parse(filecontent, LoadOptions.PreserveWhitespace); //XElement.Load(configfilepath);
  144 +
  145 + XElement myconfigrootxml = configxml.Element(XName.Get(SYSTEMAPPLICATIONHOST_ELEMENT));
  146 + XElement myapplicationpooladdelement = myconfigrootxml?.Element(XName.Get(APPLICATIONPOOLS_ELEMENT))?
  147 + .Elements(XName.Get(ADD_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == applicationpoolname);
  148 + XElement mysiteapplicationelement = myconfigrootxml?.Element(XName.Get(SITES_ELEMENT))?
  149 + .Elements(XName.Get(SITE_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == websitename)
  150 + .Elements(XName.Get(APPLICATION_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(PATH_ATTRIBUTE)).Value == webapplicationname && e.Attribute(XName.Get(APPLICATIONPOOL_ATTRIBUTE)).Value == applicationpoolname);
  151 + if (myapplicationpooladdelement == null) return false;
  152 + if (mysiteapplicationelement == null) return false;
76 153  
77   - HostingEnvironment.RegisterObject(this);
  154 + bool configchanged = false;
  155 + configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, "true") || configchanged;
  156 + configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, "AlwaysRunning") || configchanged;
  157 + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, "true") || configchanged;
  158 + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement, autostartprovidername) || configchanged;
78 159  
79   - GlobalConfiguration.Configuration
80   - .UseSqlServerStorage(SqlDBconnectionstring)
81   - // Specify other options here
82   - ;
  160 + XElement myautostartproviderselement = null;
  161 + XElement myautostartprovideraddelement = null;
  162 + configchanged = SetOrAddElement(SERVICEAUTOSTARTPROVIDERS_ELEMENT, myconfigrootxml, "", out myautostartproviderselement) || configchanged;
  163 + configchanged = SetOrAddElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername, "", out myautostartprovideraddelement) || configchanged;
  164 + configchanged = SetOrAddAttribute(TYPE_ATTRIBUTE, myautostartprovideraddelement, $"{serviceAutoStartProviderTypeFullName},{serviceAutoStartProviderAssassemblyName }") || configchanged;
83 165  
84   - _backgroundJobServer = new BackgroundJobServer();
  166 + if (configchanged)
  167 + {
  168 + //configxml.Save(configfilepath);
  169 + System.IO.File.WriteAllText(configfilepath, configxml.ToString());
85 170 }
  171 + le.AddDataField("configchanged", configchanged);
  172 + //le.AddDataField("myconfigrootxml", myconfigrootxml);
  173 + le.AddSuccessResult("SUCCESS");
  174 + return true;
86 175 }
87   -
88   - public void Stop()
  176 + catch (Exception ex) { le.AddExceptionResult(ex); le.SetLogLevel(LogLevel.Error); return false; }
  177 + finally { le.Write(); }
  178 + }
  179 + private static bool SetOrAddElement(string elementname, XElement elementcontainer, string elementvalue, out XElement myelement)
  180 + {
  181 + bool configchanged = false;
  182 + myelement = elementcontainer?.Element(XName.Get(elementname));
  183 + if (myelement == null) { myelement = new XElement(XName.Get(elementname), ""); elementcontainer.Add(myelement); configchanged = true; }
  184 + if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; }
  185 + return configchanged;
  186 + }
  187 + private static bool SetOrAddElementWithSelectorAttribute(string elementname, XElement elementcontainer, string selectorattributename, string selectorattributevalue, string elementvalue, out XElement myelement)
  188 + {
  189 + bool configchanged = false;
  190 + myelement = elementcontainer?.Elements(XName.Get(elementname))?.FirstOrDefault(e => e.Attribute(XName.Get(selectorattributename)).Value == selectorattributevalue);
  191 + if (myelement == null)
89 192 {
90   - lock (_lockObject)
  193 + myelement = new XElement(XName.Get(elementname), "");
  194 + elementcontainer.Add(myelement);
  195 + SetOrAddAttribute(selectorattributename, myelement, selectorattributevalue);
  196 + configchanged = true;
  197 + }
  198 + if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; }
  199 + return configchanged;
  200 + }
  201 + private static bool SetOrAddAttribute(string attrname, XElement attrcontainer, string attrvalue)
  202 + {
  203 + bool configchanged = false;
  204 + XAttribute attr = attrcontainer.Attribute(XName.Get(attrname));
  205 + if (attr == null) { attr = new XAttribute(XName.Get(attrname), ""); attrcontainer.Add(attr); configchanged = true; }
  206 + if (attr.Value != attrvalue) { attr.Value = attrvalue; configchanged = true; }
  207 + return configchanged;
  208 + }
  209 + public static string NativeSystemPath
  210 + {
  211 + get
  212 + {
  213 + if (Environment.Is64BitOperatingSystem)
91 214 {
92   - if (_backgroundJobServer != null)
93   - {
94   - _backgroundJobServer.Dispose();
95   - }
96   -
97   - HostingEnvironment.UnregisterObject(this);
  215 + return System.IO.Path.Combine(
  216 + Environment.GetFolderPath(Environment.SpecialFolder.Windows),
  217 + "Sysnative");
98 218 }
  219 + return Environment.GetFolderPath(Environment.SpecialFolder.System);
  220 + }
  221 + }
  222 +
  223 + public static string GetCurrentApplicationPoolName()
  224 + {
  225 + string appPoolName = string.Empty;
  226 + foreach (Application app in (new ServerManager()).Sites[System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()].Applications)
  227 + {
  228 + if (app.Path == HttpRuntime.AppDomainAppVirtualPath) { appPoolName = app.ApplicationPoolName; }
  229 + }
  230 + return appPoolName;
  231 + }
  232 + }
  233 + public class HangfireBootstrapper : IRegisteredObject
  234 + {
  235 + public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();
  236 + public BackgroundJobServer _backgroundJobServer { get; set; }
  237 + public string SqlDBconnectionstring { get; set; } = null;
  238 + private readonly object _lockObject = new object();
  239 + private bool _started;
  240 +
  241 +
  242 + private HangfireBootstrapper()
  243 + {
  244 + }
  245 +
  246 + public void Start()
  247 + {
  248 + lock (_lockObject)
  249 + {
  250 + if (_started) return;
  251 + _started = true;
  252 +
  253 + HostingEnvironment.RegisterObject(this);
  254 +
  255 + GlobalConfiguration.Configuration
  256 + .UseSqlServerStorage(SqlDBconnectionstring)
  257 + // Specify other options here
  258 + ;
  259 +
  260 + _backgroundJobServer = new BackgroundJobServer();
99 261 }
  262 + }
100 263  
101   - void IRegisteredObject.Stop(bool immediate)
  264 + public void Stop()
  265 + {
  266 + lock (_lockObject)
102 267 {
103   - Stop();
  268 + if (_backgroundJobServer != null) { _backgroundJobServer.Dispose(); }
  269 + HostingEnvironment.UnregisterObject(this);
104 270 }
105 271 }
  272 +
  273 + void IRegisteredObject.Stop(bool immediate) { Stop(); }
106 274 }
107 275 }
... ...
Vrh.Web.Reporting/LogConfig.xml 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +<?xml version="1.0" encoding="utf-8" ?>
  2 +<Vrh.Logger>
  3 + <!-- Posible LogLevel values: Debug, Verbose, Information, Warning, Error, Fatal, None -->
  4 + <LogLevel>Debug</LogLevel>
  5 + <!-- True: All log entry are redirecting to console too. -->
  6 + <EnableConsoleLogging>True</EnableConsoleLogging>
  7 + <!-- True: All log entry are redirecting to attached debug output window too. -->
  8 + <EnableDebuggerLogging>True</EnableDebuggerLogging>
  9 + <!-- True: All log entry are redirecting to Default (file) logger. (Only DefaultLogger use.) -->
  10 + <EnableFileLogging LogDirectory="Log" LogFile="Vrh.Logger.TxtLog.log">True</EnableFileLogging>
  11 + <!-- Posible used logger Values: DefaultLogger, iLoggerLogger -->
  12 + <UsedLogger>DefaultLogger</UsedLogger>
  13 + <!-- Legger Error loging directory-->
  14 + <LoggerErrorLogDirectory>Log</LoggerErrorLogDirectory>
  15 + <!-- Legger Error logging file. -->
  16 + <LoggerErrorLogFile>Vrh.Logger.Errors.log</LoggerErrorLogFile>
  17 +</Vrh.Logger>
0 18 \ No newline at end of file
... ...
Vrh.Web.Reporting/Vrh.NugetModuls.Documentations/Vrh.Logger/ReadMe.md 0 → 100644
... ... @@ -0,0 +1,607 @@
  1 +# Vrh.Logger
  2 +Ez a leírás a komponens **v2.1.0** kiadásáig bezáróan naprakész.
  3 +Igényelt minimális framework verzió: **4.0**
  4 +Teljes funkcionalitás és hatékonyság kihasználásához szükséges legalacsonyabb framework verzió: **4.5**
  5 +### A komponens arra szolgál, hogy egységes és egyszerű megvalósítása legyen a Logolásnak.
  6 +
  7 +Pluginolható, a létező plugin megoldásaink a Vrh.Logger.PLUGINNAME komponens elnevezésekkel kerülnek implementációra.
  8 +
  9 +## Használata logoláshoz
  10 +A használathoz a **Vrh.Logger névtér** using-olandó.
  11 +### VrhLogger static class:
  12 +Ez a static osztály adja a logoláshoz szükséges szűk eszközkészletet.
  13 +#### 1. Log\<T>():
  14 +Ezt hívjuk meg, ha bármit logolni akarunk a környezetben.
  15 +
  16 +**Definíciója:**
  17 +```csharp
  18 +/// <summary>
  19 +/// Log bejegyzést ad fel (aszinkron!!!) a logoló modul számára
  20 +/// </summary>
  21 +/// <typeparam name="T">Típus</typeparam>
  22 +/// <param name="data">Log adat, meg kell feleljen a generikusan meghatározott típusnak, vagy ennek a típusa határozza meg a generikust, ha nem jelöljük explicit</param>
  23 +/// <param name="dataFields">A log bejegyzés adatai. Mezőnév/Mezőérték párok listájaként</param>
  24 +/// <param name="exception">Egy exception adható át a Lognak</param>
  25 +/// <param name="level">A logolás szintje. Az itt meghatározott szintűnek, vagy az alattinak kell a beállított logolási szintnek lennie, hogy a logolás meg is történjen a tényleges futási környezetben.</param>
  26 +/// <param name="source">Logolás forrása. Mindig egy típust (Type) kell átadni. Instance szintű tagoknál a this.GetType() kifejezést használjuk a paraméter értékadásához!
  27 +/// Static tagoknál a typeof(KonkrétClassNév) kifejezéssel adjuk át a típust.</param>
  28 +/// <param name="caller">4.5 Frameworktől automatikusan kap értéket a CallerMemberName attribútumon át, sose adjunk meg értéket ennek a paraméternek! 4.5 alatti verzióknál a hívás helyén kell gondoskodni a kitöltéséről, ha használni akarjuk a logban ezt az adatot.</param>
  29 +/// <param name="line">4.5 Frameworktől Automatikusan kap értéket a CallerLineNumber attribútumon át, sose adjunk meg kézzel értéket ennek a paraméternek! 4.5 alatti verzióknál a hívás helyén kell gondoskodni a kitöltéséről, ha használni akarjuk a logban ezt az adatot.</param>
  30 +static public void Log<T>(T data, IDictionary<string, string> dataFields, Exception exception, LogLevel level, Type source, [CallerMemberName]string caller = "", [CallerLineNumber]int line = 0)
  31 +```
  32 +Hogy a paraméterekkel a logolás során mi történik a használt logger pluginban, az erősen függ a használt plugin implementációjától.
  33 +Az erre vonatkozó részleteket az adott Vrh.Logger Plugin dokumentációja írja le.
  34 +Alább a A Logger komponens fejlesztő támogatására szolgáló DefaultLogger implementációban megvalósuló viselkedést adjuk meg.
  35 +(Fontos megjegyzés a DefultLogger pluginnal kapcsolatban, hogy az tényleges logolásra nem alkalmas, csak a consolra és a csatlakoztatott debugger outputjára képes elküldeni a bedobott log bejegyzéseket.)
  36 +* A generikusba bármilyen típust bedobhatunk (a konkrét példányt a **data** paraméterben lehet átadni).
  37 +A defult logger JSON-ba serializálja a típust, de null is átadható neki.
  38 +* A **dataFileds**-ben kulcs értékpárral megadott adatok adhatóak át. A Defultlogger ezeket kulcs: érték formában jeleníti meg, null érték is átadható neki.
  39 +* Az **exception**-ben egy exceptiont dobhatunk be, amit át kívánunk adni logolásra. A DefultLogger a **LogHelper.GetExceptionInfo** segíytségével jeleníti meg az exception adatait. (Lásd lejebb a Loghelper dokumentációjában.)
  40 +* A **level** megmondja, hogy a log bejegyzést melyik logszint beállítástól kezdődően kell ténylegesen a logba küldeni. Ha az aktuálisan beállított logolási szint legalább ekkora, akkor történik ténylegesen logolás (a logolásra használt ILogger interfészt implementáló plugin Log<T> metódusának hívása.)
  41 +* A **source** segítségével adhatjuk meg a logolás forrásának a típusát. Mindig adjuk meg a hívás helyén ezt az értéket, hogy a Logolás releváns információkat tartalmazhasson! Static tagoknál a typeof(MyStaticClass) a helyes átadási mód, míg instance szintű tagoknál a this.GetType()-ot használjuk! A Logger a pluginnak ezt az információt nem adja tovább, hanem kibontja belőle a típust definiáló Assembly nevét, annak definiált verzióját, és a típus teljes nevét (névtérrel együtt). Ezen információk adódnak át a használt Logger pluginnak. A DefaultLogger plugin ezeket megjeleníti.
  42 +* A **caller** paramétert 4.5-ös Frameworktől kezdődően sose töltsük ki a hívásokban, az automatikusan értéket kap, és a metódus neve kerül bel, ahonnan a Log metódust meghívtuk. 4.5 alatti Fremwork esetén ezt az információt a hívási helyről át kell adni a hívásban, ha kívánunk a Logger pluginnak átadni ilyen információt.
  43 +* A **line** paramétert 4.5-ös Frameworktől kezdődően sose töltsük ki a hívásokban, az automatikusan értéket kap, és a forrássor száma kerül bel, ahonnan a Log metódust meghívtuk. 4.5 alatti Fremwork esetén ezt az információt a hívási helyről át kell adni a hívásban, ha kívánunk a Logger pluginnak átadni ilyen információt.
  44 +
  45 + **Példák a használatára**:
  46 + ```csharp
  47 +catch (Exception ex)
  48 +{
  49 + VrhLogger.Log<string>("error", null, ex, LogLevel.Error, this.GetType()));
  50 +}
  51 + ```
  52 + ```csharp
  53 +VrhLogger.Log<ApplicationTrust>(AppDomain.CurrentDomain.ApplicationTrust, null, null, LogLevel.Verbose, typeof(Program));
  54 + ```
  55 + ```csharp
  56 +Dictionary<string, string> logData = new Dictionary<string, string>()
  57 +{
  58 + { "Vrh.Loger Version ", GetModulVersion(typeof(VrhLogger)) },
  59 + { "Used Logger", _logger != null ? _logger.GetType().FullName : String.Format("Not found!!! {0}", loggerTypeSelector) },
  60 + { "Used Logger version", _logger != null ? GetModulVersion(_logger.GetType()) : "?" },
  61 +};
  62 +logData.Add("Used Plugin == Defult Logger", (_defaultLogger == null).ToString());
  63 +Logger.Log<String>("Vrh.Logger Started", logData, null, _logger != null ? LogLevel.Information : LogLevel.Warning, typeof(VrhLogger));
  64 +```
  65 +#### 1.1 String logolása
  66 +Hogy ne kelljen a bonyolultabb formát beírni, egyszerű szöveges információ logolására használható az alábbi Log metódus is:
  67 +```csharp
  68 +/// <summary>
  69 +/// Egyszerű string adat logolása.
  70 +/// </summary>
  71 +/// <param name="logMessage">Log üzenet</param>
  72 +/// <param name="level">Logszint</param>
  73 +/// <param name="source">Logolás forrása. Mindig egy típust (Type) kell átadni. Instance szintű tagoknál a this.GetType() kifejezést használjuk a paraméter értékadásához!
  74 +/// Static tagoknál a typeof(KonkrétClassNév) kifejezéssel adjuk át a típust.</param>
  75 +/// <param name="caller">4.5 Frameworktől automatikusan kap értéket a CallerMemberName attribútumon át, sose adjunk meg értéket ennek a paraméternek! 4.5 alatti verzióknál a hívás helyén kell gondoskodni a kitöltéséről, ha használni akarjuk a logban ezt az adatot.</param>
  76 +/// <param name="line">4.5 Frameworktől Automatikusan kap értéket a CallerLineNumber attribútumon át, sose adjunk meg kézzel értéket ennek a paraméternek! 4.5 alatti verzióknál a hívás helyén kell gondoskodni a kitöltéséről, ha használni akarjuk a logban ezt az adatot.</param>
  77 +static public void Log(string logMessage, LogLevel level, Type source, [CallerMemberName]string caller = "", [CallerLineNumber]int line = 0)
  78 +```
  79 +**Példák a használatára**:
  80 +```csharp
  81 +VrhLogger.Log("Simple stringlog", LogLevel.Information, typeof(Program));
  82 +```
  83 +##### 1.2. Exception logolása
  84 +Hogy ne kelljen a bonyolultabb formát beírni, kivétel logolására használható az alábbi Log metódus is:
  85 +```csharp
  86 +/// <summary>
  87 +/// Exception egyszerű logolása
  88 +/// </summary>
  89 +/// <param name="exception">Logolandó kivétel</param>
  90 +/// <param name="source">Logolás forrása. Mindig egy típust (Type) kell átadni. Instance szintű tagoknál a this.GetType() kifejezést hazsnáljuk a paraméter értékadásához!
  91 +/// Static tagoknál a typeof(KonkrétClassNév) kifejezéssel adjuk át a típust.</param>
  92 +/// <param name="level">Logszint</param>
  93 +/// <param name="caller">4.5 Frameworktől automatikusan kap értéket a CallerMemberName attribútumon át, sose adjunk meg értéket ennek a paraméternek! 4.5 alatti verzióknál a hívás helyén kell gondoskodni a kitöltéséről, ha használni akarjuk a logban ezt az adatot.</param>
  94 +/// <param name="line">4.5 Frameworktől Automatikusan kap értéket a CallerLineNumber attribútumon át, sose adjunk meg kézzel értéket ennek a paraméternek! 4.5 alatti verzióknál a hívás helyén kell gondoskodni a kitöltéséről, ha használni akarjuk a logban ezt az adatot.</param>
  95 +static public void Log(Exception exception, Type source, LogLevel level = LogLevel.Error, [CallerMemberName]string caller = "", [CallerLineNumber]int line = 0)
  96 +```
  97 +**Példák a használatára**:
  98 +```csharp
  99 +catch (Exception ex)
  100 +{
  101 + VrhLogger.Log(ex, typeof(Program));
  102 +}
  103 +```
  104 +#### 2. LoadLoggerPlugin():
  105 +Arra használható, hogy anélkül cseréljünk az alkalmazás térben használt Logger plugint, hogy az alkalmazást újraindítanánk. A Vrh.Logger működéséhez nem kell explicit meghívni, mert a Logger static típus static konstruktora is meghívja.
  106 +
  107 +**Definiciója:**
  108 +```csharp
  109 +/// <summary>
  110 +/// Betölti a Logger által használt Plugint
  111 +/// A static construktor meghívja, azért public, hogy le lehessen programozni egy olyan alkalmazás logikát, ahol app restart nélkül logger plugint cserélünk.
  112 +/// </summary>
  113 +/// <param name="config">A használt konfigurációt jelöli ki</param>
  114 +static public void LoadLoggerPlugin(string config = null)
  115 +```
  116 +* Egyetlen paramétert lehet neki itt átadni, azt a konfigurációt definiáló stringet, amelyet a plugin a működéséhez használjon. Ha ilyet nem adunk meg, akkor alapértelmezés szerinti konfigurációt használ. (A Vrh.Logger konfigurációjáról, és annak működéséről a dokumentum lejjebb tartalmaz információkat.)
  117 +
  118 +**Használata:**
  119 +```csharp
  120 +VrhLogger.LoadLoggerPlugin(„LogConfig.xml/Vrh.Logger”);
  121 +```
  122 +#### 3. SetNoOfLogEntry():
  123 +Segítségével egy olyan szolgáltatást implementálhatunk a felhasználás helyén, amivel egy adott sorszámra állítjuk a Logsorszámot. Az ilyesmi például hibakereséshez jöhet jól.
  124 +
  125 +**Definiciója:**
  126 +```csharp
  127 +/// <summary>
  128 +/// Segítségével implementálható a felhasználás helyén egy olyan szolgáltatás, amivel explicit módon beállítható, hogy mennyi legyen a Logsorszám
  129 +/// </summary>
  130 +/// <param name="newNoOfLogEntry">Erre az értrékre áll be asorszám, ha nincs mergadva, akkor 0</param>
  131 +public static void SetNoOfLogEntry(ulong newNoOfLogEntry=0)
  132 +```
  133 +* Egyetlen paramétert lehet neki átadni, hogy mennyi legyen a log sorszám aktuális értéke.
  134 +
  135 +**Használata:**
  136 +```csharp
  137 +VrhLogger.SetNoOfLogEntry(9999);
  138 +```
  139 + ### LogHelper static class:
  140 + Az olyan hasznos szolgáltatásokat biztosít egyszerű metódusokon keresztül, amelyek a logolással kapcsolatban hasznosak lehetnek. Jelenlegi szolgáltatásai:
  141 + * **GetAccurateDateTimeValue**: Egy időbélyeg jellegű adatot nagy pontosságot megjelenítő stringként ad vissza, időzóna információval (*yyyy.MM.dd HH:mm:ss.fffffff (zzz)*).
  142 +```csharp
  143 +/// <summary>
  144 +/// Visszaadja a kapott időpont nagy pontosságú string reprezentánsát
  145 +/// </summary>
  146 +/// <param name="value">Időbélyeg jellegű adat</param>
  147 +/// <returns>A kapott időbélyeg stringként</returns>
  148 +public static string GetAccurateDateTimeValue(DateTime value)
  149 +```
  150 +* **GetExceptionInfo**: Az átadott exception adatait emberi olvasásra formázott stringként adja vissza. A megadott indentLevel szerinti tab-ot tesz minden egyes sor elejére.
  151 +```csharp
  152 +/// <summary>
  153 +/// Kiszedi a kapott kivétel adatait egy szöveges leírássá
  154 +/// </summary>
  155 +/// <param name="ex">Exception, amelynek az adatait kigyűjtjük</param>
  156 +/// <param name="indentLevel">Ennyi tab-bal indentálja az információ minden egyes sorát</param>
  157 +/// <returns>A kapott Exception adatai stringként</returns>
  158 +public static string GetExceptionInfo(Exception ex, int indentLevel = 0)
  159 +```
  160 +>A megjelenített adatok:
  161 +>* Az Exception konkrét típusa
  162 +>* A Message field tartalma
  163 +>* A StackTrace tartalma
  164 +>* Ha az InnerException nem null, akkor annak tartalma, ugyanígy megformázva, ezzel az adat tartalommal. Tetszőleges mélységig (amíg az InnerException-ök is tartalmaznak InnerExceptiont). Minden egyes InnerExceptiont egyel beljebb indentálva.
  165 +>* Ha az adott Exceptoion típusa ReflectionTypeLoadException, akkor annak LoaderExceptions gyűjteményén is végigiterál, kigyűjtve azok InnerException-jeit is.
  166 +* **GetExceptionData**: Segítségével Exception.Data (vagy bármilyen más Idictionary) adatokat rendezhetünk emberi olvasásra szánt szöveggé, úgy, hogy minden kulcs-érték párnak új sort nyit, és előre a kulcsot, majd mögé az adatot írja.
  167 +```csharp
  168 +/// <summary>
  169 +/// Visszadja egy IDictionary-ben tárolt kulcs érték párokat (pl.: Exception.Data)
  170 +/// </summary>
  171 +/// <param name="data">Idictionary gyűjtemény</param>
  172 +/// <param name="indentLevel">Ennyivel lesz beindentálva</param>
  173 +/// <returns></returns>
  174 +public static string GetExceptionData(IDictionary data, byte indentLevel)
  175 +```
  176 +* **MakeIndent**: Segítségével egy strin g minden egyes sorát (/n karakterek, mint sorvégek) a megadott szinttel beljebb indentálja, úgy, hogy a sorok elejére /t karaktereket helyez el az indentLevel-nek megfelelő számban.
  177 +```csharp
  178 +/// <summary>
  179 +/// Tabokkal indentálja a kapott szöveg minden egyes sorát a paraméterben kapott számnak megfelelő számban
  180 +/// </summary>
  181 +/// <param name="input">Az indentálandó szöveg</param>
  182 +/// <param name="indentLevel">Az indentálás szintje</param>
  183 +/// <returns>Indentált szöveg</returns>
  184 +public static string MakeIndent(string input, int indentLevel)
  185 +```
  186 +* **GetDictionaryInfo**: Segítségével kulcs értékpárok listájaként átadott adatokat rendezhetünk emberi olvasásra szánt szöveggé, úgy, hogy minden kulcs-érték párnak új sort nyit, és előre a kulcsot, majd mögé az adatot írja.
  187 +```csharp
  188 +/// <summary>
  189 +/// Visszaadja a kapott Dictonary tartalmát emberi olvasásra formázott kulcs értékpárok listájaként
  190 +/// </summary>
  191 +/// <param name="dict">Az adatokat tartalmazó Dictionary</param>
  192 +/// <param name="IndentLevel">Ennyivel lesz beindentálva</param>
  193 +/// <returns>Az adatok formázott stringként</returns>
  194 +public static string GetDictionaryInfo(IDictionary<string, string> dict, byte IndentLevel = 0)
  195 +```
  196 +* **HexControlChars**: A kapott szövegben esetleg megtalálható nem vizuális karaktereket hexa karakterkód értékre alakítja, és ezeket a megadott jelek közt, mint keretben illeszti be az a szövegben eredetileg is elfoglalt helyükre.
  197 +```csharp
  198 +/// <summary>
  199 +/// A megadott sztring kontrolkaraktereit hex formátummá alakítja.
  200 +/// A kontrol karakterek jelölésére használt keret karaktereket (frameStart, frameEnd), szintén hexa karakterkódra alakítja, ha előfordulnak az eredeti szövegben.
  201 +/// </summary>
  202 +/// <param name="str">A vezérlőkaraktereket is tartalmazó szöveg (string)</param>
  203 +/// <param name="indentLevel">A formázott szöveg indentálásának a mértéke</param>
  204 +/// <param name="frameStart">A vezérlőkarakterek hexakódjainak keretezésére ezt használja nyitó karakternek</param>
  205 +/// <param name="frameEnd">A vezérlőkarakterek hexakódjainak keretezésére ezt használja záró karakternek</param>
  206 +/// <returns>A formázott szöveg</returns>
  207 +public static string HexControlChars(string str, byte indentLevel = 0, char frameStart = '{', char frameEnd = '}')
  208 +```
  209 +* **ArrayToHumanReadableString**: Konvertál egy tömböt emberi olvasásra alkalmas stringgé (a tömb értékei a megadott elválasztó karakterrel kerülnek egymástól elválasztásra). A tömbben tárolt típusnak a tárolt adat szöveges vizualizációjára nézve releváns ToString overloaddal kell rendelkeznie, a helyes működéshez.
  210 +```csharp
  211 +/// <summary>
  212 +/// Konvertál egy tömböt emberi fogyasztásra alkalmas stringgé.
  213 +/// A T-nek a tárolt értékre nézve releváns ToString overloaddal kell rendelkeznie, a helyes működéshez.
  214 +/// </summary>
  215 +/// <typeparam name="T">Típus kijelölő</typeparam>
  216 +/// <param name="valueArray">Az értékeket tartalmazó tömb</param>
  217 +/// <param name="indentLevel">A formázott szöveg indentálásának a mértéke</param>
  218 +/// <param name="valueSeparator">Az értékeket egymástól elválasztó karakter a formázott szövegben.</param>
  219 +/// <returns>a formázott szöveg</returns>
  220 +public static string ArrayToHumanReadableString<T>(T[] valueArray, byte indentLevel = 0, char valueSeparator = ';')
  221 +```
  222 +* **BytesToHumanReadableString**: A megadott bájt tömböt ascii encodolással szöveggé alakítja, az esetleges vezérlőkaraktereket hexa értékre cserélve. Tipikus felhasználási területe alacsony szintű kommunikációs pufferek tartalmának logolása.
  223 +```csharp
  224 +/// <summary>
  225 +/// A megadott bájt tömböt Ascii encodolással szöveggé alakítja, az esetleges vezérlőkaraktereket hexa értékre cserélve
  226 +/// Tipikus felhasználási területe alacsony szintű kommunikációs pufferek tartalmának logolása
  227 +/// </summary>
  228 +/// <param name="bytearray">A konvertálandó bytok sorozata</param>
  229 +/// <param name="indentLevel">A formázott szöveg indentálásának a mértéke</param>
  230 +/// <returns>A formázott szöveg</returns>
  231 +public static string BytesToHumanReadableString(byte[] bytearray, byte indentLevel = 0)
  232 +```
  233 +* **BytesToHexBlock**: byte sorozatot HexBlock formázású, emberi olvasásra szánt stringgé alakít.
  234 +```csharp
  235 +/// <summary>
  236 +/// Egy byte sorozatot HexBlock formázású, emberi olvasásra szánt stringgé alakít
  237 +/// </summary>
  238 +/// <param name="data">a bemenő bájtsorozat</param>
  239 +/// <param name="header">megadja, hogy az első sor egy header legyen, amely magyarázza az adattartalmat</param>
  240 +/// <param name="footer">megadja, hogy legyen e egy hexablock véget értét hangsúlyozó lezárás a block végén</param>
  241 +/// <param name="encoding">Beállítható vele, a használt karakter encoding, alapértelmezésben ASCII-t fog használni</param>
  242 +/// <param name="indentLevel">Annyivel indentálja a hexa blockot</param>
  243 +/// <returns>a formázott szöveg</returns>
  244 +public static string BytesToHexBlock(byte[] data, bool header = true, bool footer = false, Encoding encoding = null, byte indentLevel = 0)
  245 +```
  246 +
  247 +* **ExtractPropertyValuesToDataFields**: Visszadja a paraméterben kapott objektum propertijeinek értékeit név-érték párok litsájaként, amit közvetlenül odalehet adni a VrhLogger.Log hívásoknak, hogy kiírja az értékekeket. A property-ken a ToString-et hívja az értékhez, így az érték string reprezentánsa az adott típus ToString megvalósításának megfelelő lesz.
  248 +```csharp
  249 + /// <summary>
  250 + /// Visszadja a paraméterben kapott objektum propertijeinek értékeit név-érték párok litsájaként (a property-n a ToString-et hívja az értékhez)
  251 + /// </summary>
  252 + /// <typeparam name="TClass">Ezzel az objektum típussal dolgozik</typeparam>
  253 + /// <param name="instance">Ezzel a példánnyal</param>
  254 + /// <returns>név-érték párok litáájaként a property-k neve és értéke</returns>
  255 + public static Dictionary<string, string> ExtractPropertyValuesToDataFields<TClass>(TClass instance)
  256 +```
  257 +### Konfiguráció:
  258 +A Vrh.Logger konfigurációjának megadásához kétféle módszert támogat:
  259 +1. Vagy egy az alkalmazástér konfigurációjából vesz fel appSettings kulcsokat.
  260 +2. Vagy egy XML struktúrából olvassa ki a működési paramétereket.
  261 +
  262 +#### Config XML használata:
  263 +Az alábbi XML-t érti meg, mint konfigurációt:
  264 +```xml
  265 +<Vrh.Logger>
  266 + <LogLevel>Warning</LogLevel>
  267 + <EnableConsoleLogging>True</EnableConsoleLogging>
  268 + <EnableDebuggerLogging>True</EnableDebuggerLogging>
  269 + <EnableFileLogging LogDirectory="Log" LogFile="Vrh.Logger.TxtLog.log">True</EnableFileLogging>
  270 + <UsedLogger>DefaultLogger</UsedLogger>
  271 + <UsedLoggerConfig>tetszőleges xml szabványos tartalom</UsedLoggerConfig>
  272 + <LoggerErrorLogDirectory>Log</LoggerErrorLogDirectory>
  273 + <LoggerErrorLogFile>Vrh.Logger.Errors.log</LoggerErrorLogFile>
  274 +</Vrh.Logger>
  275 +```
  276 +Az XML struktúrát az XmlProcessing modulon keresztül kapja meg. Alapértelmezett XmlParser connection string: **file=~LogConfig.xml**, azaz az alapértelmezett xml struktúrát az alkalmazás könyvtárában levő LogConfig.xml file tartalmazza.
  277 +
  278 +Ha ettől el akarunk térni, akkor erre két lehetőségünk van:
  279 +1. Meghívjuk a felhasználás helyén, még az első Log hívás előtt, a Logger class LoadLoggerPlugin() metódusát, paraméternek pedig átadjuk a használandó XmlParser connectionstring-et.
  280 +2. Az alklamazás standard (App.config, Web.config) konfigurációjában definiálunk egy **Vrh.Logger:Config** kulcsú appSettings kulcsot és az értékének a használandó XmlParser connectionstring-et adjuk.
  281 +```xml
  282 +<appSettings>
  283 + <add key="Vrh.Logger:Config" value="file=~LogConfig.xml;element=Vrh.Logger;"/>
  284 +</appSettings>
  285 +```
  286 +A fenti példában az xml struktúrát az alkalmazás könyvtárában levő LogConfig.xml file gyökér eleme alatt található Vrh.Logger xml elem tartalmazza.
  287 +
  288 +A következő legyen az alkalmazás könyvtárában levő AppCfg.xml file szerkezete, amelyben a struktúra belsejében található LoggerConfiguration elem tartalmazza a Vrh.Logger paramétereit.
  289 +Ennek a következő XmlParser connectionstring felel meg: **file=~Config.xml;element=ComponentConfiguration\LoggerConfiguration;**
  290 +```xml
  291 +<ApplicationConfiguration>
  292 + <ComponentConfiguration>
  293 + <LoggerConfiguration>
  294 + <LogLevel>Warning</LogLevel>
  295 + <EnableConsoleLogging>True</EnableConsoleLogging>
  296 + <EnableDebuggerLogging>True</EnableDebuggerLogging>
  297 + <EnableFileLogging LogDirectory="Log" LogFile="Vrh.Logger.TxtLog.log">True</EnableFileLogging>
  298 + <UsedLogger>DefaultLogger</UsedLogger>
  299 + <LoggerErrorLogDirectory>Log</LoggerErrorLogDirectory>
  300 + <LoggerErrorLogFile>Vrh.Logger.Errors.log</LoggerErrorLogFile>
  301 + </LoggerConfiguration>
  302 + </ComponentConfiguration>
  303 +</ApplicationConfiguration>
  304 +```
  305 +Ha a file csak a Vrh.Logger paramétereit tartalmazza, akkor pedig: **file=~Config.xml;**
  306 +```xml
  307 +<LoggerConfiguration>
  308 + <LogLevel>Warning</LogLevel>
  309 + <EnableConsoleLogging>True</EnableConsoleLogging>
  310 + <EnableDebuggerLogging>True</EnableDebuggerLogging>
  311 + <EnableFileLogging LogDirectory="Log" LogFile="Vrh.Logger.TxtLog.log">True</EnableFileLogging>
  312 + <UsedLogger>DefaultLogger</UsedLogger>
  313 + <LoggerErrorLogDirectory>Log</LoggerErrorLogDirectory>
  314 + <LoggerErrorLogFile>Vrh.Logger.Errors.log</LoggerErrorLogFile>
  315 +</LoggerConfiguration>
  316 +```
  317 +* Megfigyelhetőek az alábbiak:
  318 +>* Az element tagban a struktúrán belüli kijelölésben a Root elemet nem definiáljuk, csak az azon belüli útvonalat.
  319 +>* Ha nem adunk meg element tagot, akkor a beállítások tagjeit a root elem alatt keresi.
  320 +>* A root elem elnevezése tetszőleges lehet a configurációt tartalmazó XML-ben.
  321 +
  322 +#### Szabvány app settings kulcsok használata:
  323 +Ekkor a szabványos config állomáynban szabványos appSettings kulcsok megadásával specifikáljuk a fenti négy beállítást:
  324 +
  325 +```xml
  326 + <appSettings>
  327 + <add key="Vrh.Logger:Config" value="@D:\Temp\_t\LogConfig.xml/Vrh.Logger"/>
  328 + <add key="Vrh.Logger:LogLevel" value="debug"/>
  329 + <add key="Vrh.Logger:EnableConsoleLogging" value="True"/>
  330 + <add key="Vrh.Logger:EnableDebuggerLogging" value="True"/>
  331 + <add key="Vrh.Logger:UsedLogger" value="DefaultLogger"/>
  332 + <add key="Vrh.Logger:LoggerErrorLogDirectory" value="@D:\Temp\_t\Log"/>
  333 + <add key="Vrh.Logger:LoggerErrorLogFile" value="Vrh.Logger.Errors.log"/>
  334 + <add key="Vrh.Logger:EnableFileLogging" value="True"/>
  335 + <add key="Vrh.Logger:LogDirectory" value="Log"/>
  336 + <add key="Vrh.Logger:LogFile" value="Vrh.Logger.TxtLog.log"/>
  337 + </appSettings>
  338 +```
  339 +#### Mi mit jelent fentiekből?
  340 +A két beállítási mód közül az AppSettings kulcsok használata kap prioritást. Tehát amit megtalál az AppSettingsek közt, azt a beállítást innen kiolvassa, és nem számít, hogy az XML konfigurációban is van-e rá definíció, és mi az ottani értéke.
  341 +Ez így arra is lehetőséget nyújt, hogy bizonyos beállításokat megadjunk az XML konfiguráció szintjén, míg másokat csak az .config-ban definiáljunk.
  342 +A fenti beállítások konkrét értelmezése:
  343 +* **LogLevel**: A logolás szintje. A Vrh.Logger koncepciója szerint a logszint kezelése nem a Pluginok hatásköre. A beállításban megadott logszint, vagy az annál magasabbak kerülnek logolásra. Az alapértelmezett érték, ha a beállítás nincs jelen az Error. A használható értékek, magassági sorrendben, és a szándékolt jelentéssel:
  344 +>* **Debug**: Azon log bejegyzések, amelyek olyan részletes, a program belső működésével, állapotával kapcsolatos információkat jelentenek, melyek fejlesztői szintű információnak tekinthetőek, értelmezésükhöz a program belső ismerete vagy/és fejlesztői szaktudás szükséges.
  345 +>* **Verbose**: Részletes információk a program működéséről és az e-közbeni állapotokról, de tartalmuk a program belső ismerete nélkül is értelmezhető.
  346 +>* **Information**: Olyan részletességű információk, amelyek részleteiben tájékoztatnak a program működéséről, de csak a funkciók szempontjából, ezért az üzleti/funkcionális ismeretekkel rendelkezőknek is értelmezhető információkat tartalmaznak csak.
  347 +>* **Warning**: Olyan log üzenetek, amelyek a program működésével kapcsolatos figyelmeztetések, fontos információk. Általában valamilyen veszélyre, a működést legalábbis főfunkció szintjén nem befolyásoló hibára, inkonzisztenciára, konfigurációs ellentmondásra ilyesmire figyelmeztetnek. Jellemzően ez az a szint, amivel az üzemeltető rá jöhet, hogy mi az oka annak, hogy nem azt a működést tapasztalja, amit elvárna.
  348 +>* **Error**: A program működése során fellépő nem kritikus mértékű hibák.
  349 +>* **Fatal**: Olyan kritikus hiba, amely a program működésének leállását okozza, vagy egy főfunkció működésének ellátását akadályozza.
  350 +>* **None**: Ez nem egy valódi log szint. Segítségével teljesen kikapcsolható a logolás.
  351 +* **EnableConsoleLogging**: Segítségével azt lehet előírni a Vrh.Logger-nek, hogy a benne található DefultLogger implementációt is üzemeltesse és az alkalmazás Console-ra is jelenítse meg a log bejegyzéseket. Egy logikai érték. Az igaz (True) értéket a true, yes, 1 értékek jelentik (a kis és nagybetűk közt nem tesz különbséget). Minden ezektől eltérő érték hamis értéket (False) jelent. Az alapértelmezett érték a False, ha a beállítás nincs jelen.
  352 +* **EnableDebuggerLogging**: Segítségével azt lehet előítrni a Vrh.Logger-nek, hogy a benne található DefultLogger implementációt is üzemeltesse és az alkalmazáshoz csatlakoztatott Debugger outputján is jelenítse meg a log bejegyzéseket. Egy logikai érték. Az igaz (True) értéket a true, yes, 1 értékek jelentik (a kis és nagybetük közt nem tesz különbséget). Minden ezektől eltérő érték hamis értéket (False) jelenet. Az alapértelmezett érték a False, ha a beállítás nincs jelen.
  353 +* **EnablEFileLogging**: Segítségével azt lehet előítrni a Vrh.Logger-nek, hogy a benne található DefultLogger implementációt is üzemeltesse és egy txt log fájlba írja ki a log bejegyzéseket. Egy logikai érték. Az igaz (True) értéket a true, yes, 1 értékek jelentik (a kis és nagybetük közt nem tesz különbséget). Minden ezektől eltérő érték hamis értéket (False) jelenet. Az alapértelmezett érték a False, ha a beállítás nincs jelen.
  354 +* **LogDirectory**: Ha a txt log file írás engedélyezve van, akkor az itt megadott könyvtárat használja a Log file célkönyvtáraként. Ha a könyvtár nem létezik, akkor létrehozza. Ha nincs megadva, akkor az alkalmazás futási könyvtárában keletkezik a fájl.
  355 +* **LogFile**: Segítségével lehet definiálni, hogy a fent leírt text log fájlt milyen néven hozza létre a Vrh.Logger. Ha nincs megadva, akkor a fájl Vrh.Logger.TxtLog.log néven jön létre.
  356 +* **UsedLogger**: Ha a Vrh.Logger működési környezetében több Logger plugin is található. Akkor ennek segítségével írhatjuk elő, hogy ezek közül melyiket használja a konfiguráció logolásra. Ha ez a beállítás nincs jelen, akkor mindig azt a plugint használja maleiket először megtalál a működési környezetben. Így egyetlen plugin jelenléte esetén a beállítást nem szükséges megadni. Az értéknek a használandó plugin pontos osztály nevét, vagy teljes (névterekkel együtt) osztálynevét kell megadni, ezt mindig az adott Plugin dokumentációjából derül ki.
  357 +* **UsedLoggerConfig**: A UsedLogger elemben megadott plugin publikus "Init" metódusának XElement típusú paraméterében átadott xml elem, aminek beltartalmát teljes egészében a betöltött plugin dolgozza fel. **Ezt a paramétert nem lehet az appSettings elemeken keresztül átadni!**
  358 +
  359 +* **LoggerErrorLogDirectory**: Ha a Vrh.Logger működésében valami hiba lép fel, amely meggátolja a logolást, akkor egy saját text fájlba írja a hiba tényét, és az üzenet segítségével a hiba oka kideríthető. Magasabb logolási szinteken bejegyzéseket készít egyéb információkról is ide, a Logger indulásáról, leállásáról, a használt plugin betöltéséről. Ez a beállítás mondja, meg, hogy melyik könyvtárba kerüljön ez a txt Log. Ha nincs megadva, akkor az alkalmazás futási könyvtárában keletkezik a fájl.
  360 +* **LoggerErrorLogFile**: Segítségével lehet definiálni, hogy a fent leírt saját hiba text fájlt milyen néven hozza létre a Vrh.Logger. Ha nincs megadva, akkor a fájl Vrh.Logger.Errors.log néven jön létre.
  361 +## Információk Plugin fejlesztéshez
  362 +Minden Vrh.Logger egyetlen Log\<T> metódust valósít meg az Vrh.Logger.Ilogger intefész implementációjával. Az interfész használathoz a **Vrh.Logger névtér** using-olandó. Az ILogger interfész teljes definíciója:
  363 +```csharp
  364 + /// <summary>
  365 + /// Logger interfész, amelyet a Vrh.Logger használ
  366 + /// A konkrét logger megoldásnak, vagy annak a wraperének ezt kell implementálnia.
  367 + /// Az implementzáló típust meg kell jelőlni Export attribútummal!
  368 + /// </summary>
  369 + public interface ILogger : IDisposable
  370 + {
  371 + /// <summary>
  372 + /// Azt fogja hívni a Vrh.Logger a logok átadásához.
  373 + /// A koncepció szerint a LogLevel-t a Vrh.Logger kezeli a konkrét logger plugin felett!
  374 + /// </summary>
  375 + /// <typeparam name="T">Típuskijelölő</typeparam>
  376 + /// <param name="noOfLogEntry">Log sorszáma a Logger létrejötte óta az adott alkalmazástérben</param>
  377 + /// <param name="data">A kijelölt típusú adat</param>
  378 + /// <param name="dataFields">Kulcs érték párok listájaként átadott adatok</param>
  379 + /// <param name="exception">Egy exceptiont lehet ide bedobni, hogy a Logger az alapján logolja az exception fontos részleteit</param>
  380 + /// <param name="level">A log szintje ennek a bejegyzésnek</param>
  381 + /// <param name="sourceModul">Forrásmodul a Logger static Log hívásnak átadott típust deklaráló assembly neve kerül bele</param>
  382 + /// <param name="sourceModulVersion">Forrásmodul verziója. Az assemblyben definiált AssemblyInformationalVersion, annak hiányában a definiált AssemblyVersion</param>
  383 + /// <param name="sourceClass">Az osztály teljes neve, ahonnan a Log bejegyzést bedobták</param>
  384 + /// <param name="sourceMethode">A metódus, neve, ahonnan a log bejegyzés érkezett (4.5 Framework-tól automatikus, az alatt a hívási helyen kell gondoskodni az átadásáról)</param>
  385 + /// <param name="line">A forrás sor száma, ahonnan a Log hívás származik (4.5 Framework felett automatikus, az alatt a hívási helyen kell gondoskodni az átadásáról)</param>
  386 + /// <param name="callTimeStamp">A hívás időbéjege</param>
  387 + void Log<T>(UInt64 noOfLogEntry, T data, IDictionary<string, string> dataFields, Exception exception, LogLevel level, string sourceModul, string sourceModulVersion, string sourceClass, string sourceMethode, int line, DateTime callTimeStamp);
  388 +
  389 + /// <summary>
  390 + /// Esemény,a melyen keresztül a plugin visszajelzést tud küldeni a működésében bekövetkező kritikus hibákról.
  391 + /// Minden esetben Dispose hívást, és recreatet eredményez a Pluginra nézve a Vrh.Logger keret szintjén!!!
  392 + /// </summary>
  393 + event FatalErrorInPluginEventHandler FatalErrorInPlugin;
  394 +```
  395 +Az alábbi szabályok és elvek elvárások a Pluginnal szemben:
  396 +* Implementáció:
  397 +>* A Plugin megvalósítás implementálja az ILoggert, amely egyetlen Log<T> metódus megvalósítását jelenti.
  398 +>* De az ILogger egy IDispose leszármazott, ezért a plugin disposolható. És kötelezően Dispose mintát implementál.
  399 +>* A Pluginnak kötelessége megvalósítani tényleges teljes erőforrás felszabadítást a Dispose ágon. A Vrh.Logger keret bizonyos esetekben a publikus Dispose metodusát hívja. Ekkor minden a logoláshoz használt erőforrást el kell engednie, és az objektumnak meg kell semmisülnie a Dispose visszatérésére. Tehát maradéktalanul működnie kell egy ilyen teszt kódnak rá (ahol iterationCount egy tetszőleges számú ismétlést definiál):
  400 +>```csharp
  401 +> for (int i = 0; i < iterationCount; i++)
  402 +> {
  403 +> ILogger logger = new MyLoggerPlugin();
  404 +> logger.Log<string>((ulong)i, "test", null, null, LogLevel.Debug, "TEST", "V1.0.0", "TestClass", "TestMethode", 1, DateTime.Now);
  405 +> }
  406 +>```
  407 +* Hibavédettség:
  408 +>* A plugin implementációnak le kell kezelnie, hogy a Log<T> hívás során bármilyen paraméter értéket is kapjon bármelyik paraméterben, beleértve a null értékeket is a nullozható típusok esetén. Megengedett, hogy a Logolás ne sikerüljön (ne keletkezzen log bejegyzés), de hogy a Plugin működése leálljon az nem.
  409 +>* Fenti paraméterek közül az alábbiak Null értéktől különböző kitöltöttségét mindig biztosítja a Vrh.Logger keret a nullozható típusok esetén is:
  410 +>>* dataFields (üres Dictonary formájában)
  411 +>>* sourceModul
  412 +>>* sourceModulVersion
  413 +>>* sourceClass
  414 +* További részletek:
  415 +>* Mivel a Vrh.Logger keret a Plugint a MEF keretrendszerrel tölti be, ezért meg kell jelölni Export attribútummal, a plugin Vrh.Logger.ILogger interfészt implementáló típusát, mégpedig az Ilogger contract típussal:
  416 +>```csharp
  417 +> [Export(typeof(ILogger))]
  418 +> public class DefaultLogger : ILogger
  419 +> {
  420 +> ...
  421 +>```
  422 +>* Az Export attribútum a **System.ComponentModel.Composition** névtérben található.
  423 +>* Mivel a Vrh.Logger keret a plugint egy egyszerű MEF Import-ként injektálja, így minden működéséhez szükséges inicializációt el kell végezni az alapértelmezett (paraméter nélküli) konstruktorában. Sem konstruktor paraméter átadására, sem inicializáló függvény meghívására nincs lehetőség az automatikus Plugin töltés folyamatában.
  424 +>* Mivel a Vrh Logger keret a Plugin Log<T> implementációját aszinkron, egy külön háttérszálra dobva hívja (és nem vár a visszatérésére), ezért ez további követelményeket és sajátosságokat jelent:
  425 +>>* A Log\<T> metódusnak, illetve a Plugin ennek a hívásnak a kezelésével összefüggő működésének szálvédettnek kell lennie! Hiszen a Logger keret változó számú, párhuzamos konkurens hívást fog intézni a plugin felé a Log\<T> híváson keresztül.
  426 +>>* Ennek megfelelően a Log\<T> hívással semmilyen mód nem biztosított futási eredmények, vagy hibák visszadobására a logolásból. A Le nem kezelt kivételek annyit eredményeznek, hogy a végrehajtására indított tread nem normál státusszal terminál. Ennek ellenére kívánatos a Plugin Log metódusra hibavédelmet implementálni, és a logolásban fellépő kritikus hibák okáról a lentebb leírt módon értesíteni a Vrh.Logger komponenst.
  427 +>* Amennyiben a Plugin működését akadályozandó hiba áll fenn, vagy ilyen keletkezik, a Plugin felelőssége, hogy erről értesítse a Vrh.Logger plugint. Ennek a módja, a Vrh.Logger.ILogger interfészben definiált **FatalErrorInPlugin** esemény implementálása:
  428 +>```csharp
  429 +> /// <summary>
  430 +> /// Esemény,a melyen keresztül a plugin visszajelzést tud küldeni a működésében bekövetkező kritikus hibákról.
  431 +> /// Minden esetben Dispose hívást, és recreatet eredményez a Pluginra nézve a Vrh.Logger keret szintjén!!!
  432 +> /// </summary>
  433 +> event FatalErrorInPluginEventHandler FatalErrorInPlugin;
  434 +>```
  435 +>* Az eseményt a **FatalErrorInPluginEventHandler** delegate-nek megfelelő signaturával iratkozik fel a Vrh.Logger keret, amely teljes definíciója az alábbi:
  436 +>```csharp
  437 +> /// <summary>
  438 +> /// Delegeta definició, a FatalErrorInPlugin event kezeléséhez
  439 +> /// </summary>
  440 +> /// <param name="pluginType">A plugin típusa, mindig adjuk át, hogy a Vrh.Logger keret releváns információt menthessen a hiba fellépésének helyéről</param>
  441 +> /// <param name="e">Az esemény argumentumai, egy szöveges üzenetet, és egy tetszőleges szabványos Exception átadását támogatja</param>
  442 +> public delegate void FatalErrorInPluginEventHandler(Type pluginType, PluginFatalErrorEventArgs e);
  443 +>```
  444 +>* A használt **PluginFatalErrorEventArgs** typus teljes definiciója az alábbi:
  445 +>```csharp
  446 + /// <summary>
  447 + /// EventArgs a FatalErrorInPlugin eseméynhez
  448 + /// </summary>
  449 + public class PluginFatalErrorEventArgs : EventArgs
  450 + {
  451 + /// <summary>
  452 + /// Szöveges információ a fellépett hibáról
  453 + /// </summary>
  454 + public string Message { get; set; }
  455 +
  456 + /// <summary>
  457 + /// Itt adhatjuk át a feléppő, vagy a kiváltott Exception-t
  458 + /// </summary>
  459 + public Exception Exception { get; set; }
  460 +
  461 + /// <summary>
  462 + /// Jelzi a logger keretnek, hogy indítsa újra a plugint
  463 + /// </summary>
  464 + public bool RestartMe { get; set; }
  465 + } >```
  466 +>* Fentiek alapján a Pluginban az alábbi minta alapján kell helyesen implementálni az esemény visszajelzést:
  467 +>```csharp
  468 +> /// <summary>
  469 +> /// FatalErrorInPlugin esemény (ILogger interfész member)
  470 +> /// </summary>
  471 +> public event FatalErrorInPluginEventHandler FatalErrorInPlugin;
  472 +>
  473 +> /// <summary>
  474 +> /// Metódus a FatalErrorInPlugin esemény elsütésére
  475 +> /// </summary>
  476 +> /// <param name="exception">Menteni kívánt kivétel</param>
  477 +> /// <param name="message">Szabadon beállítható üzenet a hibával kapcsolatban</param>
  478 +> private void OnFatalErrorInPlugin(Exception exception = null, string message = "")
  479 +> {
  480 +> var ea = new PluginFatalErrorEventArgs()
  481 +> {
  482 +> Message = message,
  483 +> Exception = exception,
  484 +> RestartMe = true,
  485 +> };
  486 +> FatalErrorInPlugin?.Invoke(this.GetType(), ea);
  487 +> }
  488 +>```
  489 +>* A hiba esemény kiváltásához egyszerűen az OnFatalErrorInPlugin metódust hívjuk a plugin implementációjában azon a helyen, ahonnan a hiba fellépéséről értesítést akarunk küldeni a keretnek.
  490 +>* Cészerű kihasználni, hogy konkrét Exception típust tudunk átadni. Az emellé mellékelt szöveges üzenet inkább egy opcionális lehetőség.
  491 +>* Az esemény kritikus hibák jelzésére szolgál. A Vrh.Logger keret a saját logjába mindig errorként menti az ezen át érkezett információkat. Ne használjuk a plugin működésével kapcsolatos ionformációk átadására, csak ténylegesen olyan súlyos hibák jelzésére, amely megakadályozzák az adott Logger plugin helyes működését. A RestartMe tag segítségével utasíthatjuk a keretet, hogy töltse be újra a Plugint. Célszerű olyan implementáció megvalósítása, amely biztosítja, hogy a Log\<T> hívások csak a hiba fellépésekor jelentsenek Error-t, és ne minden egyes Log\<T> híváskor, ezzel biztosítani lehet, hogy a Logolás infrastrukturális ellehetetlenítése ne legyen befolyással a program eredeti működésére.
  492 +* Logszintek:
  493 +>* A koncepció szerint a logolási szintek kezelése nem a Plugin, hanem a Vrh.Logger keret hatásköre. Ezért a Vrh.Logger keret a saját beállításának megfelelően, nem is intéz Log\<T> hívást a plugin felé, ha a logolandó információ nem éri le az aktuálisan beállított logolási szintet. Ennek ellenére a Pluginban szükség lehet a Logolási szint szerepeltetésére, például, hogy mentsük a log bejegyzéssel ezt információt. Lehetőleg ne végezzünk szemantikai tranzformációt a logszintekkel kapcsolatban, és törekedjünk rá, hogy konkrétan a Vrh.Logger által definiált LogLevel enumeratort használjuk. Az itt definiált None érték nem egy valós logszint, a logolás teljes kikapcsolására használja a keret. Ennek megfelelően, ilyen log szint megjelöléssel sose fog a Vrh.Logger keret hívást intézni a Plugin felé.
  494 +>* A logszintek teljes definíciója az alábbi a LogLevel enumban:
  495 +>```csharp
  496 +> /// <summary>
  497 +> /// A logolás lehetséges szintjei
  498 +> /// </summary>
  499 +> public enum LogLevel
  500 +> {
  501 +> /// <summary>
  502 +> /// Debug részletességet célzó logbejegyzések a működés részletes követésére, hibakeresésre
  503 +> /// </summary>
  504 +> Debug = 1,
  505 +> /// <summary>
  506 +> /// Részletes, bőbeszédű információk szintje
  507 +> /// </summary>
  508 +> Verbose = 2,
  509 +> /// <summary>
  510 +> /// Információk a rendszer működéséről
  511 +> /// </summary>
  512 +> Information = 3,
  513 +> /// <summary>
  514 +> /// Figyelmeztetések szintje
  515 +> /// </summary>
  516 +> Warning = 4,
  517 +> /// <summary>
  518 +> /// A hibák szintje
  519 +> /// </summary>
  520 +> Error = 5,
  521 +> /// <summary>
  522 +> /// A kritikus hibák szintje
  523 +> /// </summary>
  524 +> Fatal = 6,
  525 +> /// <summary>
  526 +> /// None segítségével kikapcsolható a teljes logolás, sose használjuk logbejegyzés szintjeként, mert a VRH.Logger az ilyen bejegyzéseket mindig elutasítja!
  527 +> /// </summary>
  528 +> None = 7,
  529 +> }
  530 +>```
  531 +
  532 +<hr></hr>
  533 +
  534 +# Version History:
  535 +## 2.1.0 (2019.11.14)
  536 +### Compatibility API changes:
  537 +1. A betöltendő logger modulnak a LogConfig xml struktúra UsedLoggerConfig xml elemét átadja paraméterként; ennek tartalmát csak a betöltött logger elemzi és használja;
  538 +2. A fenti xml struktúrát a logger betöltése után annak "Init" nevű publikus metódusán keresztül adja át, amelynek egyetlen paramétere egy XElement típus.;
  539 +3. Az "Init" metódus nem kötelező, ha nem létezik, akkor nem okoz hibát.
  540 +4. Az iLoggerLogger kliens kiegészítésre került az "Init" metódussal, amelyben megkapja a WcfCliens xml struktúrát, ami alapján az XmlProcessing.WCF osztály eszközeivel inicializálja az iLogger szervizhez csatlakozó kliensét, így megadható a connectionstringstore-on keresztül az iLogger szerviz címe.
  541 +5. Ha nincs UsedLoggerConfig vagy benne WCFClient elem, vagy abban nincsenek megadva adatok, akkor a működés a korábbiak szerinti.
  542 +
  543 +## 2.0.3 (2019.11.06)
  544 +### Patches:
  545 +1. Webes környezetben való működésképtelenség (path felvételek miatt) hibamentessé tétele
  546 +2. None a defult loglevel, ha config error van
  547 +3. Nem ír Fatal logot sem, ha none a loglevel
  548 +## v2.0.2 (2019.11.04)
  549 +### Patches:
  550 +1. Load error információk megjelenésének javítása (Error log txt-ben)
  551 +## v2.0.1 (2019.10.25)
  552 +### Patches:
  553 +1. A nuget csomag telepítéskor elkészíti azt a minimális konfigurációt, ami a telepítés helyén való instant működőképességhez szükséges. (**Minden Nuget csomagnak ez lenne a célja a belézárt komponenst illetően: A telepítés teljes automatizálása, ami azonnali használatbavételt tesz lehetővé a telepítés helyén a komponens mélyebb ismerete (pl. konfigurálás módja) nélkül!**)
  554 +2. Főverzió emeléskor az Obsolete-nek jelölt elemeket ki kell dobni a kódból, ezt most pótoltam
  555 +3. Instanmt kipróbálhatóság futatahatóság a repoba felrakott állapotban (konfig fájlok tartalma, stb.)
  556 +
  557 +## v1.5.7 (2019.06.04)
  558 +### Patch:
  559 +1. Windows Service-ben a Log bejegyzések előállítása túl időköltséges volt (már a task oldalon) a PID lekérdezések miatt. Állandó lekérdezés helyett áttéve egy Lazy fieldbe.
  560 +## v1.5.6 (2019.05.27)
  561 +### Patch:
  562 +1. DefualtLogger Txt log implementáció: Logbejegyzések kiegészítése TimeStamp-pel
  563 +2. DefualtLogger Txt log implementáció: A létrehozott logfájl nevébe bekerül prefxként a dátumbélyeg (YYYYMMDD_), így naponta új txt fájl keletkezik, és nem lesznek használhatatlanul nagyok a log fájlok.
  564 +## v1.5.5 (2019.05.23)
  565 +### Patch:
  566 +1. compatible_Lear branch!!! Nugetek Learhez igazítása
  567 +## v1.5.4 (2019.05.21)
  568 +### Patch:
  569 +1. To upgrade all Nugets to latest
  570 +## V1.5.2 (2018.12.11)
  571 +### Patch:
  572 +1. Service név lekérdezésében hiba javítása
  573 +## V1.5.1 (2018.12.11)
  574 +### Patch:
  575 +1. CallSignature osztály láthatósága .public
  576 +## V1.5.0 (2018.12.11)
  577 +### Compatibility API changes:
  578 +1. CallSignature osztály bevezetése.
  579 +## V1.4.0 (2017.12.06)
  580 +### Compatibility API changes:
  581 +1. Logger class funkciója áttéve a VrhLogger-class alá. Ott csak annak a public (API) funkcionalitása maradt, oly módon, hogy áthív a VrhLogger-be. (Hogy ne legyen incompatibility a change.)
  582 +2. A Logger class Obsolote-tal jelölve --> Depcreated!
  583 +### Patches:
  584 +1. LogHelper.ExtractPropertyValuesToDataFields null védelme
  585 +## V1.3.0 (2017.12.05)
  586 +### Compatibility API changes:
  587 +1. LogHelper kiegészítése az ExtractPropertyValuesToDataFields metódussal
  588 +## V1.2.0 (2017.08.10)
  589 +### Compatibility API changes:
  590 +1. DefaultLogger kiegészítése TXT log file írási kéápességgel
  591 +2. Lehetséges app settings kulcsok kezelésének beépítése a default plugin txt file logolás képesség konfigurációjához (Kulcsok: "Vrh.Logger:EnableFileLogging", "Vrh.Logger:LogDirectory" "Vrh.Logger:LogFile")
  592 +3. LogConfig.xml (config xml) feldolgozó kiegészítése a default plugin txt file logolás képesség kapcsán szükésge súj beállítások kezelésével (Tag: EnableFileLogging (Extended boolean: true|yes|1/false|no|0) lehetséges attríbutumai: LogDirectory="Log" LogFile="Vrh.Logger.TxtLog.log)
  593 +### Patches:
  594 +1. LoggerErrorLogFile beállítást valóban figyelembe vegye a belső error log file elnevezésében
  595 +2. A Default logger valóban figyelembe veszi a három leheteséges log target-re engedélyezés van-e konfigurálva, és csak arra ír, amelyikre igen
  596 +## V1.1.0 (2017.03.21)
  597 +### Compatibility API changes:
  598 +1. LogHelper.GetExceptionData bevezetése
  599 +### Patches:
  600 +1. Newtonsoft.Json nuget dependency növelése 10.0.1-re
  601 +2. LogHelper.GetExceptionInfo kiegészítése az Exception.Data tartalmának kibontásával
  602 +## V1.0.1 (2017.03.21)
  603 +### Patches:
  604 +1. Új Vrh.LinqXmlProcesser.Base beépítés
  605 +2. Nuspec fájl javításaok
  606 +## V1.0.0 (2017.02.21)
  607 +Initial version
... ...
Vrh.Web.Reporting/Vrh.Web.Reporting.csproj
... ... @@ -15,8 +15,8 @@
15 15 <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
16 16 <OutputType>Library</OutputType>
17 17 <AppDesignerFolder>Properties</AppDesignerFolder>
18   - <RootNamespace>Vrh.Web.iScheduler</RootNamespace>
19   - <AssemblyName>Vrh.Web.iScheduler</AssemblyName>
  18 + <RootNamespace>Vrh.Web.Reporting</RootNamespace>
  19 + <AssemblyName>Vrh.Web.Reporting</AssemblyName>
20 20 <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
21 21 <MvcBuildViews>false</MvcBuildViews>
22 22 <UseIISExpress>true</UseIISExpress>
... ... @@ -78,11 +78,11 @@
78 78 <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
79 79 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
80 80 </Reference>
81   - <Reference Include="Hangfire.Core, Version=1.7.34.0, Culture=neutral, processorArchitecture=MSIL">
82   - <HintPath>..\packages\Hangfire.Core.1.7.34\lib\net46\Hangfire.Core.dll</HintPath>
  81 + <Reference Include="Hangfire.Core, Version=1.8.0.0, Culture=neutral, processorArchitecture=MSIL">
  82 + <HintPath>..\packages\Hangfire.Core.1.8.0-rc4\lib\net46\Hangfire.Core.dll</HintPath>
83 83 </Reference>
84   - <Reference Include="Hangfire.SqlServer, Version=1.7.34.0, Culture=neutral, processorArchitecture=MSIL">
85   - <HintPath>..\packages\Hangfire.SqlServer.1.7.34\lib\net45\Hangfire.SqlServer.dll</HintPath>
  84 + <Reference Include="Hangfire.SqlServer, Version=1.8.0.0, Culture=neutral, processorArchitecture=MSIL">
  85 + <HintPath>..\packages\Hangfire.SqlServer.1.8.0-rc4\lib\net451\Hangfire.SqlServer.dll</HintPath>
86 86 </Reference>
87 87 <Reference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
88 88 <HintPath>..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath>
... ... @@ -106,21 +106,27 @@
106 106 <Reference Include="Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
107 107 <HintPath>..\packages\Microsoft.SqlServer.Types.11.0.0\lib\net20\Microsoft.SqlServer.Types.dll</HintPath>
108 108 </Reference>
  109 + <Reference Include="Microsoft.Web.Administration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  110 + <HintPath>..\packages\Microsoft.Web.Administration.11.1.0\lib\netstandard1.5\Microsoft.Web.Administration.dll</HintPath>
  111 + </Reference>
109 112 <Reference Include="Microsoft.Web.Infrastructure, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
110 113 <HintPath>..\packages\Microsoft.Web.Infrastructure.2.0.1\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
111 114 </Reference>
112 115 <Reference Include="Microsoft.Web.Mvc, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
113 116 <HintPath>..\packages\Microsoft.AspNet.Mvc.Futures.5.0.0\lib\net40\Microsoft.Web.Mvc.dll</HintPath>
114 117 </Reference>
  118 + <Reference Include="Microsoft.Win32.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  119 + <HintPath>..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
  120 + </Reference>
  121 + <Reference Include="Microsoft.Win32.Registry, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  122 + <HintPath>..\packages\Microsoft.Win32.Registry.4.0.0\lib\net46\Microsoft.Win32.Registry.dll</HintPath>
  123 + </Reference>
115 124 <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
116 125 <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
117 126 </Reference>
118 127 <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
119 128 <HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
120 129 </Reference>
121   - <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
122   - <HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
123   - </Reference>
124 130 <Reference Include="PagedList, Version=1.17.0.0, Culture=neutral, PublicKeyToken=abbb863e9397c5e1, processorArchitecture=MSIL">
125 131 <HintPath>..\packages\PagedList.1.17.0.0\lib\net40\PagedList.dll</HintPath>
126 132 </Reference>
... ... @@ -128,13 +134,92 @@
128 134 <HintPath>..\packages\PagedList.Mvc.4.5.0.0\lib\net40\PagedList.Mvc.dll</HintPath>
129 135 </Reference>
130 136 <Reference Include="System" />
  137 + <Reference Include="System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  138 + <HintPath>..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll</HintPath>
  139 + </Reference>
  140 + <Reference Include="System.ComponentModel.Composition" />
  141 + <Reference Include="System.Console, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  142 + <HintPath>..\packages\System.Console.4.0.0\lib\net46\System.Console.dll</HintPath>
  143 + </Reference>
131 144 <Reference Include="System.Data" />
132 145 <Reference Include="System.Data.DataSetExtensions" />
  146 + <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
  147 + <HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
  148 + </Reference>
  149 + <Reference Include="System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  150 + <HintPath>..\packages\System.Diagnostics.TraceSource.4.0.0\lib\net46\System.Diagnostics.TraceSource.dll</HintPath>
  151 + </Reference>
  152 + <Reference Include="System.Diagnostics.Tracing, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  153 + <HintPath>..\packages\System.Diagnostics.Tracing.4.1.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
  154 + </Reference>
133 155 <Reference Include="System.Drawing" />
  156 + <Reference Include="System.Globalization.Calendars, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  157 + <HintPath>..\packages\System.Globalization.Calendars.4.0.1\lib\net46\System.Globalization.Calendars.dll</HintPath>
  158 + </Reference>
  159 + <Reference Include="System.IO, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  160 + <HintPath>..\packages\System.IO.4.1.0\lib\net462\System.IO.dll</HintPath>
  161 + </Reference>
  162 + <Reference Include="System.IO.Compression, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  163 + <HintPath>..\packages\System.IO.Compression.4.1.0\lib\net46\System.IO.Compression.dll</HintPath>
  164 + </Reference>
  165 + <Reference Include="System.IO.Compression.FileSystem" />
  166 + <Reference Include="System.IO.Compression.ZipFile, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  167 + <HintPath>..\packages\System.IO.Compression.ZipFile.4.0.1\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
  168 + </Reference>
  169 + <Reference Include="System.IO.FileSystem, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  170 + <HintPath>..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll</HintPath>
  171 + </Reference>
  172 + <Reference Include="System.IO.FileSystem.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  173 + <HintPath>..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
  174 + </Reference>
134 175 <Reference Include="System.Linq" />
135   - <Reference Include="System.Runtime" />
136   - <Reference Include="System.Runtime.InteropServices" />
137   - <Reference Include="System.Runtime.InteropServices.RuntimeInformation" />
  176 + <Reference Include="System.Net.Http, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  177 + <HintPath>..\packages\System.Net.Http.4.1.0\lib\net46\System.Net.Http.dll</HintPath>
  178 + </Reference>
  179 + <Reference Include="System.Net.Sockets, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  180 + <HintPath>..\packages\System.Net.Sockets.4.1.0\lib\net46\System.Net.Sockets.dll</HintPath>
  181 + </Reference>
  182 + <Reference Include="System.Numerics" />
  183 + <Reference Include="System.Reflection, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  184 + <HintPath>..\packages\System.Reflection.4.1.0\lib\net462\System.Reflection.dll</HintPath>
  185 + </Reference>
  186 + <Reference Include="System.Reflection.TypeExtensions, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  187 + <HintPath>..\packages\System.Reflection.TypeExtensions.4.4.0\lib\net461\System.Reflection.TypeExtensions.dll</HintPath>
  188 + </Reference>
  189 + <Reference Include="System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  190 + <HintPath>..\packages\System.Runtime.4.1.0\lib\net462\System.Runtime.dll</HintPath>
  191 + </Reference>
  192 + <Reference Include="System.Runtime.Extensions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  193 + <HintPath>..\packages\System.Runtime.Extensions.4.1.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
  194 + </Reference>
  195 + <Reference Include="System.Runtime.InteropServices, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  196 + <HintPath>..\packages\System.Runtime.InteropServices.4.1.0\lib\net462\System.Runtime.InteropServices.dll</HintPath>
  197 + </Reference>
  198 + <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  199 + <HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.0.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
  200 + </Reference>
  201 + <Reference Include="System.Security.Claims, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  202 + <HintPath>..\packages\System.Security.Claims.4.0.1\lib\net46\System.Security.Claims.dll</HintPath>
  203 + </Reference>
  204 + <Reference Include="System.Security.Cryptography.Algorithms, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  205 + <HintPath>..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll</HintPath>
  206 + </Reference>
  207 + <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  208 + <HintPath>..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
  209 + </Reference>
  210 + <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  211 + <HintPath>..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
  212 + </Reference>
  213 + <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  214 + <HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
  215 + </Reference>
  216 + <Reference Include="System.Security.Principal.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  217 + <HintPath>..\packages\System.Security.Principal.Windows.4.0.0\lib\net46\System.Security.Principal.Windows.dll</HintPath>
  218 + </Reference>
  219 + <Reference Include="System.ServiceProcess" />
  220 + <Reference Include="System.ServiceProcess.ServiceController, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  221 + <HintPath>..\packages\System.ServiceProcess.ServiceController.4.1.0\lib\net461\System.ServiceProcess.ServiceController.dll</HintPath>
  222 + </Reference>
138 223 <Reference Include="System.Threading.Thread" />
139 224 <Reference Include="System.Web.DynamicData" />
140 225 <Reference Include="System.Web.Entity" />
... ... @@ -172,8 +257,6 @@
172 257 <Reference Include="System.Configuration" />
173 258 <Reference Include="System.Web.Services" />
174 259 <Reference Include="System.EnterpriseServices" />
175   - <Reference Include="System.Net.Http">
176   - </Reference>
177 260 <Reference Include="System.Net.Http.WebRequest">
178 261 </Reference>
179 262 <Reference Include="System.Xml.Linq" />
... ... @@ -192,6 +275,9 @@
192 275 <Reference Include="VRH.Log4Pro.WebTools, Version=1.11.1.0, Culture=neutral, processorArchitecture=MSIL">
193 276 <HintPath>..\packages\VRH.Log4Pro.WebTools.1.11.1\lib\net451\VRH.Log4Pro.WebTools.dll</HintPath>
194 277 </Reference>
  278 + <Reference Include="Vrh.Logger, Version=2.9.4.0, Culture=neutral, processorArchitecture=MSIL">
  279 + <HintPath>..\packages\Vrh.Logger.2.9.4\lib\net451\Vrh.Logger.dll</HintPath>
  280 + </Reference>
195 281 <Reference Include="Vrh.Membership, Version=4.11.0.0, Culture=neutral, processorArchitecture=MSIL">
196 282 <HintPath>..\packages\Vrh.Membership.4.11.0\lib\net451\Vrh.Membership.dll</HintPath>
197 283 </Reference>
... ... @@ -566,6 +652,9 @@
566 652 <Content Include="Images\ajax-loader_black.gif" />
567 653 <Content Include="Images\log4pro_cube.png" />
568 654 <Content Include="Images\userlogo.jpg" />
  655 + <None Include="LogConfig.xml">
  656 + <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  657 + </None>
569 658 <Content Include="Scripts\bootbox.all.js" />
570 659 <Content Include="Scripts\bootbox.all.min.js" />
571 660 <Content Include="Scripts\bootbox.js" />
... ... @@ -813,6 +902,7 @@
813 902 <None Include="Vrh.NugetModuls.Documentations\VRH.Common\ReadMe.md" />
814 903 <None Include="Vrh.NugetModuls.Documentations\VRH.Log4Pro.WebTools\ReadMe.md" />
815 904 <Content Include="Scripts\bootstrap4-toggle.min.js.map" />
  905 + <Content Include="Vrh.NugetModuls.Documentations\Vrh.Logger\ReadMe.md" />
816 906 <None Include="Vrh.NugetModuls.Documentations\Vrh.Web.Common.Lib\ReadMe.md" />
817 907 <None Include="Vrh.NugetModuls.Documentations\Vrh.Web.FileManager\ReadMe.md" />
818 908 <None Include="Vrh.NugetModuls.Documentations\Vrh.WebForm\ReadMe.md" />
... ...
Vrh.Web.Reporting/Web.config
... ... @@ -11,6 +11,7 @@
11 11 <appSettings>
12 12 <add key="VRH.XmlParser:root" value="c:\Log4ProIS\Config\XmlParser.xml" />
13 13 <add key="owin:AutomaticAppStartup" value="false" />
  14 + <add key="Vrh.Logger:Config" value="file=C:\Log4ProIS\CONFIG\LogConfig.xml;element=/Vrh.Web.Reporting;"/>
14 15 <add key="VRH.MultiLanguageManager:connectionString" value="VRH.MultiLanguageManagerLOG4PRO:connectionString" />
15 16 <add key="VRH.MultiLanguageManager:DefaultLanguageCode" value="en-US" />
16 17 <add key="webpages:Version" value="3.0.0.0" />
... ... @@ -107,7 +108,7 @@
107 108 </dependentAssembly>
108 109 <dependentAssembly>
109 110 <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
110   - <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  111 + <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
111 112 </dependentAssembly>
112 113 <dependentAssembly>
113 114 <assemblyIdentity name="Microsoft.Extensions.Logging" publicKeyToken="adb9793829ddae60" culture="neutral" />
... ... @@ -157,6 +158,10 @@
157 158 <assemblyIdentity name="Microsoft.Web.Infrastructure" publicKeyToken="31bf3856ad364e35" culture="neutral" />
158 159 <bindingRedirect oldVersion="0.0.0.0-2.0.1.0" newVersion="2.0.1.0" />
159 160 </dependentAssembly>
  161 + <dependentAssembly>
  162 + <assemblyIdentity name="System.Reflection.TypeExtensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  163 + <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
  164 + </dependentAssembly>
160 165 </assemblyBinding>
161 166 </runtime>
162 167 <entityFramework>
... ...
Vrh.Web.Reporting/packages.config
... ... @@ -7,9 +7,9 @@
7 7 <package id="DataAnnotationsExtensions.MVC3" version="5.0.1.27" targetFramework="net45" />
8 8 <package id="EntityFramework" version="6.4.4" targetFramework="net451" />
9 9 <package id="Font.Awesome" version="5.15.4" targetFramework="net461" />
10   - <package id="Hangfire" version="1.7.34" targetFramework="net461" />
11   - <package id="Hangfire.Core" version="1.7.34" targetFramework="net461" />
12   - <package id="Hangfire.SqlServer" version="1.7.34" targetFramework="net461" />
  10 + <package id="Hangfire" version="1.8.0-rc4" targetFramework="net462" />
  11 + <package id="Hangfire.Core" version="1.8.0-rc4" targetFramework="net462" />
  12 + <package id="Hangfire.SqlServer" version="1.8.0-rc4" targetFramework="net462" />
13 13 <package id="jQuery" version="3.6.4" targetFramework="net472" />
14 14 <package id="jQuery.Ajax.Unobtrusive" version="2.0.20710.0" targetFramework="net45" />
15 15 <package id="jquery.datatables" version="1.10.15" targetFramework="net451" />
... ... @@ -30,24 +30,78 @@
30 30 <package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.2.6" targetFramework="net451" />
31 31 <package id="Microsoft.jQuery.Unobtrusive.Validation" version="4.0.0" targetFramework="net461" />
32 32 <package id="Microsoft.Net.Compilers.Toolset" version="3.9.0" targetFramework="net472" developmentDependency="true" />
  33 + <package id="Microsoft.NETCore.Platforms" version="1.0.1" targetFramework="net462" />
33 34 <package id="Microsoft.Owin" version="3.0.0" targetFramework="net461" />
34 35 <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.0" targetFramework="net461" />
35 36 <package id="Microsoft.Report.Viewer" version="11.0.0.0" targetFramework="net45" />
36 37 <package id="Microsoft.SqlServer.Types" version="11.0.0" targetFramework="net451" />
  38 + <package id="Microsoft.Web.Administration" version="11.1.0" targetFramework="net462" />
37 39 <package id="Microsoft.Web.Infrastructure" version="2.0.1" targetFramework="net472" />
  40 + <package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" />
  41 + <package id="Microsoft.Win32.Registry" version="4.0.0" targetFramework="net462" />
38 42 <package id="MicrosoftWebMvc" version="2.0" targetFramework="net45" />
39 43 <package id="Modernizr" version="2.8.3" targetFramework="net451" />
40 44 <package id="Moment.js" version="2.29.4" targetFramework="net461" />
41 45 <package id="Mvc2Futures" version="2.0.50217.0" targetFramework="net45" />
  46 + <package id="NETStandard.Library" version="1.6.0" targetFramework="net462" />
42 47 <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net472" />
43 48 <package id="Owin" version="1.0" targetFramework="net461" />
44 49 <package id="PagedList" version="1.17.0.0" targetFramework="net45" />
45 50 <package id="PagedList.Mvc" version="4.5.0.0" targetFramework="net45" />
46 51 <package id="popper.js" version="1.16.1" targetFramework="net451" />
47 52 <package id="Respond" version="1.4.2" targetFramework="net451" />
  53 + <package id="System.AppContext" version="4.1.0" targetFramework="net462" />
  54 + <package id="System.Collections" version="4.0.11" targetFramework="net462" />
  55 + <package id="System.Collections.Concurrent" version="4.0.12" targetFramework="net462" />
  56 + <package id="System.Console" version="4.0.0" targetFramework="net462" />
  57 + <package id="System.Diagnostics.Debug" version="4.0.11" targetFramework="net462" />
  58 + <package id="System.Diagnostics.DiagnosticSource" version="4.0.0" targetFramework="net462" />
  59 + <package id="System.Diagnostics.Tools" version="4.0.1" targetFramework="net462" />
  60 + <package id="System.Diagnostics.TraceSource" version="4.0.0" targetFramework="net462" />
  61 + <package id="System.Diagnostics.Tracing" version="4.1.0" targetFramework="net462" />
  62 + <package id="System.Globalization" version="4.0.11" targetFramework="net462" />
  63 + <package id="System.Globalization.Calendars" version="4.0.1" targetFramework="net462" />
  64 + <package id="System.IO" version="4.1.0" targetFramework="net462" />
  65 + <package id="System.IO.Compression" version="4.1.0" targetFramework="net462" />
  66 + <package id="System.IO.Compression.ZipFile" version="4.0.1" targetFramework="net462" />
  67 + <package id="System.IO.FileSystem" version="4.0.1" targetFramework="net462" />
  68 + <package id="System.IO.FileSystem.Primitives" version="4.0.1" targetFramework="net462" />
  69 + <package id="System.Linq" version="4.1.0" targetFramework="net462" />
  70 + <package id="System.Linq.Expressions" version="4.1.0" targetFramework="net462" />
  71 + <package id="System.Net.Http" version="4.1.0" targetFramework="net462" />
  72 + <package id="System.Net.Primitives" version="4.0.11" targetFramework="net462" />
  73 + <package id="System.Net.Sockets" version="4.1.0" targetFramework="net462" />
  74 + <package id="System.ObjectModel" version="4.0.12" targetFramework="net462" />
  75 + <package id="System.Reflection" version="4.1.0" targetFramework="net462" />
  76 + <package id="System.Reflection.Extensions" version="4.0.1" targetFramework="net462" />
  77 + <package id="System.Reflection.Primitives" version="4.0.1" targetFramework="net462" />
  78 + <package id="System.Reflection.TypeExtensions" version="4.4.0" targetFramework="net462" />
  79 + <package id="System.Resources.ResourceManager" version="4.0.1" targetFramework="net462" />
  80 + <package id="System.Runtime" version="4.1.0" targetFramework="net462" />
  81 + <package id="System.Runtime.Extensions" version="4.1.0" targetFramework="net462" />
  82 + <package id="System.Runtime.Handles" version="4.0.1" targetFramework="net462" />
  83 + <package id="System.Runtime.InteropServices" version="4.1.0" targetFramework="net462" />
  84 + <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.0.0" targetFramework="net462" />
  85 + <package id="System.Runtime.Numerics" version="4.0.1" targetFramework="net462" />
  86 + <package id="System.Security.Claims" version="4.0.1" targetFramework="net462" />
  87 + <package id="System.Security.Cryptography.Algorithms" version="4.2.0" targetFramework="net462" />
  88 + <package id="System.Security.Cryptography.Encoding" version="4.0.0" targetFramework="net462" />
  89 + <package id="System.Security.Cryptography.Primitives" version="4.0.0" targetFramework="net462" />
  90 + <package id="System.Security.Cryptography.X509Certificates" version="4.1.0" targetFramework="net462" />
  91 + <package id="System.Security.Principal.Windows" version="4.0.0" targetFramework="net462" />
  92 + <package id="System.ServiceProcess.ServiceController" version="4.1.0" targetFramework="net462" />
  93 + <package id="System.Text.Encoding" version="4.0.11" targetFramework="net462" />
  94 + <package id="System.Text.Encoding.Extensions" version="4.0.11" targetFramework="net462" />
  95 + <package id="System.Text.RegularExpressions" version="4.1.0" targetFramework="net462" />
  96 + <package id="System.Threading" version="4.0.11" targetFramework="net462" />
  97 + <package id="System.Threading.Tasks" version="4.0.11" targetFramework="net462" />
  98 + <package id="System.Threading.Timer" version="4.0.1" targetFramework="net462" />
  99 + <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net462" />
  100 + <package id="System.Xml.XDocument" version="4.0.11" targetFramework="net462" />
48 101 <package id="VRH.Common" version="3.0.0" targetFramework="net472" />
49 102 <package id="VRH.Log4Pro.MultiLanguageManager" version="3.21.3" targetFramework="net461" />
50 103 <package id="VRH.Log4Pro.WebTools" version="1.11.1" targetFramework="net472" />
  104 + <package id="Vrh.Logger" version="2.9.4" targetFramework="net462" />
51 105 <package id="Vrh.Membership" version="4.11.0" targetFramework="net461" />
52 106 <package id="Vrh.Web.Common.Lib" version="2.19.2" targetFramework="net472" />
53 107 <package id="Vrh.Web.FileManager" version="1.5.1" targetFramework="net472" />
... ...
Vrh.Web.iScheduler.Lib/Vrh.Web.iScheduler.Lib.csproj
... ... @@ -46,12 +46,6 @@
46 46 <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
47 47 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
48 48 </Reference>
49   - <Reference Include="Hangfire.Core, Version=1.7.34.0, Culture=neutral, processorArchitecture=MSIL">
50   - <HintPath>..\packages\Hangfire.Core.1.7.34\lib\net46\Hangfire.Core.dll</HintPath>
51   - </Reference>
52   - <Reference Include="Hangfire.SqlServer, Version=1.7.34.0, Culture=neutral, processorArchitecture=MSIL">
53   - <HintPath>..\packages\Hangfire.SqlServer.1.7.34\lib\net45\Hangfire.SqlServer.dll</HintPath>
54   - </Reference>
55 49 <Reference Include="Microsoft.AspNetCore.Hosting, Version=2.2.7.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
56 50 <HintPath>..\packages\Microsoft.AspNetCore.Hosting.2.2.7\lib\netstandard2.0\Microsoft.AspNetCore.Hosting.dll</HintPath>
57 51 </Reference>
... ... @@ -316,7 +310,6 @@
316 310 <Compile Include="Areas\iScheduler\iSchedulerAreaRegistration.cs" />
317 311 <Compile Include="Areas\iScheduler\Models\iSchedulerModel.cs" />
318 312 <Compile Include="Attributes.cs" />
319   - <Compile Include="iSchedulerHangfire.cs" />
320 313 <Compile Include="FullCalendarEvent.cs" />
321 314 <Compile Include="ManagerCols.cs" />
322 315 <Compile Include="StateTrans.cs" />
... ...
Vrh.Web.iScheduler.Lib/iSchedulerHangfire.cs deleted
... ... @@ -1,32 +0,0 @@
1   -using System;
2   -using System.Collections.Generic;
3   -using System.Linq;
4   -using System.Text;
5   -using System.Threading.Tasks;
6   -using Hangfire;
7   -using Vrh.iScheduler;
8   -
9   -namespace Vrh.Web.iScheduler
10   -{
11   - public class iSchedulerHangfire
12   - {
13   - public iSchedulerHangfire(BackgroundJobServer backgroundserver)
14   - {
15   - string ischedulerMonitorXml = "config=ALMiSchedulerMonitor";//TODO:hogy lehet ezt paraméterben átadni??????
16   - string ischedulerXml = ""; // vagy "config=ALMiScheduler;";
17   - var m_xmlp = new iSchedulerXMLProcessor(ischedulerMonitorXml, ischedulerXml);
18   - if (m_xmlp.EnableWebAppExecution && m_xmlp.CheckInterval > 0)
19   - {
20   - string intervalcron = Cron.MinuteInterval((int)(m_xmlp.CheckInterval / 60));//"*/1 * * * *"
21   -
22   - //C:\Windows\system32>%windir%\system32\inetsrv\appcmd set config /section:applicationPools /[name='Log4ProIS'].autoStart:true
23   -
24   - _backgroundJobServer = backgroundserver ?? (new BackgroundJobServer());
25   - BackgroundJob.Enqueue(() => new Monitor(m_xmlp).Examination(null));
26   - //RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor(m_xmlp).Examination(null), intervalcron); //minutes interval
27   - //RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor(m_xmlp).Examination(null), $"{(int)(m_xmlp.CheckInterval / 60)} * * * *"); // cron expression
28   - }
29   - }
30   - private BackgroundJobServer _backgroundJobServer;
31   - }
32   -}
Vrh.Web.iScheduler.Lib/packages.config
... ... @@ -2,9 +2,6 @@
2 2 <packages>
3 3 <package id="Antlr" version="3.5.0.2" targetFramework="net45" />
4 4 <package id="EntityFramework" version="6.4.4" targetFramework="net451" />
5   - <package id="Hangfire" version="1.7.34" targetFramework="net461" />
6   - <package id="Hangfire.Core" version="1.7.34" targetFramework="net461" />
7   - <package id="Hangfire.SqlServer" version="1.7.34" targetFramework="net461" />
8 5 <package id="Microsoft.AspNet.Mvc" version="5.2.9" targetFramework="net461" />
9 6 <package id="Microsoft.AspNet.Providers" version="2.0.0" targetFramework="net451" />
10 7 <package id="Microsoft.AspNet.Providers.Core" version="2.0.0" targetFramework="net451" />
... ...
Vrh.iScheduler/App.config
1   -<?xml version="1.0" encoding="utf-8"?>
  1 +<?xml version="1.0" encoding="utf-8"?>
2 2 <configuration>
3 3 <configSections>
4 4 <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
5   - <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  5 + <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
6 6 </configSections>
7 7 <entityFramework>
8 8 <providers>
9   - <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
  9 + <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
10 10 </providers>
11 11 </entityFramework>
12 12 <appSettings>
13   - <add key="VRH.XmlParser:root" value="~XmlParser.xml"/>
14   - <add key="Vrh.Logger:Config" value="file=~LogConfig.xml"/>
  13 + <add key="VRH.XmlParser:root" value="~XmlParser.xml" />
  14 + <add key="Vrh.Logger:Config" value="file=~LogConfig.xml" />
15 15 </appSettings>
16 16 <runtime>
17 17 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
18 18 <dependentAssembly>
19   - <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
20   - <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0"/>
  19 + <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  20 + <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
21 21 </dependentAssembly>
22 22 <dependentAssembly>
23   - <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
24   - <bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0"/>
  23 + <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  24 + <bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0" />
25 25 </dependentAssembly>
26 26 <dependentAssembly>
27   - <assemblyIdentity name="Microsoft.Web.Infrastructure" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
28   - <bindingRedirect oldVersion="0.0.0.0-2.0.1.0" newVersion="2.0.1.0"/>
  27 + <assemblyIdentity name="Microsoft.Web.Infrastructure" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  28 + <bindingRedirect oldVersion="0.0.0.0-2.0.1.0" newVersion="2.0.1.0" />
29 29 </dependentAssembly>
30 30 <dependentAssembly>
31   - <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
32   - <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
  31 + <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  32 + <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
33 33 </dependentAssembly>
34 34 </assemblyBinding>
35 35 </runtime>
36   -<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup></configuration>
  36 + <startup>
  37 + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
  38 + </startup>
  39 +</configuration>
37 40 \ No newline at end of file
... ...
Vrh.iScheduler/Monitor .cs
... ... @@ -14,11 +14,29 @@ using System.Timers;
14 14 using Vrh.Logger;
15 15 using System.Data.SqlClient;
16 16 using System.Xml.Linq;
17   -
  17 +using Hangfire;
  18 +using Hangfire.Storage;
18 19 namespace Vrh.iScheduler
19 20 {
  21 +
20 22 public class Monitor : IDisposable
21 23 {
  24 + public static void InitHangfire(BackgroundJobServer backgroundserver)
  25 + {
  26 + string ischedulerMonitorXml = "config=ALMiSchedulerMonitor";//TODO:hogy lehet ezt paraméterben átadni??????
  27 + string ischedulerXml = ""; // vagy "config=ALMiScheduler;";
  28 + var m_xmlp = new iSchedulerXMLProcessor(ischedulerMonitorXml, ischedulerXml);
  29 + Monitor.SetiSchedulerCommonXMLProcessor(m_xmlp);
  30 + if (m_xmlp.EnableWebAppExecution && m_xmlp.CheckInterval > 0)
  31 + {
  32 + string intervalcron = Cron.MinuteInterval((int)(m_xmlp.CheckInterval / 60));//"*/1 * * * *"
  33 + //RecurringJob.RemoveIfExists("ischedulermonitorcycle");
  34 + RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor().Examination(null), intervalcron);
  35 + //var HanfireJobId = BackgroundJob.Enqueue(() => new Monitor().Examination(null));
  36 + //RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor(m_xmlp).Examination(null), intervalcron); //minutes interval
  37 + //RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor(m_xmlp).Examination(null), $"{(int)(m_xmlp.CheckInterval / 60)} * * * *"); // cron expression
  38 + }
  39 + }
22 40 #region Enums
23 41 /// <summary>
24 42 /// Ütemezések lehetséges állapotai.
... ... @@ -46,7 +64,11 @@ namespace Vrh.iScheduler
46 64  
47 65 private Timer m_timer;
48 66 private iSchedulerXMLProcessor m_xmlp;
49   -
  67 + private static iSchedulerXMLProcessor CommonM_xmlp;
  68 + public static void SetiSchedulerCommonXMLProcessor(iSchedulerXMLProcessor m_xmlp)
  69 + {
  70 + CommonM_xmlp = m_xmlp;
  71 + }
50 72 #endregion Privates
51 73  
52 74 #region Constructor
... ... @@ -60,19 +82,22 @@ namespace Vrh.iScheduler
60 82 /// a távoli gépen. Ha egy gépen fut, akkor nem kötelező.</param>
61 83 public Monitor(string scheduleMonitorXmlPath, string scheduleXmlPath)
62 84 {
63   - m_xmlp = new iSchedulerXMLProcessor(scheduleMonitorXmlPath, scheduleXmlPath);
64   - Init(m_xmlp);
  85 + Init(new iSchedulerXMLProcessor(scheduleMonitorXmlPath, scheduleXmlPath));
65 86 }
66 87 public Monitor(iSchedulerXMLProcessor m_xmlp)
67 88 {
68 89 Init(m_xmlp);
69 90 }
  91 + public Monitor()
  92 + {
  93 + Init(CommonM_xmlp);
  94 + }
70 95 private void Init(iSchedulerXMLProcessor m_xmlp)
71 96 {
  97 + this.m_xmlp = m_xmlp;
72 98 //try
73 99 //{
74   - m_timer = new Timer(m_xmlp.CheckInterval * 1000); // !!! Ez itt a jó sor !!!
75   - // m_timer = new Timer(20000); // !!! Ez meg itt a debug !!!
  100 + m_timer = new Timer(m_xmlp.CheckInterval * 1000); // !!! Ez itt a jó sor !!! m_timer = new Timer(20000); meg a debug !!!
76 101 m_timer.Elapsed += OnExamination;
77 102  
78 103 var le = new DCLogEntry(LogLevel.Debug, nameof(Monitor) + " constructor. Preparation ready.");
... ... @@ -118,6 +143,7 @@ namespace Vrh.iScheduler
118 143 /// Időzített események megkeresése, és végrehajtása.
119 144 /// </summary>
120 145 /// <param name="signalTime"></param>
  146 + [DisableConcurrentExecution(1000)]
121 147 public void Examination(DateTime? signalTime)
122 148 {
123 149 var le = new DCLogEntry(LogLevel.Debug,nameof(Examination));
... ...
Vrh.iScheduler/Vrh.iScheduler.csproj
... ... @@ -41,6 +41,18 @@
41 41 <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
42 42 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
43 43 </Reference>
  44 + <Reference Include="Hangfire.Core, Version=1.8.0.0, Culture=neutral, processorArchitecture=MSIL">
  45 + <HintPath>..\packages\Hangfire.Core.1.8.0-rc4\lib\net46\Hangfire.Core.dll</HintPath>
  46 + </Reference>
  47 + <Reference Include="Hangfire.SqlServer, Version=1.8.0.0, Culture=neutral, processorArchitecture=MSIL">
  48 + <HintPath>..\packages\Hangfire.SqlServer.1.8.0-rc4\lib\net451\Hangfire.SqlServer.dll</HintPath>
  49 + </Reference>
  50 + <Reference Include="Microsoft.Owin, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  51 + <HintPath>..\packages\Microsoft.Owin.3.0.0\lib\net45\Microsoft.Owin.dll</HintPath>
  52 + </Reference>
  53 + <Reference Include="Microsoft.Owin.Host.SystemWeb, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  54 + <HintPath>..\packages\Microsoft.Owin.Host.SystemWeb.3.0.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll</HintPath>
  55 + </Reference>
44 56 <Reference Include="Microsoft.ReportViewer.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
45 57 <HintPath>..\packages\Microsoft.Report.Viewer.11.0.0.0\lib\net\Microsoft.ReportViewer.Common.dll</HintPath>
46 58 </Reference>
... ... @@ -59,6 +71,9 @@
59 71 <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
60 72 <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
61 73 </Reference>
  74 + <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
  75 + <HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
  76 + </Reference>
62 77 <Reference Include="PagedList, Version=1.17.0.0, Culture=neutral, PublicKeyToken=abbb863e9397c5e1, processorArchitecture=MSIL">
63 78 <HintPath>..\packages\PagedList.1.17.0.0\lib\net40\PagedList.dll</HintPath>
64 79 </Reference>
... ... @@ -109,8 +124,8 @@
109 124 <Reference Include="VRH.Log4Pro.MultiLanguageManager, Version=3.21.3.0, Culture=neutral, processorArchitecture=MSIL">
110 125 <HintPath>..\packages\VRH.Log4Pro.MultiLanguageManager.3.21.3\lib\net45\VRH.Log4Pro.MultiLanguageManager.dll</HintPath>
111 126 </Reference>
112   - <Reference Include="Vrh.Logger, Version=2.9.3.0, Culture=neutral, processorArchitecture=MSIL">
113   - <HintPath>..\packages\Vrh.Logger.2.9.3\lib\net451\Vrh.Logger.dll</HintPath>
  127 + <Reference Include="Vrh.Logger, Version=2.9.4.0, Culture=neutral, processorArchitecture=MSIL">
  128 + <HintPath>..\packages\Vrh.Logger.2.9.4\lib\net451\Vrh.Logger.dll</HintPath>
114 129 </Reference>
115 130 <Reference Include="Vrh.Membership, Version=4.11.0.0, Culture=neutral, processorArchitecture=MSIL">
116 131 <HintPath>..\packages\Vrh.Membership.4.11.0\lib\net451\Vrh.Membership.dll</HintPath>
... ...
Vrh.iScheduler/packages.config
1 1 <?xml version="1.0" encoding="utf-8"?>
2 2 <packages>
3 3 <package id="EntityFramework" version="6.4.4" targetFramework="net451" />
  4 + <package id="Hangfire" version="1.8.0-rc4" targetFramework="net462" />
  5 + <package id="Hangfire.Core" version="1.8.0-rc4" targetFramework="net462" />
  6 + <package id="Hangfire.SqlServer" version="1.8.0-rc4" targetFramework="net462" />
4 7 <package id="Microsoft.AspNet.Mvc" version="5.2.9" targetFramework="net451" />
5 8 <package id="Microsoft.AspNet.Providers" version="2.0.0" targetFramework="net451" />
6 9 <package id="Microsoft.AspNet.Providers.Core" version="2.0.0" targetFramework="net451" />
7 10 <package id="Microsoft.AspNet.Razor" version="3.2.9" targetFramework="net451" />
8 11 <package id="Microsoft.AspNet.WebPages" version="3.2.9" targetFramework="net451" />
  12 + <package id="Microsoft.Owin" version="3.0.0" targetFramework="net462" />
  13 + <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.0" targetFramework="net462" />
9 14 <package id="Microsoft.Report.Viewer" version="11.0.0.0" targetFramework="net451" />
10 15 <package id="Microsoft.SqlServer.Types" version="11.0.0" targetFramework="net451" />
11 16 <package id="Microsoft.Web.Infrastructure" version="2.0.1" targetFramework="net451" />
12 17 <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net451" />
  18 + <package id="Owin" version="1.0" targetFramework="net462" />
13 19 <package id="PagedList" version="1.17.0.0" targetFramework="net451" />
14 20 <package id="PagedList.Mvc" version="4.5.0.0" targetFramework="net451" />
15 21 <package id="VRH.Common" version="3.0.0" targetFramework="net451" />
16 22 <package id="VRH.Log4Pro.MultiLanguageManager" version="3.21.3" targetFramework="net451" />
17   - <package id="Vrh.Logger" version="2.9.3" targetFramework="net451" />
  23 + <package id="Vrh.Logger" version="2.9.4" targetFramework="net462" />
18 24 <package id="Vrh.Membership" version="4.11.0" targetFramework="net451" />
19 25 <package id="VRH.Web.Providers" version="2.0.2" targetFramework="net451" requireReinstallation="true" />
20 26 <package id="Vrh.XmlProcessing" version="1.31.1" targetFramework="net451" />
... ...
iSchedulerMonitor/App.config
1   -<?xml version="1.0" encoding="utf-8"?>
  1 +<?xml version="1.0" encoding="utf-8"?>
2 2 <configuration>
3 3 <configSections>
4 4 <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
5   - <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  5 + <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
6 6 </configSections>
7 7 <entityFramework>
8   - <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
  8 + <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
9 9 <providers>
10   - <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
  10 + <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
11 11 </providers>
12 12 </entityFramework>
13 13 <runtime>
14 14 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
15 15 <dependentAssembly>
16   - <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
17   - <bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0"/>
  16 + <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  17 + <bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0" />
18 18 </dependentAssembly>
19 19 <dependentAssembly>
20   - <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
21   - <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0"/>
  20 + <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  21 + <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
22 22 </dependentAssembly>
23 23 <dependentAssembly>
24   - <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
25   - <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930"/>
  24 + <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  25 + <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
26 26 </dependentAssembly>
27 27 <dependentAssembly>
28   - <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" culture="neutral"/>
29   - <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2"/>
  28 + <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" culture="neutral" />
  29 + <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
30 30 </dependentAssembly>
31 31 <dependentAssembly>
32   - <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
33   - <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
  32 + <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  33 + <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
34 34 </dependentAssembly>
35 35 <dependentAssembly>
36   - <assemblyIdentity name="Microsoft.Web.Infrastructure" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
37   - <bindingRedirect oldVersion="0.0.0.0-2.0.1.0" newVersion="2.0.1.0"/>
  36 + <assemblyIdentity name="Microsoft.Web.Infrastructure" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  37 + <bindingRedirect oldVersion="0.0.0.0-2.0.1.0" newVersion="2.0.1.0" />
38 38 </dependentAssembly>
39 39 </assemblyBinding>
40 40 </runtime>
41 41 <startup>
42   - <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
  42 + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
43 43 </startup>
44 44 <appSettings>
45   - <add key="VRH.XmlParser:root" value="~XmlParser.xml"/>
46   - <add key="Vrh.Logger:Config" value="file=~LogConfig.xml"/>
47   - <add key="Vrh.ApplicationContainer:ConfigurationFile" value="file=~Plugins.Config.xml"/>
48   - <add key="Vrh.ApplicationContainer.InstanceFactory.FromXML:ConfigurationFile" value="file=~Plugins.Config.xml"/>
  45 + <add key="VRH.XmlParser:root" value="~XmlParser.xml" />
  46 + <add key="Vrh.Logger:Config" value="file=~LogConfig.xml" />
  47 + <add key="Vrh.ApplicationContainer:ConfigurationFile" value="file=~Plugins.Config.xml" />
  48 + <add key="Vrh.ApplicationContainer.InstanceFactory.FromXML:ConfigurationFile" value="file=~Plugins.Config.xml" />
49 49 </appSettings>
50 50 -</configuration>
  51 +</configuration>
51 52 \ No newline at end of file
... ...
iSchedulerMonitor/iSchedulerMonitor.ACPlugin.csproj
... ... @@ -118,8 +118,8 @@
118 118 <Reference Include="VRH.Log4Pro.MultiLanguageManager, Version=3.21.3.0, Culture=neutral, processorArchitecture=MSIL">
119 119 <HintPath>..\packages\VRH.Log4Pro.MultiLanguageManager.3.21.3\lib\net45\VRH.Log4Pro.MultiLanguageManager.dll</HintPath>
120 120 </Reference>
121   - <Reference Include="Vrh.Logger, Version=2.9.3.0, Culture=neutral, processorArchitecture=MSIL">
122   - <HintPath>..\packages\Vrh.Logger.2.9.3\lib\net451\Vrh.Logger.dll</HintPath>
  121 + <Reference Include="Vrh.Logger, Version=2.9.4.0, Culture=neutral, processorArchitecture=MSIL">
  122 + <HintPath>..\packages\Vrh.Logger.2.9.4\lib\net451\Vrh.Logger.dll</HintPath>
123 123 </Reference>
124 124 <Reference Include="Vrh.Membership, Version=4.11.0.0, Culture=neutral, processorArchitecture=MSIL">
125 125 <HintPath>..\packages\Vrh.Membership.4.11.0\lib\net451\Vrh.Membership.dll</HintPath>
... ... @@ -159,10 +159,10 @@
159 159 <None Include="XmlParser.xml">
160 160 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
161 161 </None>
162   - <None Include="LogConfig.xml">
  162 + <None Include="ApplicationContainer.Config.xml">
163 163 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
164 164 </None>
165   - <None Include="ApplicationContainer.Config.xml">
  165 + <None Include="LogConfig.xml">
166 166 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
167 167 </None>
168 168 <Content Include="SqlServerTypes\x64\SqlServerSpatial110.dll" />
... ...
iSchedulerMonitor/packages.config
... ... @@ -16,7 +16,7 @@
16 16 <package id="Vrh.ApplicationContainer.Control.Contract" version="0.1.0" targetFramework="net451" />
17 17 <package id="VRH.Common" version="3.0.0" targetFramework="net451" />
18 18 <package id="VRH.Log4Pro.MultiLanguageManager" version="3.21.3" targetFramework="net451" />
19   - <package id="Vrh.Logger" version="2.9.3" targetFramework="net451" />
  19 + <package id="Vrh.Logger" version="2.9.4" targetFramework="net462" />
20 20 <package id="Vrh.Membership" version="4.11.0" targetFramework="net451" />
21 21 <package id="VRH.Mockable.TimeProvider" version="1.0.0" targetFramework="net45" />
22 22 <package id="VRH.Web.Providers" version="2.0.2" targetFramework="net451" requireReinstallation="true" />
... ...